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 53 74 61 74 69 63 20 64 61 ./*. * Static da
07b0: 74 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a ta structures. *
07c0: 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 /..#ifndef OPENS
07d0: 53 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64 SL_NO_DH.#includ
07e0: 65 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a e "dh_params.h".
07f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 #endif../*. * Th
0800: 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f read-Safe TLS Co
0810: 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 de. */..#ifdef T
0820: 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 CL_THREADS.#defi
0830: 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ne OPENSSL_THREA
0840: 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 D_DEFINES.#inclu
0850: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e de <openssl/open
0860: 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 sslconf.h>..#ifd
0870: 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 ef OPENSSL_THREA
0880: 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 DS.#include <ope
0890: 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 nssl/crypto.h>.#
08a0: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c include <openssl
08b0: 2f 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 /ssl.h>../*. * T
08c0: 68 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f hreaded operatio
08d0: 6e 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 n requires locki
08e0: 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 ng callbacks. *
08f0: 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 Based from /cryp
0900: 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 to/cryptlib.c of
0910: 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f OpenSSL and NSO
0920: 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 penSSL.. */..sta
0930: 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c tic Tcl_Mutex *l
0940: 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 ocks = NULL;.sta
0950: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 tic int locksCou
0960: 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 nt = 0;.static T
0970: 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 cl_Mutex init_mx
0980: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e ;.#endif /* OPEN
0990: 53 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 SSL_THREADS */.#
09a0: 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 endif /* TCL_THR
09b0: 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a EADS */..../****
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
09d0: 2f 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 /./* Callbacks
09e0: 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a */./******
09f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
0a00: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
0a50: 45 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f Eval Callback Co
0a60: 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 mmand --. *. *.E
0a70: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
0a80: 6d 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 mand and catch a
0a90: 6e 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 ny errors. *. *
0aa0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 Results:. *.0 =
0ab0: 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 Command returned
0ac0: 20 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 fail or eval re
0ad0: 74 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 turned TCL_ERROR
0ae0: 0a 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 . *.1 = Command
0af0: 72 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 returned success
0b00: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 or eval returne
0b10: 64 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 d TCL_OK. *. * S
0b20: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
0b30: 45 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 Evaluates callba
0b40: 63 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a ck command. *. *
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b90: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
0ba0: 6e 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 nt.EvalCallback(
0bb0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
0bc0: 72 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 rp, State *state
0bd0: 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d Ptr, Tcl_Obj *cm
0be0: 64 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 dPtr) {. int
0bf0: 63 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 code, ok = 0;..
0c00: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 Tcl_Preserve(
0c10: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 (ClientData) int
0c20: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 erp);. Tcl_Pr
0c30: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 eserve((ClientDa
0c40: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a ta) statePtr);..
0c50: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
0c60: 62 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73 back with succes
0c70: 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75 s for ok or retu
0c80: 72 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c rn value 1, fail
0c90: 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65 for error or re
0ca0: 74 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a turn value 0 */.
0cb0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 Tcl_ResetRes
0cc0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 ult(interp);.
0cd0: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c code = Tcl_Eval
0ce0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d ObjEx(interp, cm
0cf0: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 dPtr, TCL_EVAL_G
0d00: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 LOBAL);. if (
0d10: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 code == TCL_OK)
0d20: 7b 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 {../* Check resu
0d30: 6c 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 lt for return va
0d40: 6c 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 lue */..Tcl_Obj
0d50: 2a 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 *result = Tcl_Ge
0d60: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
0d70: 70 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 p);..if (result
0d80: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 == NULL || Tcl_G
0d90: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 etIntFromObj(int
0da0: 65 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b erp, result, &ok
0db0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
0dc0: 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20 ok = 1;..}.
0dd0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 } else {../*
0de0: 45 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 Error - reject t
0df0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 2a he certificate *
0e00: 2f 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 /.#if (TCL_MAJOR
0e10: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 _VERSION == 8) &
0e20: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 & (TCL_MINOR_VER
0e30: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 SION < 6)..Tcl_B
0e40: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 ackgroundError(i
0e50: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 nterp);.#else..T
0e60: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 cl_BackgroundExc
0e70: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 eption(interp, c
0e80: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 ode);.#endif.
0e90: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 }.. Tcl_Rele
0ea0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 ase((ClientData)
0eb0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
0ec0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 Tcl_Release((Cli
0ed0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 entData) interp)
0ee0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b ;. return ok;
0ef0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a -------------. *
0f40: 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b . * InfoCallback
0f50: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f --. *. *.Monito
0f60: 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f rs SSL connectio
0f70: 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 n process. *. *
0f80: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
0f90: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
0fa0: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 cts:. *.Calls ca
0fb0: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e llback (if defin
0fc0: 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ed). *. *-------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f ------------. */
1010: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 .static void.Inf
1020: 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 oCallback(const
1030: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 SSL *ssl, int wh
1040: 65 72 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a ere, int ret) {.
1050: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
1060: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 Ptr = (State*)SS
1070: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 L_get_app_data((
1080: 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 SSL *)ssl);.
1090: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
10a0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 rp.= statePtr->i
10b0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f nterp;. Tcl_O
10c0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
10d0: 63 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 char *major; cha
10e0: 72 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 r *minor;.. d
10f0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
1100: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
1110: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d Ptr->callback ==
1120: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
1130: 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 ..return;.. i
1140: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 f (where & SSL_C
1150: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 B_HANDSHAKE_STAR
1160: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 T) {..major = "h
1170: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f andshake";..mino
1180: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 r = "start";.
1190: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 } else if (wher
11a0: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 e & SSL_CB_HANDS
11b0: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 HAKE_DONE) {..ma
11c0: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 jor = "handshake
11d0: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e ";..minor = "don
11e0: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e";. } else {
11f0: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 ..if (where & SS
1200: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a L_CB_ALERT)..maj
1210: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 or = "alert";..e
1220: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
1230: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 SSL_ST_CONNECT).
1240: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 major = "connect
1250: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 ";..else if (whe
1260: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 re & SSL_ST_ACCE
1270: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 PT)..major = "ac
1280: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 cept";..else....
1290: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 .major = "unknow
12a0: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 n";...if (where
12b0: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 & SSL_CB_READ)..
12c0: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a minor = "read";.
12d0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
12e0: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 & SSL_CB_WRITE).
12f0: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 .minor = "write"
1300: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1310: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 e & SSL_CB_LOOP)
1320: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 ..minor = "loop"
1330: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 ;..else if (wher
1340: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 e & SSL_CB_EXIT)
1350: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 ..minor = "exit"
1360: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f ;..else.....mino
1370: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 r = "unknown";.
1380: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
1390: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
13a0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 val */. cmdPt
13b0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
13c0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
13d0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 allback);. Tc
13e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
13f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
1400: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
1410: 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 ringObj("info",
1420: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
1430: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
1440: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1450: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
1460: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
1470: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
1480: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
1490: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
14a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
14b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
14c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
14d0: 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 (major, -1));.
14e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
14f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1500: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
1510: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f ewStringObj(mino
1520: 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 r, -1));.. if
1530: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 (where & SSL_CB
1540: 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c _ALERT) {..Tcl_L
1550: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1560: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1570: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
1580: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c StringObj(SSL_al
1590: 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f ert_desc_string_
15a0: 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b long(ret), -1));
15b0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
15c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
15d0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
15e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
15f0: 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f (SSL_alert_type_
1600: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 string_long(ret)
1610: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c , -1));. } el
1620: 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 se {..Tcl_ListOb
1630: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
1640: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
1650: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
1660: 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 gObj(SSL_state_s
1670: 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c tring_long(ssl),
1680: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 -1));..Tcl_List
1690: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
16a0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
16b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
16c0: 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a j("info", -1));.
16d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 }.. /* Ev
16e0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d al callback comm
16f0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 and */. Tcl_I
1700: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 ncrRefCount(cmdP
1710: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c tr);. EvalCal
1720: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
1730: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b atePtr, cmdPtr);
1740: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
1750: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d Count(cmdPtr);.}
1760: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 -----------. *.
17b0: 2a 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 * MessageCallbac
17c0: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 k --. *. *.Monit
17d0: 6f 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c ors SSL protocol
17e0: 20 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 messages. *. *
17f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
1800: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
1810: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 cts:. *.Calls ca
1820: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e llback (if defin
1830: 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ed). *. *-------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f ------------. */
1880: 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c .#ifndef OPENSSL
1890: 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 _NO_SSL_TRACE.st
18a0: 61 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 atic void.Messag
18b0: 65 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 eCallback(int wr
18c0: 69 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 ite_p, int versi
18d0: 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f on, int content_
18e0: 74 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 type, const void
18f0: 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 *buf, size_t le
1900: 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 n, SSL *ssl, voi
1910: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
1920: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
1930: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 (State*)arg;.
1940: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
1950: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
1960: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
1970: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
1980: 20 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 char *ver, *typ
1990: 65 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b e;. BIO *bio;
19a0: 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 . char buffer
19b0: 5b 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 [15000];. buf
19c0: 66 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 fer[0] = 0;..
19d0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
19e0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
19f0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
1a00: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
1a10: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 L)..return;..
1a20: 20 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29 switch(version)
1a30: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 {.#if OPENSSL_V
1a40: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
1a50: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 0x10100000L && !
1a60: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 defined(NO_SSL2)
1a70: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
1a80: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 NSSL_NO_SSL2).
1a90: 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53 case SSL2_VERS
1aa0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c ION:..ver = "SSL
1ab0: 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e v2";..break;.#en
1ac0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 dif.#if !defined
1ad0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 (NO_SSL3) && !de
1ae0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
1af0: 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20 _SSL3). case
1b00: 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 SSL3_VERSION:..v
1b10: 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 er = "SSLv3";..b
1b20: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 reak;.#endif.
1b30: 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49 case TLS1_VERSI
1b40: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 ON:..ver = "TLSv
1b50: 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 1";..break;.
1b60: 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 case TLS1_1_VERS
1b70: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 ION:..ver = "TLS
1b80: 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 v1.1";..break;.
1b90: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 case TLS1_2_V
1ba0: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 ERSION:..ver = "
1bb0: 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b TLSv1.2";..break
1bc0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f ;. case TLS1_
1bd0: 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3_VERSION:..ver
1be0: 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 = "TLSv1.3";..br
1bf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a eak;. case 0:
1c00: 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a ..ver = "none";.
1c10: 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 .break;. defa
1c20: 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b ult:..ver = "unk
1c30: 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 nown";..break;.
1c40: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 }.. switch
1c50: 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 (content_type)
1c60: 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f {. case SSL3_
1c70: 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65 RT_HEADER:..type
1c80: 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72 = "Header";..br
1c90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 eak;. case SS
1ca0: 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 L3_RT_INNER_CONT
1cb0: 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 ENT_TYPE:..type
1cc0: 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 = "Inner Content
1cd0: 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a Type";..break;.
1ce0: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 case SSL3_RT
1cf0: 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 _CHANGE_CIPHER_S
1d00: 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 PEC:..type = "Ch
1d10: 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62 ange Cipher";..b
1d20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 reak;. case S
1d30: 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 SL3_RT_ALERT:..t
1d40: 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 ype = "Alert";..
1d50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1d60: 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b SSL3_RT_HANDSHAK
1d70: 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64 E:..type = "Hand
1d80: 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a shake";..break;.
1d90: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 case SSL3_RT
1da0: 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 _APPLICATION_DAT
1db0: 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20 A:..type = "App
1dc0: 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 Data";..break;.
1dd0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54 case DTLS1_RT
1de0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70 _HEARTBEAT:..typ
1df0: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b e = "Heartbeat";
1e00: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 ..break;. def
1e10: 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 ault:..type = "u
1e20: 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a nknown";. }..
1e30: 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d /* Needs com
1e40: 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e pile time option
1e50: 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 "enable-ssl-tra
1e60: 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 ce". */. if (
1e70: 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 (bio = BIO_new(B
1e80: 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 IO_s_mem())) !=
1e90: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a NULL) {..int n;.
1ea0: 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65 .SSL_trace(write
1eb0: 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e _p, version, con
1ec0: 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 tent_type, buf,
1ed0: 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 len, ssl, (void
1ee0: 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f *)bio);..n = BIO
1ef0: 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65 _read(bio, buffe
1f00: 72 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69 r, min(BIO_pendi
1f10: 6e 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29 ng(bio), 14999))
1f20: 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30 ;..n = (n<0) ? 0
1f30: 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d : n;..buffer[n]
1f40: 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f = 0;..(void)BIO
1f50: 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49 _flush(bio);..BI
1f60: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20 O_free(bio);.
1f70: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
1f80: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c command to eval
1f90: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d */. cmdPtr =
1fa0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
1fb0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c j(statePtr->call
1fc0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c back);. Tcl_L
1fd0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
1fe0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
1ff0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
2000: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 gObj("message",
2010: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2020: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2030: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2040: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
2050: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
2060: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
2070: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
2080: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
2090: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
20a0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
20b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
20c0: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 (write_p ? "Sent
20d0: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 " : "Received",
20e0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
20f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2100: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2110: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2120: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 Obj(ver, -1));.
2130: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2140: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2150: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
2160: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 NewStringObj(typ
2170: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c e, -1));. Tcl
2180: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2190: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
21a0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
21b0: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d ingObj(buffer, -
21c0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 1));.. /* Eva
21d0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
21e0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
21f0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
2200: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c r);. EvalCall
2210: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 back(interp, sta
2220: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a tePtr, cmdPtr);.
2230: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
2240: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a ount(cmdPtr);.}.
2250: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d #endif.../*. *--
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22a0: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 -. *. * VerifyCa
22b0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 llback --. *. *.
22c0: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 Monitors SSL cer
22d0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 tificate validat
22e0: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 ion process. Use
22f0: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 d to control the
2300: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 . *.behavior whe
2310: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 n the SSL_VERIFY
2320: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 _PEER flag is se
2330: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 t. This is calle
2340: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 d. *.whenever a
2350: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 certificate is i
2360: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 nspected or deci
2370: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c ded invalid. Cal
2380: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 led for. *.each
2390: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 certificate in t
23a0: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 he cert chain..
23b0: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 *. * Checks:. *.
23c0: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69 certificate chai
23d0: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61 n is checked sta
23e0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64 rting with the d
23f0: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c eepest nesting l
2400: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72 evel. *. (the r
2410: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61 oot CA certifica
2420: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75 te) and worked u
2430: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65 pward to the pee
2440: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e r's certificate.
2450: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72 . *.All signatur
2460: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75 es are valid, cu
2470: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69 rrent time is wi
2480: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c thin first and l
2490: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d ast validity tim
24a0: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74 e.. *.Check that
24b0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
24c0: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68 is issued by th
24d0: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69 e issuer certifi
24e0: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09 cate issuer.. *.
24f0: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61 Check the revoca
2500: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20 tion status for
2510: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 each certificate
2520: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76 .. *.Check the v
2530: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67 alidity of the g
2540: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65 iven CRL and the
2550: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e cert revocation
2560: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63 status.. *.Chec
2570: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f k the policies o
2580: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66 f all the certif
2590: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67 icates. *. * Arg
25a0: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f s. *.preverify_o
25b0: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 k indicates whet
25c0: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63 her the certific
25d0: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e ate verification
25e0: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e passed (1) or n
25f0: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73 ot (0). *. * Res
2600: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62 ults:. *.A callb
2610: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 ack bound to the
2620: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75 socket may retu
2630: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20 rn one of:. *.
2640: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74 0...- the cert
2650: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 ificate is deeme
2660: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20 d invalid, send
2670: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09 verification. *.
2680: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65 ... failure ale
2690: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20 rt to peer, and
26a0: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68 terminate handsh
26b0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09 ake.. *. 1...
26c0: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 - the certificat
26d0: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69 e is deemed vali
26e0: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 d, continue with
26f0: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 handshake.. *.
2700: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 empty string.
2710: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 - no change to c
2720: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 ertificate valid
2730: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 ation. *. * Side
2740: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 effects:. *.The
2750: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 err field of th
2760: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 e currently oper
2770: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 ative State is s
2780: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 et. *. to a str
2790: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 ing describing t
27a0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 he SSL negotiati
27b0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f on failure reaso
27c0: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d n. *. *---------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
2810: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 tatic int.Verify
2820: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c Callback(int ok,
2830: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 X509_STORE_CTX
2840: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f *ctx) {. Tcl_
2850: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
2860: 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 SSL *ssl..= (
2870: 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f SSL*)X509_STORE_
2880: 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 CTX_get_ex_data(
2890: 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f ctx, SSL_get_ex_
28a0: 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f data_X509_STORE_
28b0: 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 CTX_idx());.
28c0: 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 X509 *cert..= X
28d0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 509_STORE_CTX_ge
28e0: 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 t_current_cert(c
28f0: 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a tx);. State *
2900: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 statePtr.= (Stat
2910: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 e*)SSL_get_app_d
2920: 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 ata(ssl);. Tc
2930: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
2940: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
2950: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 erp;. int dep
2960: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 th..= X509_STORE
2970: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 _CTX_get_error_d
2980: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 epth(ctx);. i
2990: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 nt err..= X509_S
29a0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 TORE_CTX_get_err
29b0: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 or(ctx);.. dp
29c0: 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25 rintf("Verify: %
29d0: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 d", ok);.. if
29e0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 (statePtr->vcmd
29f0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 == (Tcl_Obj*)NU
2a00: 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65 LL) {..if (state
2a10: 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 Ptr->vflags & SS
2a20: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
2a30: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b _NO_PEER_CERT) {
2a40: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b .. return ok;
2a50: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
2a60: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 return 1;..}.
2a70: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 } else if (cert
2a80: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 == NULL || ssl
2a90: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
2aa0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 rn 0;. }..
2ab0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
2ac0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
2ad0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
2ae0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
2af0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
2b00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
2b10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
2b20: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
2b30: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 wStringObj("veri
2b40: 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 fy", -1));. T
2b50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2b60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2b70: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 cmdPtr,..Tcl_New
2b80: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
2b90: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
2ba0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
2bb0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2bc0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2bd0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2be0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 Tcl_NewIntObj(d
2bf0: 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f epth));. Tcl_
2c00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
2c10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
2c20: 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 Ptr, Tls_NewX509
2c30: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 Obj(interp, cert
2c40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
2c50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2c60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
2c70: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f Tcl_NewIntObj(o
2c80: 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 k));. Tcl_Lis
2c90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2ca0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2cb0: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ,..Tcl_NewString
2cc0: 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f Obj((char*)X509_
2cd0: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f verify_cert_erro
2ce0: 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d r_string(err), -
2cf0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 1));.. /* Pre
2d00: 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 vent I/O while c
2d10: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 allback is in pr
2d20: 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a ogress */. /*
2d30: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
2d40: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c |= TLS_TCL_CALL
2d50: 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a BACK; */.. /*
2d60: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
2d70: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
2d80: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
2d90: 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d mdPtr);. ok =
2da0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e EvalCallback(in
2db0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
2dc0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c cmdPtr);. Tcl
2dd0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
2de0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 dPtr);.. /* s
2df0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
2e00: 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c = ~(TLS_TCL_CALL
2e10: 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 BACK); */. re
2e20: 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 turn(ok);./* By
2e30: 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 default, leave v
2e40: 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 erification unch
2e50: 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a anged. */.}.../*
2e60: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ea0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
2eb0: 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 _Error --. *. *.
2ec0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 Calls callback w
2ed0: 69 74 68 20 6c 69 73 74 20 6f 66 20 65 72 72 6f ith list of erro
2ee0: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 rs.. *. * Side e
2ef0: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 ffects:. *.The e
2f00: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 rr field of the
2f10: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 currently operat
2f20: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 ive State is set
2f30: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e . *. to a strin
2f40: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 g describing the
2f50: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e SSL negotiation
2f60: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a failure reason.
2f70: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
2f80: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
2fc0: 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 d.Tls_Error(Stat
2fd0: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 e *statePtr, cha
2fe0: 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 r *msg) {. Tc
2ff0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
3000: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
3010: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
3020: 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 *cmdPtr, *listP
3030: 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 tr;. unsigned
3040: 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 long err;. s
3050: 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d tatePtr->err = m
3060: 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 sg;.. dprintf
3070: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
3080: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
3090: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f allback == (Tcl_
30a0: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 Obj*)NULL)..retu
30b0: 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 rn;.. /* Crea
30c0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 te command to ev
30d0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 al */. cmdPtr
30e0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 = Tcl_Duplicate
30f0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 Obj(statePtr->ca
3100: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c llback);. Tcl
3110: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3120: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
3130: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
3140: 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 ingObj("error",
3150: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
3160: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
3170: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
3180: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 r,.. Tcl_NewS
3190: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 tringObj(Tcl_Get
31a0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 ChannelName(stat
31b0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 ePtr->self), -1)
31c0: 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 );. if (msg !
31d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c = NULL) {..Tcl_L
31e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
31f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3200: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
3210: 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a gObj(msg, -1));.
3220: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
3230: 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 (msg = Tcl_GetSt
3240: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f ringFromObj(Tcl_
3250: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 GetObjResult(int
3260: 65 72 70 29 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 erp), NULL)) !=
3270: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 NULL) {..Tcl_Lis
3280: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
3290: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
32a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
32b0: 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 bj(msg, -1));..
32c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 } else {..lis
32d0: 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tPtr = Tcl_NewLi
32e0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
32f0: 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45 .while ((err = E
3300: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20 RR_get_error())
3310: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c != 0) {.. Tcl
3320: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
3330: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
3340: 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 stPtr, Tcl_NewSt
3350: 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 ringObj(ERR_reas
3360: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 on_error_string(
3370: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 err), -1));..}..
3380: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
3390: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
33a0: 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72 cmdPtr, listPtr
33b0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
33c0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 Eval callback c
33d0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 ommand */. Tc
33e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 l_IncrRefCount(c
33f0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c mdPtr);. Eval
3400: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c Callback(interp,
3410: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 statePtr, cmdPt
3420: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 r);. Tcl_Decr
3430: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
3440: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3490: 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 *. * KeyLogCallb
34a0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 ack --. *. *.Wri
34b0: 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20 te received key
34c0: 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 data to log file
34d0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
34e0: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ects:. *.none. *
34f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3530: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
3540: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 KeyLogCallback(c
3550: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 onst SSL *ssl, c
3560: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 onst char *line)
3570: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 {. char *str
3580: 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 = getenv(SSLKEY
3590: 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 LOGFILE);. FI
35a0: 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 LE *fd;.. dpr
35b0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
35c0: 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a . if (str) {.
35d0: 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c .fd = fopen(str,
35e0: 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 "a");..fprintf(
35f0: 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 fd, "%s\n",line)
3600: 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 ;..fclose(fd);.
3610: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d }.}.../*. *--
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 -. *. * Password
3670: 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a Callback --. *.
3680: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 *.Called when a
3690: 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20 password for a
36a0: 70 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64 private key load
36b0: 69 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45 ing/storing a PE
36c0: 4d 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65 M. *.certificate
36d0: 20 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e with encryption
36e0: 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b . Evals callback
36f0: 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 script and retu
3700: 72 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c rns. *.the resul
3710: 74 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 t as the passwor
3720: 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e d string in buf.
3730: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
3740: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 *.None. *. * Si
3750: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
3760: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 alls callback (i
3770: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a f defined). *. *
3780: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 Returns:. *.Pas
3790: 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 sword size in by
37a0: 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e tes or -1 for an
37b0: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d error.. *. *---
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3800: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
3810: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b PasswordCallback
3820: 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 (char *buf, int
3830: 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 size, int rwflag
3840: 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b , void *udata) {
3850: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
3860: 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 ePtr.= (State *)
3870: 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f udata;. Tcl_
3880: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d Interp *interp.=
3890: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
38a0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p;. Tcl_Obj *
38b0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 cmdPtr;. int
38c0: 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e code;.. dprin
38d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
38e0: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c /* If no call
38f0: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c back, use defaul
3900: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 t callback */.
3910: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
3920: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c password == NULL
3930: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 ) {..if (Tcl_Eva
3940: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 lEx(interp, "tls
3950: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c ::password", -1,
3960: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c TCL_EVAL_GLOBAL
3970: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
3980: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 char *ret =
3990: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
39a0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 StringResult(int
39b0: 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 erp);.. strnc
39c0: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 py(buf, ret, (si
39d0: 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 ze_t) size);..
39e0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 return (int)st
39f0: 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c rlen(ret);..} el
3a00: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e se {.. return
3a10: 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 -1;..}. }..
3a20: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d /* Create com
3a30: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a mand to eval */.
3a40: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c cmdPtr = Tcl
3a50: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 _DuplicateObj(st
3a60: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
3a70: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
3a80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3a90: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3aa0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3ab0: 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 ("password", -1)
3ac0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
3ad0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3ae0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3af0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 Tcl_NewIntObj(rw
3b00: 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f flag));. Tcl_
3b10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
3b20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
3b30: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f Ptr, Tcl_NewIntO
3b40: 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 bj(size));..
3b50: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c Tcl_Preserve((Cl
3b60: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 ientData) interp
3b70: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 );. Tcl_Prese
3b80: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 rve((ClientData)
3b90: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 statePtr);..
3ba0: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 /* Eval callbac
3bb0: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 k command */.
3bc0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
3bd0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 t(cmdPtr);. c
3be0: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ode = Tcl_EvalOb
3bf0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 jEx(interp, cmdP
3c00: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f tr, TCL_EVAL_GLO
3c10: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f BAL);. if (co
3c20: 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a de != TCL_OK) {.
3c30: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
3c40: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
3c50: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
3c60: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
3c70: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
3c80: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
3c90: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
3ca0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 tion(interp, cod
3cb0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d e);.#endif. }
3cc0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
3cd0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a Count(cmdPtr);..
3ce0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 Tcl_Release(
3cf0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
3d00: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 tePtr);.. /*
3d10: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 If successful, p
3d20: 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 ass back passwor
3d30: 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 d string and tru
3d40: 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e ncate if too lon
3d50: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 g */. if (cod
3d60: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e == TCL_OK) {..
3d70: 69 6e 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a int len;..char *
3d80: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 ret = (char *) T
3d90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
3da0: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 Obj(Tcl_GetObjRe
3db0: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c sult(interp), &l
3dc0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 en);..if (len >
3dd0: 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c size-1) {.. l
3de0: 65 6e 20 3d 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a en = size-1;..}.
3df0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 .strncpy(buf, re
3e00: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 t, (size_t) len)
3e10: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c ;..buf[len] = '\
3e20: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 0';..Tcl_Release
3e30: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e ((ClientData) in
3e40: 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 6c terp);..return(l
3e50: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 en);. }. T
3e60: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3e70: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b ntData) interp);
3e80: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
3e90: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3ee0: 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 * Session Callb
3ef0: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 ack for Clients
3f00: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
3f10: 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 when a new sessi
3f20: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 on is added to t
3f30: 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 he cache. In TLS
3f40: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 1.3. *.this may
3f50: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c be received mul
3f60: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 tiple times afte
3f70: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e r the handshake.
3f80: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 For. *.earlier
3f90: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 versions, this w
3fa0: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 ill be received
3fb0: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 during the hands
3fc0: 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 hake.. *.This is
3fd0: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 the preferred w
3fe0: 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 ay to obtain a r
3ff0: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
4000: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4010: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 . *.None. *. * S
4020: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
4030: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 Calls callback (
4040: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 if defined). *.
4050: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a * Return codes:.
4060: 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 *.0 = error whe
4070: 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 re session will
4080: 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 be immediately r
4090: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 emoved from the
40a0: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a internal cache..
40b0: 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 *.1 = success w
40c0: 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 here app retains
40d0: 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 session in sess
40e0: 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d ion cache, and m
40f0: 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 ust call SSL_SES
4100: 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e SION_free() when
4110: 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d done.. *. *----
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4160: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 */.static int.S
4170: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 essionCallback(c
4180: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 onst SSL *ssl, S
4190: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 SL_SESSION *sess
41a0: 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ion) {. State
41b0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
41c0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 ate*)SSL_get_app
41d0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c _data((SSL *)ssl
41e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 );. Tcl_Inter
41f0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
4200: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
4210: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
4220: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 r;. const uns
4230: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b igned char *tick
4240: 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e et;. const un
4250: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 signed char *ses
4260: 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a sion_id;. siz
4270: 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e e_t len2;. un
4280: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
4290: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
42a0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 alled");.. if
42b0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c (statePtr->call
42c0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a back == (Tcl_Obj
42d0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 *)NULL) {..retur
42e0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 n SSL_TLSEXT_ERR
42f0: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 _OK;. } else
4300: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 if (ssl == NULL)
4310: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 {..return SSL_T
4320: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b LSEXT_ERR_NOACK;
4330: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
4340: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f reate command to
4350: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 eval */. cmd
4360: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
4370: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
4380: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 >callback);.
4390: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
43a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
43b0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
43c0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 StringObj("sessi
43d0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 on", -1));. T
43e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
43f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
4400: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c cmdPtr,.. Tcl
4410: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
4420: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
4430: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
4440: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 , -1));.. /*
4450: 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 Session id */.
4460: 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 session_id = S
4470: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 SL_SESSION_get_i
4480: 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e d(session, &ulen
4490: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
44a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
44b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
44c0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 Tcl_NewByteArray
44d0: 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 Obj(session_id,
44e0: 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 (int) ulen));..
44f0: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 /* Session ti
4500: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f cket */. SSL_
4510: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 SESSION_get0_tic
4520: 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 ket(session, &ti
4530: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 cket, &len2);.
4540: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
4550: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
4560: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
4570: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 ewByteArrayObj(t
4580: 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e icket, (int) len
4590: 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 2));.. /* Lif
45a0: 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f etime - number o
45b0: 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 f seconds */.
45c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
45d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
45e0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e , cmdPtr,..Tcl_N
45f0: 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 ewLongObj((long)
4600: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
4610: 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 _ticket_lifetime
4620: 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 _hint(session)))
4630: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 ;.. /* Eval c
4640: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 allback command
4650: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 */. Tcl_IncrR
4660: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
4670: 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 . EvalCallbac
4680: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 k(interp, stateP
4690: 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 tr, cmdPtr);.
46a0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
46b0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 t(cmdPtr);. r
46c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a eturn 0;.}.../*.
46d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4710: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e -----. *. * ALPN
4720: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 Callback for Se
4730: 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 rvers and NPN Ca
4740: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e llback for Clien
4750: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 ts --. *. *.Perf
4760: 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 orm protocol (ht
4770: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 tp/1.1, h2, h3,
4780: 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 etc.) selection
4790: 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d for the. *.incom
47a0: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 ing connection.
47b0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c Called after Hel
47c0: 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61 lo and server ca
47d0: 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 llbacks.. *.Wher
47e0: 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63 e 'out' is selec
47f0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 ted protocol and
4800: 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65 'in' is the pee
4810: 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73 r advertised lis
4820: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 t.. *. * Results
4830: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
4840: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
4850: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 .Calls callback
4860: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a (if defined). *.
4870: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a * Return codes:
4880: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4890: 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 RR_OK: ALPN prot
48a0: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 ocol selected. T
48b0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
48c0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f ntinues.. *.SSL_
48d0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 TLSEXT_ERR_ALERT
48e0: 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61 _FATAL: There wa
48f0: 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 s no overlap bet
4900: 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 ween the client'
4910: 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65 s. *. supplie
4920: 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73 d list and the s
4930: 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74 erver configurat
4940: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ion. The connect
4950: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 ion will be abor
4960: 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ted.. *.SSL_TLSE
4970: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c XT_ERR_NOACK: AL
4980: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 PN protocol not
4990: 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 selected, e.g.,
49a0: 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a because no ALPN.
49b0: 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 *. protocols
49c0: 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20 are configured
49d0: 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 for this connect
49e0: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ion. The connect
49f0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
4a00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
4a50: 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 ic int.ALPNCallb
4a60: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 ack(const SSL *s
4a70: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e sl, const unsign
4a80: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 ed char **out, u
4a90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 nsigned char *ou
4aa0: 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 tlen,..const uns
4ab0: 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 igned char *in,
4ac0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c unsigned int inl
4ad0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b en, void *arg) {
4ae0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
4af0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
4b00: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
4b10: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
4b20: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
4b30: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
4b40: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
4b50: 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 , res;.. dpri
4b60: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
4b70: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e if (ssl == N
4b80: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 ULL || arg == NU
4b90: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 LL) {..return SS
4ba0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
4bb0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f CK;. }.. /
4bc0: 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f * Select protoco
4bd0: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c l */. if (SSL
4be0: 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f _select_next_pro
4bf0: 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 to(out, outlen,
4c00: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
4c10: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 , statePtr->prot
4c20: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c os_len,..in, inl
4c30: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e en) == OPENSSL_N
4c40: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b PN_NEGOTIATED) {
4c50: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 ../* Match found
4c60: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 */..res = SSL_T
4c70: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 LSEXT_ERR_OK;.
4c80: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f } else {../* O
4c90: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 PENSSL_NPN_NO_OV
4ca0: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c ERLAP = No overl
4cb0: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 ap, so use first
4cc0: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e item from clien
4cd0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 t protocol list
4ce0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c */..res = SSL_TL
4cf0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4d00: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
4d10: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d tatePtr->vcmd ==
4d20: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 (Tcl_Obj*)NULL)
4d30: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a {..return res;.
4d40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
4d50: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
4d60: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
4d70: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
4d80: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
4d90: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
4da0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
4db0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
4dc0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
4dd0: 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 gObj("alpn", -1)
4de0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
4df0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
4e00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a interp, cmdPtr,.
4e10: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 . Tcl_NewStri
4e20: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 ngObj(Tcl_GetCha
4e30: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 nnelName(statePt
4e40: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a r->self), -1));.
4e50: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
4e60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
4e70: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
4e80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f _NewStringObj(*o
4e90: 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 ut, -1));. Tc
4ea0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
4eb0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
4ec0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f mdPtr, Tcl_NewBo
4ed0: 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 oleanObj(res ==
4ee0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
4ef0: 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 K));.. /* Eva
4f00: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 l callback comma
4f10: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e nd */. Tcl_In
4f20: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 crRefCount(cmdPt
4f30: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 r);. if ((cod
4f40: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b e = EvalCallback
4f50: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
4f60: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 r, cmdPtr)) > 1)
4f70: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
4f80: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a SEXT_ERR_NOACK;.
4f90: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
4fa0: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 ode == 1) {..res
4fb0: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
4fc0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 R_OK;. } else
4fd0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c {..res = SSL_TL
4fe0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 SEXT_ERR_ALERT_F
4ff0: 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ATAL;. }.
5000: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
5010: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 (cmdPtr);. re
5020: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a turn res;.}.../*
5030: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5070: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 ------. *. * Adv
5080: 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 ertise Protocols
5090: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 Callback for Ne
50a0: 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f xt Protocol Nego
50b0: 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e tiation (NPN) in
50c0: 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a ServerHello --.
50d0: 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 *. *.called whe
50e0: 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e n a TLS server n
50f0: 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 eeds a list of s
5100: 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f upported protoco
5110: 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 ls for Next. *.P
5120: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 rotocol Negotiat
5130: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
5140: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
5150: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5160: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
5170: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es:. *.SSL_TLSEX
5180: 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 T_ERR_OK: NPN pr
5190: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e otocol selected.
51a0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
51b0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 continues.. *.SS
51c0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
51d0: 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c CK: NPN protocol
51e0: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 not selected. T
51f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f he connection co
5200: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d ntinues.. *. *--
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5250: 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 -. */.#ifdef USE
5260: 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a _NPN.static int.
5270: 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 NPNCallback(cons
5280: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 t SSL *ssl, cons
5290: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
52a0: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 **out, unsigned
52b0: 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 int *outlen, voi
52c0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
52d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
52e0: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 (State*)arg;..
52f0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
5300: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
5310: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
5320: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
5330: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
5340: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
5350: 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 . /* Set prot
5360: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 ocols list */.
5370: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
5380: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 protos != NULL)
5390: 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 {..*out = stateP
53a0: 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 tr->protos;..*ou
53b0: 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d tlen = statePtr-
53c0: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 >protos_len;.
53d0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 } else {..*out
53e0: 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e = NULL;..*outlen
53f0: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 = 0;..return SS
5400: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 L_TLSEXT_ERR_NOA
5410: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 CK;. }. re
5420: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
5430: 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 ERR_OK;.}.#endif
5440: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
5490: 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 * SNI Callback f
54a0: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a or Servers --. *
54b0: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 . *.Perform serv
54c0: 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 er-side SNI host
54d0: 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 name selection a
54e0: 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 fter receiving S
54f0: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 NI extension. *.
5500: 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e in Client Hello.
5510: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 Called after he
5520: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 llo callback but
5530: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c before ALPN cal
5540: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
5550: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
5560: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5570: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
5580: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
5590: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
55a0: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 des:. *.SSL_TLSE
55b0: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 XT_ERR_OK: SNI h
55c0: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 ostname is accep
55d0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 ted. The connect
55e0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 ion continues..
55f0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 *.SSL_TLSEXT_ERR
5600: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e _ALERT_FATAL: SN
5610: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
5620: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 t accepted. The
5630: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 connection. *.
5640: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 is aborted. De
5650: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 fault for alert
5660: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f is SSL_AD_UNRECO
5670: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 GNIZED_NAME.. *.
5680: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5690: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e LERT_WARNING: SN
56a0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f I hostname is no
56b0: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e t accepted, warn
56c0: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 ing alert. *.
56d0: 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f sent (not suppo
56e0: 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 rted in TLSv1.3)
56f0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e . The connection
5700: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 continues.. *.S
5710: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5720: 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d ACK: SNI hostnam
5730: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 e is not accepte
5740: 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 d and not acknow
5750: 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 ledged,. *. e
5760: 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e .g. if SNI has n
5770: 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 ot been configur
5780: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
5790: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
57a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
57f0: 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 c int.SNICallbac
5800: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c k(const SSL *ssl
5810: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f , int *alert, vo
5820: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 id *arg) {. S
5830: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
5840: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 (State*)arg;.
5850: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
5860: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d terp.= statePtr-
5870: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c >interp;. Tcl
5880: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 _Obj *cmdPtr;.
5890: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b int code, res;
58a0: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
58b0: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 rname = NULL;..
58c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
58d0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
58e0: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 sl == NULL || ar
58f0: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 g == NULL) {..re
5900: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f turn SSL_TLSEXT_
5910: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d ERR_NOACK;. }
5920: 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f .. /* Only wo
5930: 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 rks for TLS 1.2
5940: 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 and earlier */.
5950: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 servername =
5960: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 SSL_get_serverna
5970: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e me(ssl, TLSEXT_N
5980: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d AMETYPE_host_nam
5990: 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 e);. if (!ser
59a0: 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 vername || serve
59b0: 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 rname[0] == '\0'
59c0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f ) {..return SSL_
59d0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b TLSEXT_ERR_NOACK
59e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
59f0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 (statePtr->vcmd
5a00: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
5a10: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c L) {..return SSL
5a20: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a _TLSEXT_ERR_OK;.
5a30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
5a40: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 eate command to
5a50: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 eval */. cmdP
5a60: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 tr = Tcl_Duplica
5a70: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e teObj(statePtr->
5a80: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c vcmd);. Tcl_L
5a90: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5aa0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
5ab0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
5ac0: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 gObj("sni", -1))
5ad0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
5ae0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
5af0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 nterp, cmdPtr,..
5b00: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
5b10: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e gObj(Tcl_GetChan
5b20: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
5b30: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 ->self), -1));.
5b40: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5b50: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5b60: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5b70: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 NewStringObj(ser
5b80: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a vername , -1));.
5b90: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
5ba0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
5bb0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
5bc0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
5bd0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
5be0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
5bf0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
5c00: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
5c10: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f es = SSL_TLSEXT_
5c20: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
5c30: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c G;..*alert = SSL
5c40: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 _AD_UNRECOGNIZED
5c50: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 _NAME; /* Not su
5c60: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 pported by TLS 1
5c70: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 .3 */. } else
5c80: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 if (code == 1)
5c90: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 {..res = SSL_TLS
5ca0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 EXT_ERR_OK;.
5cb0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
5cc0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 SSL_TLSEXT_ERR_A
5cd0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c LERT_FATAL;..*al
5ce0: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 ert = SSL_AD_UNR
5cf0: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 ECOGNIZED_NAME;
5d00: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 /* Not supported
5d10: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 by TLS 1.3 */.
5d20: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 }. Tcl_Dec
5d30: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
5d40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
5d50: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d s;.}.../*. *----
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5da0: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c *. * ClientHell
5db0: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c o Handshake Call
5dc0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 back for Servers
5dd0: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 --. *. *.Used b
5de0: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d y server to exam
5df0: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e ine the server n
5e00: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 ame indication (
5e10: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 SNI) extension.
5e20: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 *.provided by th
5e30: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 e client in orde
5e40: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 r to select an a
5e50: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 ppropriate certi
5e60: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 ficate to. *.pre
5e70: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f sent, and make o
5e80: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 ther configurati
5e90: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 on adjustments r
5ea0: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 elevant to that
5eb0: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 server. *.name a
5ec0: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 nd its configura
5ed0: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 tion. This inclu
5ee0: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 des swapping out
5ef0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a the associated.
5f00: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 *.SSL_CTX point
5f10: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 er, modifying th
5f20: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 e server's list
5f30: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 of permitted TLS
5f40: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 versions,. *.ch
5f50: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 anging the serve
5f60: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 r's cipher list
5f70: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 in response to t
5f80: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 he client's ciph
5f90: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a er list, etc.. *
5fa0: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 .Called before S
5fb0: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c NI and ALPN call
5fc0: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 backs.. *. * Res
5fd0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ults:. *.None. *
5fe0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
5ff0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 :. *.Calls callb
6000: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 ack (if defined)
6010: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f . *. * Return co
6020: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 des:. *.SSL_CLIE
6030: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 NT_HELLO_RETRY:
6040: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 suspend the hand
6050: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 shake, and the h
6060: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f andshake functio
6070: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d n will return im
6080: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c mediately. *.SSL
6090: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
60a0: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 ROR: failure, te
60b0: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 rminate connecti
60c0: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f on. Set alert to
60d0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 error code.. *.
60e0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
60f0: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 _SUCCESS: succes
6100: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d s. *. *---------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
6150: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 tatic int.HelloC
6160: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
6170: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 L *ssl, int *ale
6180: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b rt, void *arg) {
6190: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
61a0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 ePtr = (State*)a
61b0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 rg;. Tcl_Inte
61c0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 rp *interp.= sta
61d0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 tePtr->interp;.
61e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
61f0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 tr;. int code
6200: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 , res;. const
6210: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d char *servernam
6220: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
6230: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 igned char *p;.
6240: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 size_t len, r
6250: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 emaining;.. d
6260: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
6270: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
6280: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 Ptr->vcmd == (Tc
6290: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 l_Obj*)NULL) {..
62a0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
62b0: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b T_HELLO_SUCCESS;
62c0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
62d0: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 ssl == (const SS
62e0: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 L *)NULL || arg
62f0: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 == (void *)NULL)
6300: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 {..return SSL_C
6310: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
6320: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6330: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 Get names */.
6340: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e if (!SSL_clien
6350: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 t_hello_get0_ext
6360: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 (ssl, TLSEXT_TYP
6370: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 E_server_name, &
6380: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c p, &remaining) |
6390: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 | remaining <= 2
63a0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 ) {..*alert = SS
63b0: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f L_R_SSLV3_ALERT_
63c0: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 ILLEGAL_PARAMETE
63d0: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 R;..return SSL_C
63e0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f LIENT_HELLO_ERRO
63f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6400: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e Extract the len
6410: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c gth of the suppl
6420: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 ied list of name
6430: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 s. */. len =
6440: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 (*(p++) << 8);.
6450: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 len += *(p++)
6460: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 ;. if (len +
6470: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 2 != remaining)
6480: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
6490: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c R_SSLV3_ALERT_IL
64a0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b LEGAL_PARAMETER;
64b0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 ..return SSL_CLI
64c0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b ENT_HELLO_ERROR;
64d0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 . }. remai
64e0: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 ning = len;..
64f0: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 /* The list in
6500: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 practice only ha
6510: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 s a single eleme
6520: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 nt, so we only c
6530: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 onsider the firs
6540: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 t one. */. if
6550: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 (remaining == 0
6560: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 || *p++ != TLSE
6570: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 XT_NAMETYPE_host
6580: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 _name) {..*alert
6590: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 = SSL_R_TLSV1_A
65a0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 LERT_INTERNAL_ER
65b0: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c ROR;..return SSL
65c0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 _CLIENT_HELLO_ER
65d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
65e0: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 emaining--;..
65f0: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 /* Now we can f
6600: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 inally pull out
6610: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 the byte array w
6620: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 ith the actual h
6630: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 ostname. */.
6640: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d if (remaining <=
6650: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 2) {..*alert =
6660: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 SSL_R_TLSV1_ALER
6670: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 T_INTERNAL_ERROR
6680: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c ;..return SSL_CL
6690: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
66a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
66b0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b = (*(p++) << 8);
66c0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b . len += *(p+
66d0: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 +);. if (len
66e0: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 + 2 > remaining)
66f0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c {..*alert = SSL
6700: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 _R_TLSV1_ALERT_I
6710: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 NTERNAL_ERROR;..
6720: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e return SSL_CLIEN
6730: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 T_HELLO_ERROR;.
6740: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 }. remaini
6750: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 ng = len;. se
6760: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 rvername = (cons
6770: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 t char *)p;..
6780: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
6790: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 nd to eval */.
67a0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
67b0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
67c0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
67d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
67e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
67f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
6800: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c wStringObj("hell
6810: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 o", -1));. Tc
6820: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
6830: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
6840: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f mdPtr,.. Tcl_
6850: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
6860: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
6870: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c statePtr->self),
6880: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
6890: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
68a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
68b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e tr, Tcl_NewStrin
68c0: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c gObj(servername,
68d0: 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 0a 20 (int) len));..
68e0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 /* Eval callb
68f0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 ack command */.
6900: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
6910: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 unt(cmdPtr);.
6920: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 if ((code = Eva
6930: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 lCallback(interp
6940: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 , statePtr, cmdP
6950: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 tr)) > 1) {..res
6960: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 = SSL_CLIENT_HE
6970: 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 LLO_RETRY;..*ale
6980: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 rt = SSL_R_TLSV1
6990: 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 _ALERT_USER_CANC
69a0: 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 ELLED;. } els
69b0: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 e if (code == 1)
69c0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c {..res = SSL_CL
69d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 IENT_HELLO_SUCCE
69e0: 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b SS;. } else {
69f0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 ..res = SSL_CLIE
6a00: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a NT_HELLO_ERROR;.
6a10: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f .*alert = SSL_R_
6a20: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 TLSV1_ALERT_INTE
6a30: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 RNAL_ERROR;.
6a40: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 }. Tcl_DecrRe
6a50: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a fCount(cmdPtr);.
6a60: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
6a70: 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }.../***********
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f *********/./* Co
6a90: 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a mmands *
6aa0: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /./*************
6ab0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d *******/../*. *-
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b00: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 --. *. * Handsha
6b10: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 keObjCmd --. *.
6b20: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 *.This command i
6b30: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 s used to verify
6b40: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e whether the han
6b50: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 dshake is comple
6b60: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a te. *.or not.. *
6b70: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
6b80: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
6b90: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 esult. 1 means h
6ba0: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 andshake complet
6bb0: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 e, 0 means pendi
6bc0: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ng.. *. * Side e
6bd0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 ffects:. *.May f
6be0: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 orce SSL negotia
6bf0: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 tion to take pla
6c00: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ce.. *. *-------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c30: 2d 2d 2d 2d 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 0a 20 2a 2f ------------. */
6c50: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 .static int Hand
6c60: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 shakeObjCmd(Clie
6c70: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
6c80: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
6c90: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
6ca0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
6cb0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
6cc0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 l_Channel chan;
6cd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 /* The ch
6ce0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
6cf0: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
6d00: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 tate *statePtr;
6d10: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 /* client
6d20: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 state for ssl s
6d30: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e ocket */. con
6d40: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 st char *errStr
6d50: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
6d60: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 ret = 1;. int
6d70: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 err = 0;.. d
6d80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
6d90: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
6da0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
6db0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
6dc0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
6dd0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 nel");..return(T
6de0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
6df0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f .. ERR_clear_
6e00: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 error();.. ch
6e10: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
6e20: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
6e30: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
6e40: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (objv[1], NULL),
6e50: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 NULL);. if (
6e60: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
6e70: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
6e80: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 eturn(TCL_ERROR)
6e90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
6ea0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
6eb0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
6ec0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
6ed0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
6ee0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
6ef0: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
6f00: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 etChannelType(ch
6f10: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e an) != Tls_Chann
6f20: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c elType()) {..Tcl
6f30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
6f40: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
6f50: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
6f60: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
6f70: 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 ,.. "\": not
6f80: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 a TLS channel",
6f90: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
6fa0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
6fb0: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 "TLS", "HANDSHA
6fc0: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 KE", "CHANNEL",
6fd0: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 "INVALID", (char
6fe0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
6ff0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 rn(TCL_ERROR);.
7000: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 }. statePt
7010: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c r = (State *)Tcl
7020: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
7030: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a nceData(chan);..
7040: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
7050: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 ling Tls_WaitFor
7060: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 Connect");. r
7070: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 et = Tls_WaitFor
7080: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 Connect(statePtr
7090: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 , &err, 1);.
70a0: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 dprintf("Tls_Wai
70b0: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 tForConnect retu
70c0: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b rned: %i", ret);
70d0: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 .. if (ret <
70e0: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 0 && ((statePtr-
70f0: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c >flags & TLS_TCL
7100: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 _ASYNC) && (err
7110: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 == EAGAIN))) {..
7120: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 dprintf("Async s
7130: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 et and err = EAG
7140: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b AIN");..ret = 0;
7150: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
7160: 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 ret < 0) {..long
7170: 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 result;..errStr
7180: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 = statePtr->err
7190: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 ;..Tcl_ResetResu
71a0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c lt(interp);..Tcl
71b0: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a _SetErrno(err);.
71c0: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c ..if (!errStr ||
71d0: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 (*errStr == 0))
71e0: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d {.. errStr =
71f0: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 Tcl_PosixError(
7200: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 interp);..}...Tc
7210: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
7220: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b nterp, "handshak
7230: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 e failed: ", err
7240: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 Str, (char *) NU
7250: 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c LL);..if ((resul
7260: 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 t = SSL_get_veri
7270: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 fy_result(stateP
7280: 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 tr->ssl)) != X50
7290: 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 9_V_OK) {.. T
72a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
72b0: 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f interp, " due to
72c0: 3a 20 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 : ", X509_verify
72d0: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 _cert_error_stri
72e0: 6e 67 28 72 65 73 75 6c 74 29 2c 20 28 63 68 61 ng(result), (cha
72f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 r *) NULL);..}..
7300: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
7310: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
7320: 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 "HANDSHAKE", "FA
7330: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
7340: 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 NULL);..dprintf(
7350: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 "Returning TCL_E
7360: 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 RROR with handsh
7370: 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c ake failed: %s",
7380: 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 errStr);..retur
7390: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 n(TCL_ERROR);.
73a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 } else {..if (
73b0: 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 err != 0) {..
73c0: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e dprintf("Got an
73d0: 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f error with a co
73e0: 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b mpleted handshak
73f0: 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 e: err = %i", er
7400: 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b r);..}..ret = 1;
7410: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
7420: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 ntf("Returning T
7430: 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 CL_OK with data
7440: 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 \"%i\"", ret);.
7450: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
7460: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
7470: 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b NewIntObj(ret));
7480: 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f . return(TCL_
7490: 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 OK);..clientData
74a0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
74b0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
74c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
74f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
7500: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d ImportObjCmd --
7510: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
7520: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
7530: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
7540: 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a "ssl" command. *
7550: 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d . *.The ssl comm
7560: 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f and pushes SSL o
7570: 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e ver a (newly con
7580: 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b nected) tcp sock
7590: 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 et. *. * Results
75a0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
75b0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
75c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
75d0: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 *.May modify th
75e0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e e behavior of an
75f0: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a IO channel.. *.
7600: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7640: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
7650: 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d int.ImportObjCm
7660: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
7670: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
7680: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
7690: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
76a0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
76b0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
76c0: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
76d0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
76e0: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 ode on. */. S
76f0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 tate *statePtr;.
7700: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 ./* client state
7710: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 for ssl socket
7720: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a */. SSL_CTX *
7730: 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ctx. = NU
7740: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
7750: 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 20 20 *script.
7760: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
7770: 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20 Obj *password.
7780: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
7790: 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 Tcl_Obj *vcmd.
77a0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
77b0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
77c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
77d0: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 slation, upperCh
77e0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 annelBlocking, u
77f0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 pperChannelEncod
7800: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 ing, upperChanne
7810: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e lEOFChar;. in
7820: 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 t idx, len;.
7830: 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 20 int flags..
7840: 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 = TLS_TCL_INI
7850: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 T;. int serve
7860: 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09 r.. = 0;.
7870: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e /* is connection
7880: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 incoming or out
7890: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 going? */. ch
78a0: 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20 ar *keyfile.
78b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
78c0: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20 char *certfile.
78d0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 = NULL;.
78e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
78f0: 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a *key .= NULL;.
7900: 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 int key_len
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7920: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 0;. unsigne
7930: 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20 d char *cert
7940: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7950: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20 int cert_len
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 = 0
7970: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 ;. char *ciph
7980: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ers. = NU
7990: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 LL;. char *ci
79a0: 70 68 65 72 73 75 69 74 65 73 09 20 20 20 20 20 phersuites.
79b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 = NULL;. c
79c0: 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 har *CAfile.
79d0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
79e0: 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 char *CAdir..
79f0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
7a00: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 char *DHparams.
7a10: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a = NULL;.
7a20: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 char *model.
7a30: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
7a40: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 . char *serve
7a50: 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 rname. =
7a60: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d NULL;./* hostnam
7a70: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d e for Server Nam
7a80: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a e Indication */.
7a90: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
7aa0: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e ed char *session
7ab0: 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 _id = NULL;.
7ac0: 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d Tcl_Obj *alpn..=
7ad0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 NULL;. int s
7ae0: 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 sl2 = 0, ssl3 =
7af0: 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 0;. int tls1
7b00: 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c = 1, tls1_1 = 1,
7b10: 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 tls1_2 = 1, tls
7b20: 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 1_3 = 1;. int
7b30: 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 proto = 0, leve
7b40: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 l = -1;. int
7b50: 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 verify = 0, requ
7b60: 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 ire = 0, request
7b70: 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 = 1, post_hands
7b80: 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 hake = 0;.. d
7b90: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
7ba0: 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e ;..#if defined(N
7bb0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e O_TLS1) || defin
7bc0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7bd0: 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 S1). tls1 = 0
7be0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
7bf0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
7c00: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
7c10: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 SL_NO_TLS1_1).
7c20: 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 tls1_1 = 0;.#e
7c30: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
7c40: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 (NO_TLS1_2) || d
7c50: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
7c60: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c O_TLS1_2). tl
7c70: 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 s1_2 = 0;.#endif
7c80: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
7c90: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e TLS1_3) || defin
7ca0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
7cb0: 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 S1_3). tls1_3
7cc0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 = 0;.#endif..
7cd0: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 if (objc < 2)
7ce0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
7cf0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
7d00: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f bjv, "channel ?o
7d10: 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 ptions?");..retu
7d20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7d30: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
7d40: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
7d50: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
7d60: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
7d70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
7d80: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c Obj(objv[1], NUL
7d90: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 L), NULL);. i
7da0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
7db0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
7dc0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7dd0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
7de0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
7df0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
7e00: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
7e10: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
7e20: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
7e30: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 an);.. for (i
7e40: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 dx = 2; idx < ob
7e50: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 jc; idx++) {..ch
7e60: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 ar *opt = Tcl_Ge
7e70: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
7e80: 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b bjv[idx], NULL);
7e90: 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d ...if (opt[0] !=
7ea0: 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b '-').. break
7eb0: 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 ;...OPTOBJ("-alp
7ec0: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 n", alpn);..OPTS
7ed0: 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64 TR("-cadir", CAd
7ee0: 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 ir);..OPTSTR("-c
7ef0: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b afile", CAfile);
7f00: 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 ..OPTBYTE("-cert
7f10: 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 ", cert, cert_le
7f20: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 n);..OPTSTR("-ce
7f30: 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c rtfile", certfil
7f40: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 e);..OPTSTR("-ci
7f50: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b pher", ciphers);
7f60: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 ..OPTSTR("-ciphe
7f70: 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 rs", ciphers);..
7f80: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 OPTSTR("-ciphers
7f90: 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 uites", ciphersu
7fa0: 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 ites);..OPTOBJ("
7fb0: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 -command", scrip
7fc0: 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 t);..OPTSTR("-dh
7fd0: 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d params", DHparam
7fe0: 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b s);..OPTBYTE("-k
7ff0: 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 ey", key, key_le
8000: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 n);..OPTSTR("-ke
8010: 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 yfile", keyfile)
8020: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 ;..OPTSTR("-mode
8030: 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 l", model);..OPT
8040: 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c OBJ("-password",
8050: 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 password);..OPT
8060: 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 BOOL("-post_hand
8070: 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e shake", post_han
8080: 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f dshake);..OPTBOO
8090: 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 L("-request", re
80a0: 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c quest);..OPTBOOL
80b0: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 ("-require", req
80c0: 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 uire);..OPTINT("
80d0: 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 -security_level"
80e0: 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f , level);..OPTBO
80f0: 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 OL("-server", se
8100: 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 rver);..OPTSTR("
8110: 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 -servername", se
8120: 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 rvername);..OPTS
8130: 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 TR("-session_id"
8140: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 , session_id);..
8150: 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c OPTBOOL("-ssl2",
8160: 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c ssl2);..OPTBOOL
8170: 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b ("-ssl3", ssl3);
8180: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 ..OPTBOOL("-tls1
8190: 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f ", tls1);..OPTBO
81a0: 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c OL("-tls1.1", tl
81b0: 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 s1_1);..OPTBOOL(
81c0: 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f "-tls1.2", tls1_
81d0: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 2);..OPTBOOL("-t
81e0: 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b ls1.3", tls1_3);
81f0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 ..OPTOBJ("-valid
8200: 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d atecommand", vcm
8210: 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 d);..OPTOBJ("-vc
8220: 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 md", vcmd);...OP
8230: 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 TBAD("option", "
8240: 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d -alpn, -cadir, -
8250: 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d cafile, -cert, -
8260: 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 certfile, -ciphe
8270: 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 r, -ciphersuites
8280: 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 , -command, -dhp
8290: 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 arams, -key, -ke
82a0: 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d yfile, -model, -
82b0: 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f password, -post_
82c0: 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 handshake, -requ
82d0: 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d est, -require, -
82e0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 security_level,
82f0: 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 -server, -server
8300: 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 name, -session_i
8310: 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c d, -ssl2, -ssl3,
8320: 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c -tls1, -tls1.1,
8330: 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e -tls1.2, -tls1.
8340: 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 3, or -validatec
8350: 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 ommand");...retu
8360: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
8370: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 }. if (requ
8380: 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 est)..verify |=
8390: 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e SSL_VERIFY_CLIEN
83a0: 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 T_ONCE | SSL_VER
83b0: 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 IFY_PEER;. if
83c0: 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 (request && req
83d0: 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 uire).verify |=
83e0: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f SSL_VERIFY_FAIL_
83f0: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b IF_NO_PEER_CERT;
8400: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
8410: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
8420: 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 ke).verify |= SS
8430: 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 L_VERIFY_POST_HA
8440: 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 NDSHAKE;. if
8450: 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 (verify == 0)..v
8460: 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 erify = SSL_VERI
8470: 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 FY_NONE;.. pr
8480: 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 oto |= (ssl2 ? T
8490: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 LS_PROTO_SSL2 :
84a0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
84b0: 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f (ssl3 ? TLS_PRO
84c0: 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 TO_SSL3 : 0);.
84d0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
84e0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
84f0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 1 : 0);. prot
8500: 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 o |= (tls1_1 ? T
8510: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 LS_PROTO_TLS1_1
8520: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
8530: 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 |= (tls1_2 ? TLS
8540: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 _PROTO_TLS1_2 :
8550: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
8560: 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 (tls1_3 ? TLS_P
8570: 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 ROTO_TLS1_3 : 0)
8580: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 ;.. /* reset
8590: 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b to NULL if blank
85a0: 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 string provided
85b0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 */. if (cert
85c0: 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 && !*cert)..
85d0: 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 cert.
85e0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
85f0: 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 (key && !*key).
8600: 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 . key.
8610: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
8620: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 if (certfile &&
8630: 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 !*certfile)
8640: 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 certfile.=
8650: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 NULL;. if (ke
8660: 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 yfile && !*keyfi
8670: 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 le)..keyfile.
8680: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
8690: 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 if (ciphers &&
86a0: 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 !*ciphers).
86b0: 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 ciphers.
86c0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
86d0: 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 f (ciphersuites
86e0: 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 && !*ciphersuite
86f0: 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 s) ciphersuites
8700: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
8710: 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 f (CAfile && !*C
8720: 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 Afile). C
8730: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 Afile. =
8740: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 NULL;. if (CA
8750: 64 69 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 dir && !*CAdir).
8760: 20 20 20 20 20 20 20 20 43 41 64 69 72 09 20 20 CAdir.
8770: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 = NULL;.
8780: 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 if (DHparams &
8790: 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 & !*DHparams).
87a0: 20 20 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 DHparams
87b0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 = NULL;..
87c0: 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 /* new SSL st
87d0: 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 ate */. state
87e0: 50 74 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 Ptr..= (State *)
87f0: 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e ckalloc((unsign
8800: 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 ed) sizeof(State
8810: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 ));. memset(s
8820: 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 tatePtr, 0, size
8830: 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 of(State));..
8840: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
8850: 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 .= flags;. st
8860: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d atePtr->interp.=
8870: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 interp;. sta
8880: 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 tePtr->vflags.=
8890: 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 verify;. stat
88a0: 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a ePtr->err.= "";.
88b0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 . /* allocate
88c0: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 script */. i
88d0: 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 f (script) {..(v
88e0: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 oid) Tcl_GetStri
88f0: 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 ngFromObj(script
8900: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 , &len);..if (le
8910: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 n) {.. stateP
8920: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 tr->callback = s
8930: 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f cript;.. Tcl_
8940: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 IncrRefCount(sta
8950: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 tePtr->callback)
8960: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
8970: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 /* allocate pass
8980: 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 word */. if (
8990: 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f password) {..(vo
89a0: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e id) Tcl_GetStrin
89b0: 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 gFromObj(passwor
89c0: 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c d, &len);..if (l
89d0: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 en) {.. state
89e0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 Ptr->password =
89f0: 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 password;.. T
8a00: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
8a10: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
8a20: 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 rd);..}. }..
8a30: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 /* allocate v
8a40: 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 alidate command
8a50: 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 */. if (vcmd)
8a60: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 {..(void) Tcl_G
8a70: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
8a80: 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 vcmd, &len);..if
8a90: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 (len) {.. st
8aa0: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 atePtr->vcmd = v
8ab0: 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e cmd;.. Tcl_In
8ac0: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
8ad0: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 Ptr->vcmd);..}.
8ae0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f }.. if (mo
8af0: 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 del != NULL) {..
8b00: 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 int mode;../* Ge
8b10: 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f t the "model" co
8b20: 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d ntext */..chan =
8b30: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
8b40: 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 interp, model, &
8b50: 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e mode);..if (chan
8b60: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
8b70: 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 ) NULL) {.. T
8b80: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
8b90: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
8ba0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
8bb0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d R;..}.../*.. * M
8bc0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
8bd0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
8be0: 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a st channel.. */.
8bf0: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 .chan = Tcl_GetT
8c00: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
8c10: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 ..if (Tcl_GetCha
8c20: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 nnelType(chan) !
8c30: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 = Tls_ChannelTyp
8c40: 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f e()) {.. Tcl_
8c50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
8c60: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
8c70: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
8c80: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
8c90: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
8ca0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
8cb0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
8cc0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
8cd0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
8ce0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
8cf0: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
8d00: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 NULL);.. Tls
8d10: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
8d20: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
8d30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8d40: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 ..}..ctx = ((Sta
8d50: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
8d60: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
8d70: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 chan))->ctx;.
8d80: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 } else {..if ((
8d90: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 ctx = CTX_Init(s
8da0: 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c tatePtr, server,
8db0: 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c proto, keyfile,
8dc0: 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 certfile, key,
8dd0: 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 cert, key_len,..
8de0: 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 cert_len, CA
8df0: 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 dir, CAfile, cip
8e00: 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 hers, ciphersuit
8e10: 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 es, level, DHpar
8e20: 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b ams)) == NULL) {
8e30: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
8e40: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
8e50: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
8e60: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 CL_ERROR;..}.
8e70: 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 }.. statePtr
8e80: 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 ->ctx = ctx;..
8e90: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e /*. * We n
8ea0: 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 eed to make sure
8eb0: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 that the channe
8ec0: 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 l works in binar
8ed0: 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 y (for the.
8ee0: 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 * encryption not
8ef0: 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 to get goofed u
8f00: 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e p).. * We on
8f10: 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 ly want to adjus
8f20: 74 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 t the buffering
8f30: 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 in pre-v2 channe
8f40: 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a ls, where. *
8f50: 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e each channel in
8f60: 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 the stack maint
8f70: 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 ained its own bu
8f80: 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 ffers.. */.
8f90: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
8fa0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c it(&upperChannel
8fb0: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 Translation);.
8fc0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
8fd0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 t(&upperChannelB
8fe0: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 locking);. Tc
8ff0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
9000: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 pperChannelEOFCh
9010: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ar);. Tcl_DSt
9020: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 ringInit(&upperC
9030: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b hannelEncoding);
9040: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e . Tcl_GetChan
9050: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
9060: 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 , chan, "-eofcha
9070: 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 r", &upperChanne
9080: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 lEOFChar);. T
9090: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
90a0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
90b0: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 , "-encoding", &
90c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f upperChannelEnco
90d0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 ding);. Tcl_G
90e0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
90f0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
9100: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 translation", &u
9110: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 pperChannelTrans
9120: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c lation);. Tcl
9130: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
9140: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
9150: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 "-blocking", &up
9160: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 perChannelBlocki
9170: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 ng);. Tcl_Set
9180: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
9190: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
91a0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e anslation", "bin
91b0: 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ary");. Tcl_S
91c0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
91d0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
91e0: 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 blocking", "true
91f0: 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ");. dprintf(
9200: 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 "Consuming Tcl c
9210: 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f hannel %s", Tcl_
9220: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
9230: 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 han));. state
9240: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f Ptr->self = Tcl_
9250: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 StackChannel(int
9260: 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c erp, Tls_Channel
9270: 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 Type(), (ClientD
9280: 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 ata) statePtr, (
9290: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 TCL_READABLE | T
92a0: 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 CL_WRITABLE), ch
92b0: 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 an);. dprintf
92c0: 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 ("Created channe
92d0: 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c l named %s", Tcl
92e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
92f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 statePtr->self))
9300: 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 ;. if (stateP
9310: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c tr->self == (Tcl
9320: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
9330: 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 {../*.. * No use
9340: 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c of Tcl_Eventual
9350: 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e lyFree because n
9360: 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 o possible Tcl_P
9370: 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 reserve... */..T
9380: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
9390: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 statePtr);..ret
93a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
93b0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 }.. Tcl_Se
93c0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
93d0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d nterp, statePtr-
93e0: 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 >self, "-transla
93f0: 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 tion", Tcl_DStri
9400: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
9410: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e annelTranslation
9420: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 ));. Tcl_SetC
9430: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
9440: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
9450: 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 elf, "-encoding"
9460: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
9470: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c ue(&upperChannel
9480: 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 Encoding));.
9490: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
94a0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 tion(interp, sta
94b0: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 tePtr->self, "-e
94c0: 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 ofchar", Tcl_DSt
94d0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 ringValue(&upper
94e0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 ChannelEOFChar))
94f0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
9500: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
9510: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
9520: 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 f, "-blocking",
9530: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
9540: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
9550: 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f ocking));.. /
9560: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 *. * SSL Ini
9570: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 tialization.
9580: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
9590: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 ->ssl = SSL_new(
95a0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
95b0: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 if (!statePt
95c0: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 r->ssl) {../* SS
95d0: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 L library error
95e0: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
95f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
9600: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 uldn't construct
9610: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c ssl session: ",
9620: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
9630: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
9640: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
9650: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 (interp, "TLS",
9660: 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 "IMPORT", "INIT"
9670: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 , "FAILED", (cha
9680: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 r *) NULL);..Tls
9690: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
96a0: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 tatePtr);..retur
96b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
96c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 }.. /* Set h
96d0: 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 ost server name
96e0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 */. if (serve
96f0: 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 rname) {../* Set
9700: 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d s the server nam
9710: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e e indication (SN
9720: 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c I) in ClientHell
9730: 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 o extension */..
9740: 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c /* Per RFC 6066,
9750: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 hostname is a A
9760: 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 SCII encoded str
9770: 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 ing, though RFC
9780: 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 4366 says UTF-8.
9790: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 */..if (!SSL_se
97a0: 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 t_tlsext_host_na
97b0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c me(statePtr->ssl
97c0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 , servername) &&
97d0: 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 require) {..
97e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
97f0: 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 t(interp, "setti
9800: 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 ng TLS host name
9810: 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 extension faile
9820: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
9830: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
9840: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
9850: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
9860: 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 ", "SNI", "FAILE
9870: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
9880: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
9890: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
98a0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
98b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
98c0: 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d ../* Set hostnam
98d0: 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 e for peer certi
98e0: 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 ficate hostname
98f0: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 verification in
9900: 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e clients... Don
9910: 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 't use SSL_set1_
9920: 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 host since it ha
9930: 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a s limitations. *
9940: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 /..if (!SSL_add1
9950: 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e _host(statePtr->
9960: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 ssl, servername)
9970: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
9980: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
9990: 2c 20 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 , "setting DNS h
99a0: 6f 73 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 ost name failed"
99b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
99c0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
99d0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
99e0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
99f0: 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 "HOSTNAME", "FA
9a00: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
9a10: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
9a20: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
9a30: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
9a40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9a50: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
9a60: 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 Resume session
9a70: 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 id */. if (se
9a80: 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c ssion_id && strl
9a90: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c en(session_id) <
9aa0: 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 = SSL_MAX_SID_CT
9ab0: 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 X_LENGTH) {../*
9ac0: 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_set_session(
9ad0: 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 ) */..if (!SSL_S
9ae0: 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 ESSION_set1_id_c
9af0: 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 ontext(SSL_get_s
9b00: 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ession(statePtr-
9b10: 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 >ssl), session_i
9b20: 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 d, (unsigned int
9b30: 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e ) strlen(session
9b40: 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 _id))) {.. Tc
9b50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
9b60: 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 nterp, "Resume s
9b70: 65 73 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 ession id ", ses
9b80: 73 69 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 sion_id, " faile
9b90: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
9ba0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 L);.. Tcl_Set
9bb0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
9bc0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
9bd0: 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 ", "SESSION", "F
9be0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 AILED", (char *)
9bf0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 NULL);.. Tls
9c00: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
9c10: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
9c20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9c30: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
9c40: 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 * Enable Applica
9c50: 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f tion-Layer Proto
9c60: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e col Negotiation.
9c70: 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 Examples are: h
9c80: 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 ttp/1.0,..http/1
9c90: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c .1, h2, h3, ftp,
9ca0: 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 imap, pop3, xmp
9cb0: 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 p-client, xmpp-s
9cc0: 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 erver, mqtt, irc
9cd0: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 , etc. */. if
9ce0: 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f (alpn) {../* Co
9cf0: 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 nvert a TCL list
9d00: 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c into a protocol
9d10: 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f -list in wire-fo
9d20: 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 rmat */..unsigne
9d30: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 d char *protos,
9d40: 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e *p;..unsigned in
9d50: 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 t protos_len = 0
9d60: 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 ;..int i, len, c
9d70: 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c nt;..Tcl_Obj **l
9d80: 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c ist;...if (Tcl_L
9d90: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 istObjGetElement
9da0: 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 s(interp, alpn,
9db0: 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 &cnt, &list) !=
9dc0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 TCL_OK) {.. T
9dd0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 ls_Free((char *)
9de0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 statePtr);..
9df0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
9e00: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 R;..}.../* Deter
9e10: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 mine the memory
9e20: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 required for the
9e30: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a protocol-list *
9e40: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 /..for (i = 0; i
9e50: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 < cnt; i++) {..
9e60: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e Tcl_GetStrin
9e70: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d gFromObj(list[i]
9e80: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 , &len);.. if
9e90: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 (len > 255) {..
9ea0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
9eb0: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 t(interp, "ALPN
9ec0: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f protocol name to
9ed0: 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a o long", (char *
9ee0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 ) NULL);...Tcl_S
9ef0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
9f00: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f rp, "TLS", "IMPO
9f10: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 RT", "ALPN", "FA
9f20: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ILED", (char *)
9f30: 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 NULL);...Tls_Fre
9f40: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
9f50: 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 Ptr);...return T
9f60: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
9f70: 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e .. protos_len
9f80: 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a += 1 + len;..}.
9f90: 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 ../* Build the c
9fa0: 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c omplete protocol
9fb0: 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 -list */..protos
9fc0: 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f = ckalloc(proto
9fd0: 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 s_len);../* prot
9fe0: 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 ocol-lists consi
9ff0: 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 st of 8-bit leng
a000: 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 th-prefixed, byt
a010: 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f e strings */..fo
a020: 72 20 28 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 r (i = 0, p = pr
a030: 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 otos; i < cnt; i
a040: 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 ++) {.. char
a050: 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 *str = Tcl_GetSt
a060: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 ringFromObj(list
a070: 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 [i], &len);..
a080: 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 *p++ = len;..
a090: 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c memcpy(p, str,
a0a0: 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d len);.. p +=
a0b0: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 len;..}.../* SS
a0c0: 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f L_set_alpn_proto
a0d0: 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f s makes a copy o
a0e0: 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c f the protocol-l
a0f0: 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a ist */../* Note:
a100: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 This functions
a110: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74 reverses the ret
a120: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e urn value conven
a130: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c tion */..if (SSL
a140: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 _set_alpn_protos
a150: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
a160: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c protos, protos_l
a170: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f en)) {.. Tcl_
a180: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
a190: 65 72 70 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 erp, "failed to
a1a0: 73 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f set ALPN protoco
a1b0: 6c 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ls", (char *) NU
a1c0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
a1d0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
a1e0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
a1f0: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 T", "ALPN", "FAI
a200: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
a210: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
a220: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
a230: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 tePtr);.. ckf
a240: 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 ree(protos);..
a250: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
a260: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 OR;..}.../* Stor
a270: 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 e protocols list
a280: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 */..statePtr->p
a290: 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a rotos = protos;.
a2a0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
a2b0: 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c s_len = protos_l
a2c0: 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b en;. } else {
a2d0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
a2e0: 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 os = NULL;..stat
a2f0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
a300: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 = 0;. }..
a310: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 /*. * SSL C
a320: 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f allbacks. */
a330: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 . SSL_set_app
a340: 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e _data(statePtr->
a350: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ssl, (void *)sta
a360: 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 tePtr);./* point
a370: 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a back to us */..
a380: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 SSL_set_veri
a390: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c fy(statePtr->ssl
a3a0: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 , verify, Verify
a3b0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 Callback);. S
a3c0: 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c SL_set_info_call
a3d0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 back(statePtr->s
a3e0: 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b sl, InfoCallback
a3f0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 );.. /* Callb
a400: 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e ack for observin
a410: 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 g protocol messa
a420: 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f ges */.#ifndef O
a430: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 PENSSL_NO_SSL_TR
a440: 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 ACE. /* void
a450: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f SSL_CTX_set_msg_
a460: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 callback_arg(sta
a470: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 tePtr->ctx, (voi
a480: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 d *)statePtr);.
a490: 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f void SSL_CTX_
a4a0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b set_msg_callback
a4b0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
a4c0: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 MessageCallback)
a4d0: 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 ; */. SSL_set
a4e0: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 _msg_callback_ar
a4f0: 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c g(statePtr->ssl,
a500: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
a510: 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f r);. SSL_set_
a520: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 msg_callback(sta
a530: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 tePtr->ssl, Mess
a540: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 ageCallback);.#e
a550: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 ndif.. /* Cre
a560: 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 ate Tcl_Channel
a570: 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 BIO Handler */.
a580: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 statePtr->p_b
a590: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c io.= BIO_new_tcl
a5a0: 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e (statePtr, BIO_N
a5b0: 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 OCLOSE);. sta
a5c0: 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f tePtr->bio.= BIO
a5d0: 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 _new(BIO_f_ssl()
a5e0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 );.. if (serv
a5f0: 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 er) {../* Server
a600: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 callbacks */..S
a610: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 SL_CTX_set_tlsex
a620: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 t_servername_arg
a630: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
a640: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
a650: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
a660: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d tlsext_servernam
a670: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 e_callback(state
a680: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c Ptr->ctx, SNICal
a690: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 lback);..SSL_CTX
a6a0: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c _set_client_hell
a6b0: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 o_cb(statePtr->c
a6c0: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 tx, HelloCallbac
a6d0: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
a6e0: 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 Ptr);..if (state
a6f0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e Ptr->protos != N
a700: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f ULL) {.. SSL_
a710: 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c CTX_set_alpn_sel
a720: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d ect_cb(statePtr-
a730: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 >ctx, ALPNCallba
a740: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 ck, (void *)stat
a750: 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 ePtr);.#ifdef US
a760: 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 E_NPN.. if (t
a770: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c ls1_2 == 0 && tl
a780: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 s1_3 == 0) {...S
a790: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f SL_CTX_set_next_
a7a0: 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 protos_advertise
a7b0: 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 d_cb(statePtr->c
a7c0: 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c tx, NPNCallback,
a7d0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
a7e0: 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 r);.. }.#endi
a7f0: 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 f..}.../* Enable
a800: 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 server to send
a810: 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74 cert request aft
a820: 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c er handshake (TL
a830: 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 S 1.3 only) */..
a840: 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 /* A write opera
a850: 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 tion must take p
a860: 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 lace for the Cer
a870: 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74 tificate Request
a880: 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 to be.. sent
a890: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 to the client, t
a8a0: 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 his can be done
a8b0: 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 with SSL_do_hand
a8c0: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 shake(). */..if
a8d0: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 (request && post
a8e0: 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c _handshake && tl
a8f0: 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c s1_3) {.. SSL
a900: 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 _verify_client_p
a910: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 ost_handshake(st
a920: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d atePtr->ssl);..}
a930: 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 .../* set automa
a940: 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 tic curve select
a950: 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f ion */..SSL_set_
a960: 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 ecdh_auto(stateP
a970: 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f tr->ssl, 1);.../
a980: 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 * Set server mod
a990: 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e e */..statePtr->
a9a0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c flags |= TLS_TCL
a9b0: 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 _SERVER;..SSL_se
a9c0: 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 t_accept_state(s
a9d0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
a9e0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 } else {../*
a9f0: 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 Client callbacks
aa00: 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e */.#ifdef USE_N
aa10: 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 PN..if (statePtr
aa20: 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c ->protos != NULL
aa30: 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 && tls1_2 == 0
aa40: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 && tls1_3 == 0)
aa50: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 {.. SSL_CTX_s
aa60: 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 et_next_proto_se
aa70: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 lect_cb(statePtr
aa80: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 ->ctx, ALPNCallb
aa90: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 ack, (void *)sta
aaa0: 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 tePtr);..}.#endi
aab0: 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 f.../* Session c
aac0: 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 aching */..SSL_C
aad0: 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 TX_set_session_c
aae0: 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 ache_mode(stateP
aaf0: 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 tr->ctx, SSL_SES
ab00: 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c S_CACHE_CLIENT |
ab10: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f SSL_SESS_CACHE_
ab20: 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 NO_INTERNAL_STOR
ab30: 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 E);..SSL_CTX_ses
ab40: 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 s_set_new_cb(sta
ab50: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 tePtr->ctx, Sess
ab60: 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 ionCallback);...
ab70: 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 /* Enable post h
ab80: 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 andshake Authent
ab90: 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f ication extensio
aba0: 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c n. TLS 1.3 only,
abb0: 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a not http/2. */.
abc0: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 .if (request &&
abd0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 post_handshake)
abe0: 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 {.. SSL_set_p
abf0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 ost_handshake_au
ac00: 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c th(statePtr->ssl
ac10: 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 , 1);..}.../* Se
ac20: 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f t client mode */
ac30: 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 ..SSL_set_connec
ac40: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72 t_state(statePtr
ac50: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 ->ssl);. }.
ac60: 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 SSL_set_bio(st
ac70: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 atePtr->ssl, sta
ac80: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 tePtr->p_bio, st
ac90: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a atePtr->p_bio);.
aca0: 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 BIO_set_ssl(
acb0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 statePtr->bio, s
acc0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 tatePtr->ssl, BI
acd0: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 O_NOCLOSE);..
ace0: 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f /*. * End o
acf0: 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 f SSL Init.
ad00: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 */. dprintf("
ad10: 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 Returning %s", T
ad20: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
ad30: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 e(statePtr->self
ad40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 ));. Tcl_SetR
ad50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 esult(interp, (c
ad60: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 har *) Tcl_GetCh
ad70: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 annelName(stateP
ad80: 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 tr->self), TCL_V
ad90: 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 OLATILE);.. r
ada0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 eturn TCL_OK;..c
adb0: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 lientData = clie
adc0: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ntData;.}.../*.
add0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
ade0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
adf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ae10: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 ----. *. * Unimp
ae20: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a ortObjCmd --. *.
ae30: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 *.This procedur
ae40: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 e is invoked to
ae50: 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f remove the topmo
ae60: 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 st channel filte
ae70: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 r.. *. * Results
ae80: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
ae90: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
aea0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
aeb0: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 *.May modify th
aec0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e e behavior of an
aed0: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a IO channel.. *.
aee0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
aef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
af00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
af10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
af20: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
af30: 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a int.UnimportObj
af40: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
af50: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
af60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
af70: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
af80: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
af90: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
afa0: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 l chan;../* The
afb0: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
afc0: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 mode on. */..
afd0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
afe0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 d");.. if (ob
aff0: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
b000: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
b010: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
b020: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 hannel");..retur
b030: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
b040: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
b050: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
b060: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 terp, Tcl_GetStr
b070: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 ing(objv[1]), NU
b080: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 LL);. if (cha
b090: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
b0a0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
b0b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
b0c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
b0d0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
b0e0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
b0f0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
b100: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
b110: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a Channel(chan);..
b120: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 if (Tcl_GetC
b130: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 hannelType(chan)
b140: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 != Tls_ChannelT
b150: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ype()) {..Tcl_Ap
b160: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b170: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
b180: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
b190: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
b1a0: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
b1b0: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
b1c0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
b1d0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
b1e0: 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 TLS", "UNIMPORT"
b1f0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e , "CHANNEL", "IN
b200: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 VALID", (char *)
b210: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
b220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
b230: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e .. if (Tcl_Un
b240: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 stackChannel(int
b250: 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 erp, chan) == TC
b260: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 L_ERROR) {..retu
b270: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
b280: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 }.. return
b290: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 TCL_OK;..clientD
b2a0: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 ata = clientData
b2b0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
b2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
b300: 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d *. * CTX_Init --
b310: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c construct a SSL
b320: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a _CTX instance. *
b330: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
b340: 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 A valid SSL_CTX
b350: 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c instance or NULL
b360: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
b370: 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 ects:. *.constru
b380: 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 cts SSL context
b390: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d (CTX). *. *-----
b3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
b3e0: 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 */.static SSL_CT
b3f0: 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 X *.CTX_Init(Sta
b400: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e te *statePtr, in
b410: 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 t isServer, int
b420: 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 proto, char *key
b430: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 file, char *cert
b440: 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e file,. unsign
b450: 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e ed char *key, un
b460: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 signed char *cer
b470: 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 t, int key_len,
b480: 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 int cert_len, ch
b490: 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 ar *CAdir,. c
b4a0: 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 har *CAfile, cha
b4b0: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 r *ciphers, char
b4c0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 *ciphersuites,
b4d0: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 int level, char
b4e0: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 *DHparams) {.
b4f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
b500: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e erp = statePtr->
b510: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f interp;. SSL_
b520: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b CTX *ctx = NULL;
b530: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
b540: 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 ds;. Tcl_DSt
b550: 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e ring ds1;. in
b560: 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 t off = 0;. i
b570: 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f nt load_private_
b580: 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 key;. const S
b590: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f SL_METHOD *metho
b5a0: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 d;.. dprintf(
b5b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
b5c0: 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 if (!proto) {..T
b5d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b5e0: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 interp, "no vali
b5f0: 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 d protocol selec
b600: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
b610: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
b620: 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 .. /* create
b630: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 SSL context */.#
b640: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
b650: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 ON_NUMBER >= 0x1
b660: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 0100000L || defi
b670: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 ned(NO_SSL2) ||
b680: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
b690: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 NO_SSL2). if
b6a0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 (ENABLED(proto,
b6b0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 TLS_PROTO_SSL2))
b6c0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
b6d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 sult(interp, "SS
b6e0: 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 L2 protocol not
b6f0: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
b700: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
b710: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 . }.#endif.#i
b720: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c f defined(NO_SSL
b730: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
b740: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 ENSSL_NO_SSL3).
b750: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
b760: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
b770: 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 SSL3)) {..Tcl_Ap
b780: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
b790: 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f p, "SSL3 protoco
b7a0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 l not supported"
b7b0: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
b7c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e NULL;. }.#en
b7d0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
b7e0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 NO_TLS1) || defi
b7f0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
b800: 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 LS1). if (ENA
b810: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f BLED(proto, TLS_
b820: 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 PROTO_TLS1)) {..
b830: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
b840: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e (interp, "TLS 1.
b850: 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 0 protocol not s
b860: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
b870: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
b880: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 }.#endif.#if
b890: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 defined(NO_TLS1
b8a0: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f _1) || defined(O
b8b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
b8c0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
b8d0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
b8e0: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 TO_TLS1_1)) {..T
b8f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
b900: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 interp, "TLS 1.1
b910: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 protocol not su
b920: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b pported", NULL);
b930: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
b940: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 }.#endif.#if
b950: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
b960: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 2) || defined(OP
b970: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 ENSSL_NO_TLS1_2)
b980: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
b990: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
b9a0: 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 O_TLS1_2)) {..Tc
b9b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
b9c0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 nterp, "TLS 1.2
b9d0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
b9e0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
b9f0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
ba00: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
ba10: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
ba20: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
ba30: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
ba40: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 if (ENABLED(
ba50: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
ba60: 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c _TLS1_3)) {..Tcl
ba70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ba80: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 terp, "TLS 1.3 p
ba90: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
baa0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
bab0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
bac0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 }.#endif. if
bad0: 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a (proto == 0) {.
bae0: 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e ./* Use full ran
baf0: 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ge */..SSL_CTX_s
bb00: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 et_min_proto_ver
bb10: 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 sion(ctx, 0);..S
bb20: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
bb30: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
bb40: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 , 0);. }..
bb50: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 switch (proto)
bb60: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 {.#if OPENSSL_VE
bb70: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
bb80: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
bb90: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
bba0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
bbb0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
bbc0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
bbd0: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 SSL2:..method =
bbe0: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 isServer ? SSLv2
bbf0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
bc00: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f : SSLv2_client_
bc10: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
bc20: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
bc30: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
bc40: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
bc50: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
bc60: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
bc70: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
bc80: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
bc90: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 TO_SSL3:..method
bca0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 = isServer ? SS
bcb0: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Lv3_server_metho
bcc0: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 d() : SSLv3_clie
bcd0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
bce0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
bcf0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
bd00: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
bd10: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
bd20: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
bd30: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
bd40: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
bd50: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 PROTO_TLS1:..met
bd60: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
bd70: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 TLSv1_server_me
bd80: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 thod() : TLSv1_c
bd90: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
bda0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
bdb0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
bdc0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
bdd0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
bde0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
bdf0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
be00: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_1_METHOD).
be10: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
be20: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_1:..method =
be30: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
be40: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_1_server_metho
be50: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c d() : TLSv1_1_cl
be60: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
be70: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
be80: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
be90: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
bea0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
beb0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
bec0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
bed0: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
bee0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
bef0: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
bf00: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
bf10: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _2_server_method
bf20: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 () : TLSv1_2_cli
bf30: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
bf40: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
bf50: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
bf60: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
bf70: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
bf80: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 _3). case TLS
bf90: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 _PROTO_TLS1_3:..
bfa0: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 /* Use the gener
bfb0: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f ic method and co
bfc0: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 nstraint range a
bfd0: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 fter context is
bfe0: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 created */..meth
bff0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
c000: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
c010: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
c020: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
c030: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 k;.#endif. de
c040: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 fault:../* Negot
c050: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 iate highest ava
c060: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 ilable SSL/TLS v
c070: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f ersion */..metho
c080: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
c090: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 LS_server_method
c0a0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f () : TLS_client_
c0b0: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 method();.#if OP
c0c0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
c0d0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
c0e0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
c0f0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
c100: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
c110: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL2)..off |= (EN
c120: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
c130: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f _PROTO_SSL2) ?
c140: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
c150: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv2);.#endif.#i
c160: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
c170: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
c180: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
c190: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
c1a0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
c1b0: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a TO_SSL3) ? 0 :
c1c0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 SSL_OP_NO_SSLv3
c1d0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
c1e0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
c1f0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
c200: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 SSL_NO_TLS1)..of
c210: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
c220: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
c230: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c LS1) ? 0 : SSL
c240: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 _OP_NO_TLSv1);.#
c250: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
c260: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
c270: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
c280: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 L_NO_TLS1_1)..of
c290: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
c2a0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
c2b0: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c LS1_1) ? 0 : SSL
c2c0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b _OP_NO_TLSv1_1);
c2d0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
c2e0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
c2f0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
c300: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 SSL_NO_TLS1_2)..
c310: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
c320: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
c330: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 _TLS1_2) ? 0 : S
c340: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 SL_OP_NO_TLSv1_2
c350: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
c360: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
c370: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
c380: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
c390: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
c3a0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
c3b0: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a TO_TLS1_3) ? 0 :
c3c0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
c3d0: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 _3);.#endif..bre
c3e0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 ak;. }.. E
c3f0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
c400: 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c ;.. ctx = SSL
c410: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
c420: 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 ;. if (!ctx)
c430: 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b {..return(NULL);
c440: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
c450: 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 getenv(SSLKEYLOG
c460: 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 FILE)) {..SSL_CT
c470: 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c X_set_keylog_cal
c480: 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f lback(ctx, KeyLo
c490: 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 gCallback);.
c4a0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 }..#if !defined(
c4b0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 NO_TLS1_3) && !d
c4c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
c4d0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 O_TLS1_3). if
c4e0: 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 (proto == TLS_P
c4f0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 ROTO_TLS1_3) {..
c500: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f SSL_CTX_set_min_
c510: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 proto_version(ct
c520: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f x, TLS1_3_VERSIO
c530: 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 N);..SSL_CTX_set
c540: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 _max_proto_versi
c550: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 on(ctx, TLS1_3_V
c560: 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 ERSION);. }.#
c570: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f endif.. /* Fo
c580: 72 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 rce cipher selec
c590: 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 tion order by se
c5a0: 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 rver */. if (
c5b0: 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 !isServer) {..SS
c5c0: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e L_CTX_set_option
c5d0: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 s(ctx, SSL_OP_CI
c5e0: 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 PHER_SERVER_PREF
c5f0: 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a ERENCE);. }..
c600: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
c610: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
c620: 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 0100000L. Ope
c630: 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 nSSL_add_all_alg
c640: 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f orithms(); /* Lo
c650: 61 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 ad ciphers and d
c660: 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 igests */.#endif
c670: 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
c680: 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 t_app_data(ctx,
c690: 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 (void*)interp);.
c6a0: 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 /* remember the
c6b0: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 interpreter */.
c6c0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f SSL_CTX_set_o
c6d0: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f ptions(ctx, SSL_
c6e0: 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 OP_ALL);./* all
c6f0: 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 SSL bug workarou
c700: 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 nds */. SSL_C
c710: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
c720: 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f tx, SSL_OP_NO_CO
c730: 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 MPRESSION);./* d
c740: 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 isable compressi
c750: 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f on even if suppo
c760: 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f rted */. SSL_
c770: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 CTX_set_options(
c780: 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 ctx, off);../* d
c790: 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 isable protocol
c7a0: 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 versions */.#if
c7b0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
c7c0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 NUMBER < 0x10101
c7d0: 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 000L. SSL_CTX
c7e0: 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 _set_mode(ctx, S
c7f0: 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 SL_MODE_AUTO_RET
c800: 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e RY);./* handle n
c810: 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e ew handshakes in
c820: 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 background. On
c830: 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 by default in Op
c840: 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a enSSL 1.1.1. */.
c850: 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 #endif. SSL_C
c860: 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 TX_sess_set_cach
c870: 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 e_size(ctx, 128)
c880: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 ;.. /* Set us
c890: 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 er defined ciphe
c8a0: 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 rs, cipher suite
c8b0: 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 s, and security
c8c0: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
c8d0: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c ((ciphers != NUL
c8e0: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 L) && !SSL_CTX_s
c8f0: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 et_cipher_list(c
c900: 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a tx, ciphers)) {.
c910: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
c920: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 t(interp, "Set c
c930: 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e iphers failed: N
c940: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 o valid ciphers"
c950: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
c960: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 ;..SSL_CTX_free(
c970: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ctx);..return NU
c980: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
c990: 20 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 ((ciphersuites
c9a0: 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c != NULL) && !SSL
c9b0: 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 _CTX_set_ciphers
c9c0: 75 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 uites(ctx, ciphe
c9d0: 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c rsuites)) {..Tcl
c9e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
c9f0: 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 terp, "Set ciphe
ca00: 72 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a r suites failed:
ca10: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 No valid cipher
ca20: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c s", (char *) NUL
ca30: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 L);..SSL_CTX_fre
ca40: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 e(ctx);..return
ca50: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
ca60: 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 /* Set security
ca70: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 level */. if
ca80: 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 (level > -1 &&
ca90: 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a level < 6) {../*
caa0: 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 SSL_set_securit
cab0: 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f y_level */..SSL_
cac0: 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 CTX_set_security
cad0: 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 _level(ctx, leve
cae0: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f l);. }.. /
caf0: 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 * set some callb
cb00: 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f acks */. SSL_
cb10: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f CTX_set_default_
cb20: 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 passwd_cb(ctx, P
cb30: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 asswordCallback)
cb40: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 ;. SSL_CTX_se
cb50: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 t_default_passwd
cb60: 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 _cb_userdata(ctx
cb70: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
cb80: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 tr);.. /* rea
cb90: 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d d a Diffie-Hellm
cba0: 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 an parameters fi
cbb0: 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 le, or use the b
cbc0: 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 uilt-in one */.#
cbd0: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f ifdef OPENSSL_NO
cbe0: 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 _DH. if (DHpa
cbf0: 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a rams != NULL) {.
cc00: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
cc10: 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 t(interp, "DH pa
cc20: 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 rameter support
cc30: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 not available",
cc40: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
cc50: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
cc60: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c x);..return NULL
cc70: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 ;. }.#else.
cc80: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 {..DH* dh;..if
cc90: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 (DHparams != NU
cca0: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a LL) {.. BIO *
ccb0: 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 bio;.. Tcl_DS
ccc0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a tringInit(&ds);.
ccd0: 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e . bio = BIO_n
cce0: 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 ew_file(F2N(DHpa
ccf0: 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 rams, &ds), "r")
cd00: 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 ;.. if (!bio)
cd10: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 {...Tcl_DString
cd20: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c Free(&ds);...Tcl
cd30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
cd40: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
cd50: 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 find DH paramet
cd60: 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 ers file", (char
cd70: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
cd80: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
cd90: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
cda0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d }... dh =
cdb0: 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 PEM_read_bio_DH
cdc0: 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c params(bio, NULL
cdd0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 , NULL, NULL);..
cde0: 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f BIO_free(bio
cdf0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 );.. Tcl_DStr
ce00: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 ingFree(&ds);..
ce10: 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 if (!dh) {...
ce20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
ce30: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 (interp, "Could
ce40: 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 not read DH para
ce50: 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 meters from file
ce60: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
ce70: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 );...SSL_CTX_fre
ce80: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e e(ctx);...return
ce90: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d NULL;.. }..}
cea0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 else {.. dh
ceb0: 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 = get_dhParams()
cec0: 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ;..}..SSL_CTX_se
ced0: 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 t_tmp_dh(ctx, dh
cee0: 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b );..DH_free(dh);
cef0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
cf00: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 /* set our ce
cf10: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 rtificate */.
cf20: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 load_private_ke
cf30: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 y = 0;. if (c
cf40: 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 ertfile != NULL)
cf50: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 {..load_private
cf60: 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f _key = 1;...Tcl_
cf70: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
cf80: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f ;...if (SSL_CTX_
cf90: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f use_certificate_
cfa0: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 file(ctx, F2N(ce
cfb0: 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 rtfile, &ds), SS
cfc0: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 L_FILETYPE_PEM)
cfd0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c <= 0) {.. Tcl
cfe0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
cff0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
d000: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d010: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
d020: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 certificate file
d030: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a ", certfile, ":
d040: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 ",.... REAS
d050: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
d060: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
d070: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
d080: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
d090: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 .}. } else if
d0a0: 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 (cert != NULL)
d0b0: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f {..load_private_
d0c0: 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 key = 1;..if (SS
d0d0: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 L_CTX_use_certif
d0e0: 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 icate_ASN1(ctx,
d0f0: 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 cert_len, cert)
d100: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c <= 0) {.. Tcl
d110: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
d120: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
d130: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d140: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
d150: 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a certificate: ",.
d160: 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 ... REASON()
d170: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
d180: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
d190: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
d1a0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 eturn NULL;..}.
d1b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 } else {..cer
d1c0: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 tfile = (char*)X
d1d0: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 509_get_default_
d1e0: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 cert_file();...i
d1f0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 f (SSL_CTX_use_c
d200: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 ertificate_file(
d210: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 ctx, certfile, S
d220: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 SL_FILETYPE_PEM)
d230: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 <= 0) {.#if 0..
d240: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
d250: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
d260: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
d270: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
d280: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 to use default c
d290: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 ertificate file
d2a0: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 ", certfile, ":
d2b0: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f ",.... REASO
d2c0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
d2d0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
d2e0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
d2f0: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 return NULL;.#
d300: 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a endif..}. }..
d310: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 /* set our p
d320: 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 rivate key */.
d330: 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 if (load_priva
d340: 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b te_key) {..if (k
d350: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 eyfile == NULL &
d360: 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b & key == NULL) {
d370: 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 .. keyfile =
d380: 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 certfile;..}...i
d390: 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 f (keyfile != NU
d3a0: 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 LL) {.. /* ge
d3b0: 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 t the private ke
d3c0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
d3d0: 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 h this certifica
d3e0: 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b te */.. if (k
d3f0: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 eyfile == NULL)
d400: 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 {...keyfile = ce
d410: 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a rtfile;.. }..
d420: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 . if (SSL_CTX
d430: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f _use_PrivateKey_
d440: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 file(ctx, F2N(ke
d450: 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c yfile, &ds), SSL
d460: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
d470: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 = 0) {...Tcl_DSt
d480: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
d490: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 ./* flush the pa
d4a0: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d ssphrase which m
d4b0: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 ight be left in
d4c0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 the result */...
d4d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
d4e0: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f terp, NULL, TCL_
d4f0: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 STATIC);...Tcl_A
d500: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
d510: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
d520: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 et public key fi
d530: 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 le ", keyfile, "
d540: 20 22 2c 0a 09 09 09 20 20 20 20 20 20 20 20 20 ",....
d550: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
d560: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
d570: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
d580: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
d590: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 }.. Tcl_DS
d5a0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
d5b0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 ..} else if (key
d5c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
d5d0: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 if (SSL_CTX_use
d5e0: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 _PrivateKey_ASN1
d5f0: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 (EVP_PKEY_RSA, c
d600: 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 tx, key,key_len)
d610: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 <= 0) {...Tcl_D
d620: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
d630: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 .../* flush the
d640: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 passphrase which
d650: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 might be left i
d660: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a n the result */.
d670: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
d680: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 interp, NULL, TC
d690: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c L_STATIC);...Tcl
d6a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
d6b0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
d6c0: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a set public key:
d6d0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 ", REASON(), (c
d6e0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 har *) NULL);...
d6f0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
d700: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
d710: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 ;.. }..}../*
d720: 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 Now we know that
d730: 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 a key and cert
d740: 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 have been set ag
d750: 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 ainst.. * the SS
d760: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 L context */..if
d770: 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b (!SSL_CTX_check
d780: 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 _private_key(ctx
d790: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
d7a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d7b0: 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 p, "private key
d7c0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 does not match t
d7d0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70 he certificate p
d7e0: 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 ublic key",....
d7f0: 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (char *) NUL
d800: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 L);.. SSL_CTX
d810: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 _free(ctx);..
d820: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
d830: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
d840: 65 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 et verification
d850: 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 CAs */. Tcl_D
d860: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
d870: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
d880: 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 Init(&ds1);.
d890: 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 /* There is one
d8a0: 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 default director
d8b0: 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 66 y, one default f
d8c0: 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64 65 66 ile, and one def
d8d0: 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54 68 65 ault store...The
d8e0: 20 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 default CA cert
d8f0: 69 66 69 63 61 74 65 73 20 64 69 72 65 63 74 6f ificates directo
d900: 72 79 20 28 61 6e 64 20 64 65 66 61 75 6c 74 20 ry (and default
d910: 73 74 6f 72 65 29 20 69 73 20 69 6e 20 74 68 65 store) is in the
d920: 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74 73 20 OpenSSL..certs
d930: 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 directory. It ca
d940: 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 n be overridden
d950: 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f by the SSL_CERT_
d960: 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 DIR env var. The
d970: 0a 09 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 ..default CA cer
d980: 74 69 66 69 63 61 74 65 73 20 66 69 6c 65 20 69 tificates file i
d990: 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e 70 65 s called cert.pe
d9a0: 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74 m in the default
d9b0: 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65 63 74 OpenSSL..direct
d9c0: 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f ory. It can be o
d9d0: 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 verridden by the
d9e0: 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 SSL_CERT_FILE e
d9f0: 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 69 nv var. */../* i
da00: 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 nt SSL_CTX_set_d
da10: 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 64 69 efault_verify_di
da20: 72 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 r(SSL_CTX *ctx)
da30: 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f and int SSL_CTX_
da40: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 set_default_veri
da50: 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54 58 20 fy_file(SSL_CTX
da60: 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20 69 66 20 *ctx) */. if
da70: 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 (!SSL_CTX_load_v
da80: 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 erify_locations(
da90: 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c ctx, F2N(CAfile,
daa0: 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 &ds), F2N(CAdir
dab0: 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 , &ds1)) ||..!SS
dac0: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c L_CTX_set_defaul
dad0: 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 t_verify_paths(c
dae0: 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 tx)) {.#if 0..Tc
daf0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
db00: 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 s);..Tcl_DString
db10: 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 Free(&ds1);../*
db20: 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 Don't currently
db30: 63 61 72 65 20 69 66 20 74 68 69 73 20 66 61 69 care if this fai
db40: 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e ls */..Tcl_Appen
db50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
db60: 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 "SSL default ver
db70: 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45 ify paths: ", RE
db80: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
db90: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 NULL);..SSL_CTX
dba0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 _free(ctx);..ret
dbb0: 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 urn NULL;.#endif
dbc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 . }.. /* h
dbd0: 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 ttps://sourcefor
dbe0: 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 ge.net/p/tls/bug
dbf0: 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 s/57/ */. /*
dc00: 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 XXX:TODO: Let th
dc10: 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 e user supply va
dc20: 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 lues here instea
dc30: 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 d of something t
dc40: 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 hat exists on th
dc50: 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a e filesystem */.
dc60: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 21 if (CAfile !
dc70: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b = NULL) {..STACK
dc80: 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a _OF(X509_NAME) *
dc90: 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f certNames = SSL_
dca0: 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 load_client_CA_f
dcb0: 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 ile(F2N(CAfile,
dcc0: 26 64 73 29 29 3b 0a 09 69 66 20 28 63 65 72 74 &ds));..if (cert
dcd0: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b Names != NULL) {
dce0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 .. SSL_CTX_se
dcf0: 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 t_client_CA_list
dd00: 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 (ctx, certNames)
dd10: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
dd20: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
dd30: 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 &ds);. Tcl_DS
dd40: 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b tringFree(&ds1);
dd50: 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b . return ctx;
dd60: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
dd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
ddb0: 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 . * StatusObjCmd
ddc0: 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 -- return certi
ddd0: 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 ficate for conne
dde0: 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a cted peer.. *. *
ddf0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
de00: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
de10: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
de20: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
de30: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
de40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
de80: 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f atic int.StatusO
de90: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
dea0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
deb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
dec0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
ded0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
dee0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
def0: 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 tatePtr;. X50
df00: 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 9 *peer;. Tcl
df10: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 _Obj *objPtr;.
df20: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
df30: 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 an;. char *ch
df40: 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 annelName, *ciph
df50: 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 ers;. int mod
df60: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 e;. const uns
df70: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 igned char *prot
df80: 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 o;. unsigned
df90: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 int len;. int
dfa0: 20 6e 69 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 nid, res;..
dfb0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
dfc0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
dfd0: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 < 2 || objc > 3
dfe0: 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 || (objc == 3 &
dff0: 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 & !strcmp(Tcl_Ge
e000: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
e010: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a , "-local"))) {.
e020: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
e030: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
e040: 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 v, "?-local? cha
e050: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 nnel");..return
e060: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
e070: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 .. /* Get cha
e080: 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 nnel Id */. c
e090: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c hannelName = Tcl
e0a0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
e0b0: 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 j(objv[(objc ==
e0c0: 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20 4e 55 4c 2 ? 1 : 2)], NUL
e0d0: 4c 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 L);. chan = T
e0e0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
e0f0: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d terp, channelNam
e100: 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 e, &mode);. i
e110: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
e120: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
e130: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
e140: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
e150: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f * Make sure to o
e160: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f perate on the to
e170: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f pmost channel */
e180: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
e190: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 GetTopChannel(ch
e1a0: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c an);. if (Tcl
e1b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
e1c0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 chan) != Tls_Cha
e1d0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 nnelType()) {..T
e1e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
e1f0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
e200: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
e210: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
e220: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 n),..."\": not a
e230: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e TLS channel", N
e240: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 ULL);..Tcl_SetEr
e250: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
e260: 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c "TLS", "STATUS",
e270: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
e280: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
e290: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
e2a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
e2b0: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
e2c0: 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 State *) Tcl_Get
e2d0: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
e2e0: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ata(chan);..
e2f0: 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 /* Get certifica
e300: 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 te for peer or s
e310: 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f elf */. if (o
e320: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 bjc == 2) {..pee
e330: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 r = SSL_get_peer
e340: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 _certificate(sta
e350: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
e360: 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 } else {..peer
e370: 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 = SSL_get_certif
e380: 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e icate(statePtr->
e390: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ssl);. }..
e3a0: 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 /* Get X509 cer
e3b0: 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f tificate info */
e3c0: 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b . if (peer) {
e3d0: 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e ..objPtr = Tls_N
e3e0: 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 ewX509Obj(interp
e3f0: 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 , peer);..if (ob
e400: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 jc == 2) {..
e410: 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b X509_free(peer);
e420: 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c .. peer = NUL
e430: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 L;..}. } else
e440: 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c {..objPtr = Tcl
e450: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
e460: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ULL);. }..
e470: 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f /* Peer name */
e480: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 . LAPPEND_STR
e490: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
e4a0: 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c "peername", SSL
e4b0: 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 _get0_peername(s
e4c0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d tatePtr->ssl), -
e4d0: 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 1);. LAPPEND_
e4e0: 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
e4f0: 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c tr, "sbits", SSL
e500: 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 _get_cipher_bits
e510: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
e520: 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 NULL));.. cip
e530: 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 hers = (char*)SS
e540: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 L_get_cipher(sta
e550: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
e560: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
e570: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
e580: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 pher", ciphers,
e590: 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 -1);.. /* Ver
e5a0: 69 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 ify the X509 cer
e5b0: 74 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 tificate present
e5c0: 65 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a ed by the peer *
e5d0: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 /. LAPPEND_ST
e5e0: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
e5f0: 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 , "verifyResult"
e600: 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 ,..X509_verify_c
e610: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
e620: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f (SSL_get_verify_
e630: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d result(statePtr-
e640: 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 >ssl)), -1);..
e650: 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 /* Verify mode
e660: 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 */. mode = S
e670: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f SL_get_verify_mo
e680: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c de(statePtr->ssl
e690: 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 );. if (mode
e6a0: 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f && SSL_VERIFY_NO
e6b0: 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 NE) {..LAPPEND_S
e6c0: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
e6d0: 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c r, "verifyMode",
e6e0: 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 "none", -1);.
e6f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f } else {..Tcl_
e700: 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 Obj *listObjPtr
e710: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
e720: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 (0, NULL);..if (
e730: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
e740: 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 FY_PEER) {..
e750: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e760: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e770: 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
e780: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
e790: 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 eer", -1));..}..
e7a0: 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
e7b0: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e VERIFY_FAIL_IF_N
e7c0: 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 O_PEER_CERT) {..
e7d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
e7e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e7f0: 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
e800: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e810: 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 j("fail if no pe
e820: 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a er cert", -1));.
e830: 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 .}..if (mode &&
e840: 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e SSL_VERIFY_CLIEN
e850: 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 T_ONCE) {.. T
e860: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
e870: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
e880: 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f listObjPtr, Tcl_
e890: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c NewStringObj("cl
e8a0: 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 ient once", -1))
e8b0: 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 ;..}..if (mode &
e8c0: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 & SSL_VERIFY_POS
e8d0: 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 T_HANDSHAKE) {..
e8e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
e8f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
e900: 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c erp, listObjPtr,
e910: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e920: 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b j("post handshak
e930: 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 e", -1));..}..LA
e940: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
e950: 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 , objPtr, "verif
e960: 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 yMode", listObjP
e970: 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f tr). }.. /
e980: 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 * Verify mode de
e990: 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 pth */. LAPPE
e9a0: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
e9b0: 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 bjPtr, "verifyDe
e9c0: 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 pth", SSL_get_ve
e9d0: 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 rify_depth(state
e9e0: 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 Ptr->ssl));..
e9f0: 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 /* Report the s
ea00: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c elected protocol
ea10: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 as a result of
ea20: 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 the negotiation
ea30: 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f */. SSL_get0_
ea40: 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 alpn_selected(st
ea50: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 atePtr->ssl, &pr
ea60: 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 oto, &len);.
ea70: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
ea80: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 rp, objPtr, "alp
ea90: 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 n", (char *)prot
eaa0: 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 o, (int) len);.
eab0: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
eac0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
ead0: 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 protocol", SSL_g
eae0: 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 et_version(state
eaf0: 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a Ptr->ssl), -1);.
eb00: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f . /* Valid fo
eb10: 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 r non-RSA signat
eb20: 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 ure and TLS 1.3
eb30: 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 */. if (objc
eb40: 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 == 2) {..res = S
eb50: 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e SL_get_peer_sign
eb60: 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 ature_nid(stateP
eb70: 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a tr->ssl, &nid);.
eb80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
eb90: 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e s = SSL_get_sign
eba0: 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 ature_nid(stateP
ebb0: 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a tr->ssl, &nid);.
ebc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 }. if (!r
ebd0: 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 es) {nid = 0;}.
ebe0: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
ebf0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
ec00: 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 signatureHashAlg
ec10: 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 orithm", OBJ_nid
ec20: 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 2ln(nid), -1);..
ec30: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
ec40: 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 2) {..res = SSL_
ec50: 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 get_peer_signatu
ec60: 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 re_type_nid(stat
ec70: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 ePtr->ssl, &nid)
ec80: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
ec90: 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 res = SSL_get_si
eca0: 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 gnature_type_nid
ecb0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
ecc0: 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 &nid);. }.
ecd0: 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 if (!res) {nid
ece0: 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e = 0;}. LAPPEN
ecf0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
ed00: 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 jPtr, "signature
ed10: 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c Type", OBJ_nid2l
ed20: 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 n(nid), -1);..
ed30: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
ed40: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
ed50: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
ed60: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
ed70: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
ed80: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
ed90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
edb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
edc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
edd0: 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e . * ConnectionIn
ede0: 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 foObjCmd -- retu
edf0: 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e rn connection in
ee00: 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e fo from OpenSSL.
ee10: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
ee20: 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e *.A list of con
ee30: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a nection info. *
ee40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
ee50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ee60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ee70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ee80: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
ee90: 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f ic int Connectio
eea0: 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 nInfoObjCmd(Clie
eeb0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
eec0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
eed0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
eee0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
eef0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 objv[]) {. Tc
ef00: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
ef10: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
ef20: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e to set a mode on
ef30: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 */. State *s
ef40: 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 tatePtr;../* cli
ef50: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 ent state for ss
ef60: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 l socket */.
ef70: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c Tcl_Obj *objPtr,
ef80: 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 *listPtr;. c
ef90: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 onst SSL *ssl;.
efa0: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 const SSL_CIP
efb0: 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 HER *cipher;.
efc0: 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 const SSL_SESSI
efd0: 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 ON *session;.
efe0: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d const EVP_MD *m
eff0: 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 d;.. if (objc
f000: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
f010: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
f020: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
f030: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 nnel");..return(
f040: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 TCL_ERROR);.
f050: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 }.. chan = Tc
f060: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
f070: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
f080: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 ngFromObj(objv[1
f090: 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b ], NULL), NULL);
f0a0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
f0b0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
f0c0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 ULL) {..return(T
f0d0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d CL_ERROR);. }
f0e0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
f0f0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
f100: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
f110: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
f120: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
f130: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 nnel(chan);.
f140: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
f150: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
f160: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
f170: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 )) {..Tcl_Append
f180: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
f190: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c bad channel \"",
f1a0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e Tcl_GetChannelN
f1b0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 ame(chan),..
f1c0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 "\": not a TLS c
f1d0: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a hannel", NULL);.
f1e0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
f1f0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
f200: 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 "CONNECTION", "
f210: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
f220: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
f230: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c LL);..return(TCL
f240: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a _ERROR);. }..
f250: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
f260: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
f270: 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f ULL);.. /* Co
f280: 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f nnection info */
f290: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 . statePtr =
f2a0: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 (State *)Tcl_Get
f2b0: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
f2c0: 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 ata(chan);. s
f2d0: 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 sl = statePtr->s
f2e0: 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 sl;. if (ssl
f2f0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 != NULL) {../* c
f300: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 onnection state
f310: 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
f320: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f330: 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 "state", SSL_sta
f340: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 te_string_long(s
f350: 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 sl), -1);.../* G
f360: 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 et SNI requested
f370: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a server name */.
f380: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
f390: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
f3a0: 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 rvername", SSL_g
f3b0: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 et_servername(ss
f3c0: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 l, TLSEXT_NAMETY
f3d0: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d PE_host_name), -
f3e0: 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 1);.../* Get pro
f3f0: 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e tocol */..LAPPEN
f400: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
f410: 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 jPtr, "protocol"
f420: 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f , SSL_get_versio
f430: 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f n(ssl), -1);.../
f440: 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 * Renegotiation
f450: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 allowed */..LAPP
f460: 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
f470: 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f objPtr, "renego
f480: 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 tiation_allowed"
f490: 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 , SSL_get_secure
f4a0: 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 _renegotiation_s
f4b0: 75 70 70 6f 72 74 28 73 73 6c 29 29 3b 0a 0a 09 upport(ssl));...
f4c0: 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20 /* Get security
f4d0: 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e level */..LAPPEN
f4e0: 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
f4f0: 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f jPtr, "security_
f500: 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f level", SSL_get_
f510: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 security_level(s
f520: 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 sl));.../* Sessi
f530: 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 on info */..LAPP
f540: 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
f550: 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f objPtr, "sessio
f560: 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 n_reused", SSL_s
f570: 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 ession_reused(ss
f580: 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 l));.../* Is ser
f590: 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 ver info */..LAP
f5a0: 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
f5b0: 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 , objPtr, "is_se
f5c0: 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 rver", SSL_is_se
f5d0: 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a rver(ssl));.../*
f5e0: 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 Is DTLS */..LAP
f5f0: 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 PEND_BOOL(interp
f600: 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 , objPtr, "is_dt
f610: 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 ls", SSL_is_dtls
f620: 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 (ssl));. }..
f630: 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 /* Cipher inf
f640: 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 o */. cipher
f650: 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
f660: 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 t_cipher(ssl);.
f670: 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d if (cipher !=
f680: 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 NULL) {..char b
f690: 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d uf[BUFSIZ] = {0}
f6a0: 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 ;..int bits, alg
f6b0: 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 _bits;.../* Ciph
f6c0: 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 er name */..LAPP
f6d0: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
f6e0: 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 objPtr, "cipher"
f6f0: 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 , SSL_CIPHER_get
f700: 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d _name(cipher), -
f710: 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 1);.../* RFC nam
f720: 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 e of cipher */..
f730: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
f740: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 rp, objPtr, "sta
f750: 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c ndard_name", SSL
f760: 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 _CIPHER_standard
f770: 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d _name(cipher), -
f780: 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 1);.../* OpenSSL
f790: 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 name of cipher
f7a0: 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
f7b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f7c0: 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 "openssl_name",
f7d0: 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e OPENSSL_cipher_n
f7e0: 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 ame(SSL_CIPHER_s
f7f0: 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 tandard_name(cip
f800: 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a her)), -1);.../*
f810: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65 number of secre
f820: 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20 t bits used for
f830: 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 cipher */..bits
f840: 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 = SSL_CIPHER_get
f850: 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 _bits(cipher, &a
f860: 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 lg_bits);..LAPPE
f870: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
f880: 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62 bjPtr, "secret_b
f890: 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 its", bits);..LA
f8a0: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
f8b0: 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 , objPtr, "algor
f8c0: 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f ithm_bits", alg_
f8d0: 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 bits);../* alg_b
f8e0: 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 its is actual ke
f8f0: 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 y secret bits. I
f900: 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 f use bits and s
f910: 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d ecret (algorithm
f920: 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09 ) bits differ,..
f930: 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 the rest of t
f940: 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65 he bits are fixe
f950: 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 d, i.e. for limi
f960: 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 ted export ciphe
f970: 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a rs (bits < 56) *
f980: 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 /.../* Indicates
f990: 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 which SSL/TLS p
f9a0: 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 rotocol version
f9b0: 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68 first defined th
f9c0: 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 e cipher */..LAP
f9d0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
f9e0: 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 objPtr, "min_ve
f9f0: 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 rsion", SSL_CIPH
fa00: 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 ER_get_version(c
fa10: 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f ipher), -1);.../
fa20: 2a 20 43 69 70 68 65 72 20 4e 49 44 2c 20 64 69 * Cipher NID, di
fa30: 67 65 73 74 20 4e 49 44 20 28 6e 6f 6e 65 20 66 gest NID (none f
fa40: 6f 72 20 41 45 41 44 20 63 69 70 68 65 72 20 73 or AEAD cipher s
fa50: 75 69 74 65 73 29 2c 20 4b 65 79 20 45 78 63 68 uites), Key Exch
fa60: 61 6e 67 65 20 4e 49 44 2c 20 61 6e 64 20 61 75 ange NID, and au
fa70: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 4e 49 44 thentication NID
fa80: 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 */..LAPPEND_STR
fa90: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
faa0: 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 "cipherNID", (c
fab0: 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e har *)OBJ_nid2ln
fac0: 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
fad0: 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 cipher_nid(ciphe
fae0: 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 r)), -1);..LAPPE
faf0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
fb00: 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 bjPtr, "digestNI
fb10: 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f D", (char *)OBJ_
fb20: 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 nid2ln(SSL_CIPHE
fb30: 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 R_get_digest_nid
fb40: 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a (cipher)), -1);.
fb50: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
fb60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 erp, objPtr, "ke
fb70: 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 yExchangeNID", (
fb80: 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c char *)OBJ_nid2l
fb90: 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 n(SSL_CIPHER_get
fba0: 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 _kx_nid(cipher))
fbb0: 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
fbc0: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
fbd0: 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 tr, "authenticat
fbe0: 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a ionNID", (char *
fbf0: 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f )OBJ_nid2ln(SSL_
fc00: 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f CIPHER_get_auth_
fc10: 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
fc20: 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 );.../* message
fc30: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 authentication c
fc40: 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 ode - Cipher is
fc50: 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f AEAD (e.g. GCM o
fc60: 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 r ChaCha20/Poly1
fc70: 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 305) or not */..
fc80: 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 /* Authenticated
fc90: 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 Encryption with
fca0: 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 associated data
fcb0: 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f (AEAD) check */
fcc0: 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 ..LAPPEND_BOOL(i
fcd0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
fce0: 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c cipher_is_aead",
fcf0: 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 SSL_CIPHER_is_a
fd00: 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 ead(cipher));...
fd10: 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 /* Get OpenSSL-s
fd20: 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 pecific ID, not
fd30: 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 IANA ID */..LAPP
fd40: 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 END_INT(interp,
fd50: 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f objPtr, "cipher_
fd60: 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 id", (int) SSL_C
fd70: 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 IPHER_get_id(cip
fd80: 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d her));.../* Two-
fd90: 62 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 byte ID used in
fda0: 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c the TLS protocol
fdb0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 of the given ci
fdc0: 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 pher */..LAPPEND
fdd0: 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
fde0: 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 Ptr, "protocol_i
fdf0: 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 d", (int) SSL_CI
fe00: 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f PHER_get_protoco
fe10: 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a l_id(cipher));..
fe20: 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 ./* Textual desc
fe30: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 ription of the c
fe40: 69 70 68 65 72 2e 20 49 6e 63 6c 75 64 65 73 3a ipher. Includes:
fe50: 20 63 69 70 68 65 72 20 6e 61 6d 65 2c 20 70 72 cipher name, pr
fe60: 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 2c 20 otocol version,
fe70: 6b 65 79 0a 09 20 20 20 65 78 63 68 61 6e 67 65 key.. exchange
fe80: 2c 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e , authentication
fe90: 2c 20 73 79 6d 6d 65 74 72 69 63 20 65 6e 63 72 , symmetric encr
fea0: 79 70 74 69 6f 6e 20 6d 65 74 68 6f 64 2c 20 6d yption method, m
feb0: 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 essage authentic
fec0: 61 74 69 6f 6e 20 63 6f 64 65 20 2a 2f 0a 09 69 ation code */..i
fed0: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 f (SSL_CIPHER_de
fee0: 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 scription(cipher
fef0: 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 , buf, sizeof(bu
ff00: 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 f)) != NULL) {..
ff10: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
ff20: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ff30: 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 "description", b
ff40: 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a uf, -1);..}.../*
ff50: 20 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72 Digest used dur
ff60: 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 ing the SSL/TLS
ff70: 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 handshake when u
ff80: 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e sing the cipher.
ff90: 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 */..md = SSL_CI
ffa0: 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 PHER_get_handsha
ffb0: 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 ke_digest(cipher
ffc0: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
ffd0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
ffe0: 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 "handshake_diges
fff0: 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f t", (char *)EVP_
10000 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 MD_name(md), -1)
10010 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
10020 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a Session info */.
10030 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 session = SS
10040 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 L_get_session(ss
10050 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 l);. if (sess
10060 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ion != NULL) {..
10070 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
10080 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 har *ticket;..si
10090 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 ze_t len2;..unsi
100a0 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 gned int ulen;..
100b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
100c0 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c har *session_id,
100d0 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 61 72 20 62 *proto;..char b
100e0 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 uffer[SSL_MAX_MA
100f0 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d STER_KEY_LENGTH]
10100 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 ;.../* Report th
10110 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f e selected proto
10120 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 col as a result
10130 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f of the ALPN nego
10140 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f tiation */..SSL_
10150 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 SESSION_get0_alp
10160 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 n_selected(sessi
10170 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e on, &proto, &len
10180 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 2);..LAPPEND_STR
10190 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
101a0 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a "alpn", (char *
101b0 29 20 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c ) proto, (int) l
101c0 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 en2);.../* Repor
101d0 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 t the selected p
101e0 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 rotocol as a res
101f0 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e ult of the NPN n
10200 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 egotiation */.#i
10210 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 fdef USE_NPN..SS
10220 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 L_get0_next_prot
10230 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c o_negotiated(ssl
10240 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 , &proto, &ulen)
10250 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
10260 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10270 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 npn", (char *) p
10280 72 6f 74 6f 2c 20 28 69 6e 74 29 20 75 6c 65 6e roto, (int) ulen
10290 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 );.#endif.../* R
102a0 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e esumable session
102b0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f */..LAPPEND_BOO
102c0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 L(interp, objPtr
102d0 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 , "resumable", S
102e0 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 SL_SESSION_is_re
102f0 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 sumable(session)
10300 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 );.../* Session
10310 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f start time (seco
10320 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 nds since epoch)
10330 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e */..LAPPEND_LON
10340 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 G(interp, objPtr
10350 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 , "start_time",
10360 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
10370 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a time(session));.
10380 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c ../* Timeout val
10390 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 ue - SSL_CTX_get
103a0 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 _timeout (in sec
103b0 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e onds) */..LAPPEN
103c0 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f D_LONG(interp, o
103d0 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 bjPtr, "timeout"
103e0 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 , SSL_SESSION_ge
103f0 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f t_timeout(sessio
10400 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f n));.../* Sessio
10410 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 n id - TLSv1.2 a
10420 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f nd below only */
10430 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 ..session_id = S
10440 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 SL_SESSION_get_i
10450 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e d(session, &ulen
10460 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
10470 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
10480 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c r, "session_id",
10490 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e session_id, (in
104a0 74 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 t) ulen);.../* S
104b0 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a ession context *
104c0 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 /..session_id =
104d0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 SSL_SESSION_get0
104e0 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 _id_context(sess
104f0 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 ion, &ulen);..LA
10500 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
10510 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
10520 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 ssion_context",
10530 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 session_id, (int
10540 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 ) ulen);.../* Se
10550 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 ssion ticket - c
10560 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 lient only */..S
10570 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
10580 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 ticket(session,
10590 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
105a0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
105b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
105c0 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 "session_ticket
105d0 22 2c 20 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 ", ticket, (int)
105e0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 len2);.../* Ses
105f0 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 sion ticket life
10600 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 time hint (in se
10610 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 conds) */..LAPPE
10620 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 ND_LONG(interp,
10630 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d objPtr, "lifetim
10640 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f e", SSL_SESSION_
10650 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 get_ticket_lifet
10660 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e ime_hint(session
10670 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 ));.../* Ticket
10680 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c app data */..SSL
10690 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 _SESSION_get0_ti
106a0 63 6b 65 74 5f 61 70 70 64 61 74 61 28 73 65 73 cket_appdata(ses
106b0 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 sion, &ticket, &
106c0 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f len2);..LAPPEND_
106d0 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f BARRAY(interp, o
106e0 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 bjPtr, "ticket_a
106f0 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 pp_data", ticket
10700 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a , (int) len2);..
10710 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b ./* Get master k
10720 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 ey */..len2 = SS
10730 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 L_SESSION_get_ma
10740 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e ster_key(session
10750 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 , buffer, SSL_MA
10760 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e X_MASTER_KEY_LEN
10770 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 GTH);..LAPPEND_B
10780 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 ARRAY(interp, ob
10790 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 jPtr, "master_ke
107a0 79 22 2c 20 62 75 66 66 65 72 2c 20 28 69 6e 74 y", buffer, (int
107b0 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f ) len2);.../* Co
107c0 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a mpression id */.
107d0 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 .unsigned int id
107e0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 = SSL_SESSION_g
107f0 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 et_compress_id(s
10800 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e ession);..LAPPEN
10810 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10820 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
10830 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 on_id", id == 1
10840 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 ? "zlib" : "none
10850 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 ", -1);. }..
10860 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f /* Compressio
10870 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 n info */. if
10880 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b (ssl != NULL) {
10890 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c .#ifdef HAVE_SSL
108a0 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f _COMPRESSION..co
108b0 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 nst COMP_METHOD
108c0 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 *comp, *expn;..c
108d0 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 omp = SSL_get_cu
108e0 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f rrent_compressio
108f0 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 n(ssl);..expn =
10900 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f SSL_get_current_
10910 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a expansion(ssl);.
10920 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
10930 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
10940 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d ompression", com
10950 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 p ? SSL_COMP_get
10960 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e _name(comp) : "n
10970 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 one", -1);..LAPP
10980 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10990 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 objPtr, "expansi
109a0 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f on", expn ? SSL_
109b0 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 COMP_get_name(ex
109c0 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 pn) : "none", -1
109d0 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e );.#else..LAPPEN
109e0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
109f0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 jPtr, "compressi
10a00 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 on", "none", -1)
10a10 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
10a20 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10a30 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e expansion", "non
10a40 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a e", -1);.#endif.
10a50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 }.. /* Se
10a60 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 rver info */.
10a70 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 {..long mode =
10a80 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 SSL_CTX_get_sess
10a90 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 ion_cache_mode(s
10aa0 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 tatePtr->ctx);..
10ab0 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 char *msg;...if
10ac0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 (mode & SSL_SESS
10ad0 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 _CACHE_OFF) {..
10ae0 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a msg = "off";.
10af0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 .} else if (mode
10b00 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
10b10 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 E_CLIENT) {..
10b20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b msg = "client";
10b30 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 ..} else if (mod
10b40 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 e & SSL_SESS_CAC
10b50 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 HE_SERVER) {..
10b60 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 msg = "server"
10b70 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f ;..} else if (mo
10b80 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
10b90 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 CHE_BOTH) {..
10ba0 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 msg = "both";..
10bb0 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 } else {.. ms
10bc0 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 g = "unknown";..
10bd0 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 }..LAPPEND_STR(i
10be0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10bf0 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f session_cache_mo
10c00 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 de", msg, -1);.
10c10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 }.. /* CA
10c20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 List */. /* I
10c30 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 F not a server,
10c40 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 same as SSL_get0
10c50 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 _peer_CA_list. I
10c60 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 f server same as
10c70 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 SSL_CTX_get_cli
10c80 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 ent_CA_list */.
10c90 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c listPtr = Tcl
10ca0 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e _NewListObj(0, N
10cb0 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f ULL);. STACK_
10cc0 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 OF(X509_NAME) *c
10cd0 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 a_list;. if (
10ce0 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 (ca_list = SSL_g
10cf0 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 et_client_CA_lis
10d00 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 t(ssl)) != NULL)
10d10 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b {..char buffer[
10d20 42 55 46 53 49 5a 5d 3b 0a 0a 09 66 6f 72 20 28 BUFSIZ];...for (
10d30 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 int i = 0; i < s
10d40 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 k_X509_NAME_num(
10d50 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b ca_list); i++) {
10d60 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 .. X509_NAME
10d70 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f *name = sk_X509_
10d80 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 NAME_value(ca_li
10d90 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 st, i);.. if
10da0 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f (name) {...X509_
10db0 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d NAME_oneline(nam
10dc0 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 e, buffer, BUFSI
10dd0 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 Z);...Tcl_ListOb
10de0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
10df0 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 nterp, listPtr,
10e00 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
10e10 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 (buffer, -1));..
10e20 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 }..}. }.
10e30 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 LAPPEND_OBJ(i
10e40 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10e50 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 caList", listPtr
10e60 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 );. LAPPEND_I
10e70 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
10e80 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 r, "caListCount"
10e90 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e , sk_X509_NAME_n
10ea0 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 0a um(ca_list));...
10eb0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
10ec0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
10ed0 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
10ee0 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
10ef0 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
10f00 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
10f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
10f50 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 *. * MiscObjCmd
10f60 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 -- misc command
10f70 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
10f80 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
10f90 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
10fa0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
10fb0 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
10fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11000 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
11010 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e MiscObjCmd(Clien
11020 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
11030 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
11040 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
11050 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
11060 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 bjv[]) {. sta
11070 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
11080 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 commands [] = {
11090 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c "req", "strreq",
110a0 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 NULL };. enu
110b0 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 m command { C_RE
110c0 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 Q, C_STRREQ, C_D
110d0 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 UMMY };. int
110e0 63 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 cmd, isStr;.
110f0 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 char buffer[1638
11100 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 4];.. dprintf
11110 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
11120 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b if (objc < 2) {
11130 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
11140 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
11150 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 jv, "subcommand
11160 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 ?args?");..retur
11170 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
11180 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 }. if (Tcl_G
11190 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 etIndexFromObj(i
111a0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 nterp, objv[1],
111b0 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 commands, "comma
111c0 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d nd", 0, &cmd) !=
111d0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
111e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
111f0 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
11200 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
11210 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d isStr = (cmd ==
11220 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 C_STRREQ);.
11230 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f switch ((enum co
11240 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 mmand) cmd) {..c
11250 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 ase C_REQ:..case
11260 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 C_STRREQ: {..
11270 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 EVP_PKEY *pkey
11280 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
11290 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 *cert=NULL;..
112a0 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d X509_NAME *nam
112b0 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c e=NULL;.. Tcl
112c0 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 _Obj **listv;..
112d0 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a int listc,i;.
112e0 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e .. BIO *out=N
112f0 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 ULL;... char
11300 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 *k_C="",*k_ST=""
11310 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 ,*k_L="",*k_O=""
11320 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d ,*k_OU="",*k_CN=
11330 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a "",*k_Email="";.
11340 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 . char *keyou
11350 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a t,*pemout,*str;.
11360 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 . int keysize
11370 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 ,serial=0,days=3
11380 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 65;..#if OPENSSL
11390 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
113a0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
113b0 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d BIGNUM *bne =
113c0 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 NULL;.. RSA
113d0 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c *rsa = NULL;.#el
113e0 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 se.. EVP_PKEY
113f0 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
11400 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 ;.#endif... i
11410 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 f ((objc<5) || (
11420 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c objc>6)) {...Tcl
11430 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
11440 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
11450 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 keysize keyfile
11460 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 certfile ?info?"
11470 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
11480 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 ERROR;.. }...
11490 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
114a0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
114b0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 , objv[2], &keys
114c0 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ize) != TCL_OK)
114d0 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {...return TCL_E
114e0 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
114f0 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 keyout=Tcl_Get
11500 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b String(objv[3]);
11510 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c .. pemout=Tcl
11520 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
11530 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 4]);.. if (is
11540 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 Str) {...Tcl_Set
11550 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
11560 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 t,"",0);...Tcl_S
11570 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
11580 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 out,"",0);..
11590 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 }... if (objc
115a0 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c >=6) {...if (Tcl
115b0 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
115c0 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 nts(interp, objv
115d0 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 [5],....&listc,
115e0 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f &listv) != TCL_O
115f0 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 K) {... retur
11600 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
11610 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 ....if ((listc%2
11620 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 ) != 0) {...
11630 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
11640 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f terp,"Informatio
11650 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 n list must have
11660 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 even number of
11670 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 arguments",NULL)
11680 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
11690 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 CL_ERROR;...}...
116a0 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 for (i=0; i<list
116b0 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 c; i+=2) {...
116c0 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 str=Tcl_GetStri
116d0 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 ng(listv[i]);...
116e0 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 if (strcmp(s
116f0 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b tr,"days")==0) {
11700 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
11710 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
11720 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 ,listv[i+1],&day
11730 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 s)!=TCL_OK)....
11740 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
11750 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
11760 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
11770 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b ,"serial")==0) {
11780 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
11790 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
117a0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 ,listv[i+1],&ser
117b0 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 ial)!=TCL_OK)...
117c0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
117d0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 ERROR;... } e
117e0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
117f0 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"C")==0) {...
11800 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_C=Tcl_GetStri
11810 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
11820 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
11830 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 (strcmp(str,"ST"
11840 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d )==0) {....k_ST=
11850 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
11860 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
11870 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
11880 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 mp(str,"L")==0)
11890 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 {....k_L=Tcl_Get
118a0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
118b0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
118c0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
118d0 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "O")==0) {....k_
118e0 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 O=Tcl_GetString(
118f0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
11900 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
11910 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d rcmp(str,"OU")==
11920 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 0) {....k_OU=Tcl
11930 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
11940 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
11950 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
11960 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a str,"CN")==0) {.
11970 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 ...k_CN=Tcl_GetS
11980 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
11990 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
119a0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
119b0 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 Email")==0) {...
119c0 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 .k_Email=Tcl_Get
119d0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
119e0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
119f0 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 {....Tcl_SetRes
11a00 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e ult(interp,"Unkn
11a10 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e own parameter",N
11a20 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 ULL);....return
11a30 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
11a40 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 }...}.. }..#
11a50 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
11a60 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
11a70 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 000000L.. bne
11a80 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 = BN_new();..
11a90 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 rsa = RSA_new(
11aa0 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 );.. pkey = E
11ab0 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 VP_PKEY_new();..
11ac0 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e if (bne == N
11ad0 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 ULL || rsa == NU
11ae0 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 LL || pkey == NU
11af0 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f LL || !BN_set_wo
11b00 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c rd(bne,RSA_F4) |
11b10 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 |...!RSA_generat
11b20 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 e_key_ex(rsa, ke
11b30 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c ysize, bne, NULL
11b40 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 ) || !EVP_PKEY_a
11b50 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 ssign_RSA(pkey,
11b60 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b rsa)) {...EVP_PK
11b70 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
11b80 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 ./* RSA_free(rsa
11b90 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f ); freed by EVP_
11ba0 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 PKEY_free */...B
11bb0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c N_free(bne);.#el
11bc0 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 se.. pkey = E
11bd0 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 VP_RSA_gen((unsi
11be0 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a gned int) keysiz
11bf0 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 e);.. ctx = E
11c00 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 VP_PKEY_CTX_new(
11c10 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 pkey,NULL);..
11c20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c if (pkey == NUL
11c30 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c L || ctx == NULL
11c40 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
11c50 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c ygen_init(ctx) |
11c60 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 |...!EVP_PKEY_CT
11c70 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e X_set_rsa_keygen
11c80 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 _bits(ctx, keysi
11c90 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ze) || !EVP_PKEY
11ca0 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b _keygen(ctx, &pk
11cb0 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 ey)) {...EVP_PKE
11cc0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
11cd0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 EVP_PKEY_CTX_fre
11ce0 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 e(ctx);.#endif..
11cf0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
11d00 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
11d10 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 erating private
11d20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 key",NULL);...re
11d30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
11d40 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
11d50 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
11d60 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
11d70 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
11d80 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
11d90 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
11da0 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
11db0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
11dc0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
11dd0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
11de0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
11df0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
11e00 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
11e10 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
11e20 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
11e30 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,keyout,buffer,0
11e40 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
11e50 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
11e60 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
11e70 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
11e80 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
11e90 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
11ea0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
11eb0 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a me(out,keyout);.
11ec0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
11ed0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
11ee0 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
11ef0 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
11f00 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 .. /* PEM_wri
11f10 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 te_bio_RSAPrivat
11f20 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e eKey(out, rsa, N
11f30 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 ULL, NULL, 0, NU
11f40 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 LL, NULL); */...
11f50 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
11f60 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 (out);.. .}....i
11f70 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 f ((cert=X509_ne
11f80 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 w())==NULL) {...
11f90 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
11fa0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
11fb0 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 generating certi
11fc0 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c ficate request",
11fd0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 NULL);... EVP
11fe0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
11ff0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
12000 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
12010 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
12020 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
12030 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 endif... retu
12040 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
12050 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 .}....X509_set_v
12060 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a ersion(cert,2);.
12070 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 ..ASN1_INTEGER_s
12080 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 et(X509_get_seri
12090 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 alNumber(cert),s
120a0 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 erial);...X509_g
120b0 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
120c0 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 etm_notBefore(ce
120d0 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 rt),0);...X509_g
120e0 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
120f0 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 etm_notAfter(cer
12100 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 t),(long)60*60*2
12110 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 4*days);...X509_
12120 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c set_pubkey(cert,
12130 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 pkey);....name=X
12140 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 509_get_subject_
12150 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 name(cert);....X
12160 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
12170 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
12180 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 C", MBSTRING_ASC
12190 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
121a0 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d d char *) k_C, -
121b0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
121c0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
121d0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 _by_txt(name,"ST
121e0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
121f0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
12200 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d char *) k_ST, -
12210 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
12220 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
12230 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 _by_txt(name,"L"
12240 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
12250 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
12260 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c char *) k_L, -1,
12270 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
12280 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
12290 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 y_txt(name,"O",
122a0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
122b0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
122c0 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d ar *) k_O, -1, -
122d0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
122e0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
122f0 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d txt(name,"OU", M
12300 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
12310 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
12320 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d r *) k_OU, -1, -
12330 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
12340 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
12350 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d txt(name,"CN", M
12360 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
12370 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
12380 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d r *) k_CN, -1, -
12390 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
123a0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
123b0 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 txt(name,"Email"
123c0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
123d0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
123e0 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c char *) k_Email,
123f0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 -1, -1, 0);....
12400 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 X509_set_subject
12410 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 _name(cert,name)
12420 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 ;....if (!X509_s
12430 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 ign(cert,pkey,EV
12440 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 P_sha256())) {..
12450 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 . X509_free(c
12460 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ert);... EVP_
12470 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
12480 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
12490 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
124a0 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
124b0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
124c0 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 ndif... Tcl_S
124d0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
124e0 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 "Error signing c
124f0 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c ertificate",NULL
12500 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 );... return
12510 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
12520 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 ..if (isStr) {..
12530 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
12540 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 (BIO_s_mem());..
12550 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
12560 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
12570 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
12580 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
12590 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
125a0 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
125b0 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
125c0 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
125d0 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
125e0 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 interp,pemout,bu
125f0 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
12600 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
12610 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
12620 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
12630 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
12640 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
12650 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
12660 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d filename(out,pem
12670 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
12680 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
12690 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
126a0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 BIO_free_all(out
126b0 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 );...}....X509_f
126c0 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 ree(cert);...EVP
126d0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
126e0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
126f0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
12700 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f x30000000L...BN_
12710 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
12720 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 f.. }..}..bre
12730 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
12740 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 ..break;. }.
12750 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
12760 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
12770 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
12780 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
12790 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 *****/./* Init
127a0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a */./*
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
127c0 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
127d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
127e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
127f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
12810 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d *. * Tls_Free --
12820 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
12830 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
12840 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
12850 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
12860 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
12870 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
12880 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
12890 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 1. *. * Results
128a0 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
128b0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
128c0 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
128d0 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
128e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
128f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
12920 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 /.void.Tls_Free(
12930 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 char *blockPtr)
12940 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
12950 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
12960 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 )blockPtr;..
12970 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
12980 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 );.. Tls_Clea
12990 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 n(statePtr);.
129a0 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 ckfree(blockPtr
129b0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
129c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
129f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
12a00 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 *. * Tls_Clean
12a10 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
12a20 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
12a30 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
12a40 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
12a50 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
12a60 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
12a70 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
12a80 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 ow 1. This shou
12a90 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 ld. *.be called
12aa0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 synchronously by
12ab0 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 the CloseProc,
12ac0 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 not in the. *.Ev
12ad0 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c entuallyFree cal
12ae0 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
12af0 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
12b00 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
12b10 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
12b20 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
12b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b70 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 -. */.void Tls_C
12b80 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 lean(State *stat
12b90 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 ePtr) {. dpri
12ba0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
12bb0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 /*. * we
12bc0 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 're assuming her
12bd0 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e e that we're sin
12be0 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 gle-threaded.
12bf0 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 */. if (sta
12c00 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
12c10 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
12c20 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
12c30 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 leteTimerHandler
12c40 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
12c50 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
12c60 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 mer = NULL;.
12c70 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
12c80 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 Ptr->protos) {..
12c90 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d ckfree(statePtr-
12ca0 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 >protos);..state
12cb0 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 Ptr->protos = NU
12cc0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
12cd0 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 (statePtr->bio)
12ce0 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c {../* This will
12cf0 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f call SSL_shutdo
12d00 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 wn. Bug 1414045
12d10 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f */..dprintf("BIO
12d20 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 _free_all(%p)",
12d30 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
12d40 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 .BIO_free_all(st
12d50 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 atePtr->bio);..s
12d60 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e tatePtr->bio = N
12d70 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
12d80 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c f (statePtr->ssl
12d90 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 ) {..dprintf("SS
12da0 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 L_free(%p)", sta
12db0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 tePtr->ssl);..SS
12dc0 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d L_free(statePtr-
12dd0 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 >ssl);..statePtr
12de0 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->ssl = NULL;.
12df0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
12e00 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 ePtr->ctx) {..SS
12e10 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 L_CTX_free(state
12e20 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 Ptr->ctx);..stat
12e30 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c ePtr->ctx = NULL
12e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
12e50 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
12e60 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 ck) {..Tcl_DecrR
12e70 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
12e80 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 ->callback);..st
12e90 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
12ea0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
12eb0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
12ec0 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 >password) {..Tc
12ed0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
12ee0 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
12ef0 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 d);..statePtr->p
12f00 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a assword = NULL;.
12f10 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
12f20 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a atePtr->vcmd) {.
12f30 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
12f40 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
12f50 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 );..statePtr->vc
12f60 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d md = NULL;. }
12f70 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
12f80 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a eturning");.}...
12f90 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
12fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12fd0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
12fe0 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a ls_Init --. *. *
12ff0 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 .This is a packa
13000 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ge initializatio
13010 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 n procedure, whi
13020 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 ch is called. *.
13030 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 by Tcl when this
13040 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 package is to b
13050 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e e added to an in
13060 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a terpreter.. *. *
13070 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 Results: Ssl c
13080 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f onfigured and lo
13090 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 aded. *. * Side
130a0 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 effects:. *. cre
130b0 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d ate the ssl comm
130c0 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 and, initialize
130d0 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 ssl context. *.
130e0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
130f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13120 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f ----. */.DLLEXPO
13130 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 RT int Tls_Init(
13140 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
13150 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 rp) {. const
13160 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 char tlsTclInitS
13170 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 cript[] = {.#inc
13180 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 lude "tls.tcl.h"
13190 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 ..0x00. };..
131a0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
131b0 65 64 22 29 3b 0a 0a 23 69 66 20 54 43 4c 5f 4d ed");..#if TCL_M
131c0 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 AJOR_VERSION > 8
131d0 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f .#ifdef USE_TCL_
131e0 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 STUBS. if (Tc
131f0 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 l_InitStubs(inte
13200 72 70 2c 20 22 39 2e 30 22 2c 20 30 29 20 3d 3d rp, "9.0", 0) ==
13210 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
13220 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
13230 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 }.#endif. if
13240 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 (Tcl_PkgRequire(
13250 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 interp, "Tcl", "
13260 39 2e 30 2d 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 9.0-", 0) == NUL
13270 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
13280 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 _ERROR;. }.#e
13290 6c 73 65 0a 23 69 66 64 65 66 20 55 53 45 5f 54 lse.#ifdef USE_T
132a0 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 CL_STUBS. if
132b0 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 (Tcl_InitStubs(i
132c0 6e 74 65 72 70 2c 20 22 38 2e 35 22 2c 20 30 29 nterp, "8.5", 0)
132d0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
132e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
132f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
13300 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 if (Tcl_PkgRequi
13310 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 re(interp, "Tcl"
13320 2c 20 22 38 2e 35 2d 22 2c 20 30 29 20 3d 3d 20 , "8.5-", 0) ==
13330 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
13340 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
13350 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
13360 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 (TlsLibInit(0) !
13370 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c = TCL_OK) {..Tcl
13380 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
13390 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 terp, "could not
133a0 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 initialize SSL
133b0 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b library", NULL);
133c0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
133d0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
133e0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
133f0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
13400 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 ::connection", C
13410 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
13420 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
13430 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
13440 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
13450 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
13460 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
13470 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 p, "tls::handsha
13480 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 ke", HandshakeOb
13490 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
134a0 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
134b0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
134c0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
134d0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
134e0 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 rp, "tls::import
134f0 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c ", ImportObjCmd,
13500 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
13510 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
13520 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
13530 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
13540 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
13550 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 tls::misc", Misc
13560 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
13570 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
13580 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
13590 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
135a0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
135b0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d terp, "tls::unim
135c0 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f port", UnimportO
135d0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
135e0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
135f0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
13600 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
13610 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
13620 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 erp, "tls::statu
13630 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 s", StatusObjCmd
13640 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
13650 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
13660 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a Proc *) NULL);..
13670 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74 43 6f Tls_DigestCo
13680 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a mmands(interp);.
13690 20 20 20 20 54 6c 73 5f 45 6e 63 72 79 70 74 43 Tls_EncryptC
136a0 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b ommands(interp);
136b0 0a 20 20 20 20 54 6c 73 5f 49 6e 66 6f 43 6f 6d . Tls_InfoCom
136c0 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 mands(interp);.
136d0 20 20 20 54 6c 73 5f 4b 65 79 43 6f 6d 6d 61 6e Tls_KeyComman
136e0 64 73 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 ds(interp);..
136f0 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 if (interp) {..
13700 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c Tcl_Eval(interp,
13710 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 tlsTclInitScrip
13720 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 t);. }.. r
13730 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f eturn Tcl_PkgPro
13740 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 vide(interp, PAC
13750 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 KAGE_NAME, PACKA
13760 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a GE_VERSION);.}..
13770 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
13780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
137a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
137b0 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 *.Tls_SafeInit
137c0 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d --. *. *.-------
137d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
137e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
137f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 ---------*. *.St
13800 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 andard procedure
13810 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f required by 'lo
13820 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 ad'.. *.Initiali
13830 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 zes this extensi
13840 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e on for a safe in
13850 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d terpreter.. *.--
13860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
13890 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 *. *.Side effec
138a0 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 ts:. *..As of 'T
138b0 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 ls_Init'. *. *.R
138c0 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 esult:. *..A sta
138d0 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 ndard Tcl error
138e0 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d code.. *. *-----
138f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13920 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 -*. */.DLLEXPORT
13930 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 int Tls_SafeIni
13940 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e t(Tcl_Interp *in
13950 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 terp) {. dpri
13960 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 ntf("Called");.
13970 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e return(Tls_In
13980 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a it(interp));.}..
13990 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
139a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
139b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
139c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a -----------*. *.
139d0 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d *.TlsLibInit --
139e0 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *.---------
139f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a10 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 -------*. *.Init
13a20 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 ializes SSL libr
13a30 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 ary once per app
13a40 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d lication. *.----
13a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a ------------*. *
13a80 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 . *.Side effects
13a90 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 :. *..initialize
13aa0 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a s SSL library. *
13ab0 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 . *.Result:. *..
13ac0 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d none. *. *------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13b00 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 *. */.static int
13b10 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 TlsLibInit(int
13b20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a uninitialize) {.
13b30 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 static int i
13b40 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a nitialized = 0;.
13b50 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d int status =
13b60 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 TCL_OK;.#if def
13b70 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
13b80 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
13b90 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 (TCL_THREADS).
13ba0 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 size_t num_loc
13bb0 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 ks;.#endif..
13bc0 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 if (uninitialize
13bd0 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 ) {..if (!initia
13be0 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 lized) {.. dp
13bf0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 rintf("Asked to
13c00 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 uninitialize, bu
13c10 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 t we are not ini
13c20 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 tialized");...
13c30 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 return(TCL_OK)
13c40 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 ;..}...dprintf("
13c50 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 Asked to uniniti
13c60 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 alize");..#if de
13c70 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
13c80 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
13c90 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 d(TCL_THREADS)..
13ca0 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 Tcl_MutexLock(&i
13cb0 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c nit_mx);...if (l
13cc0 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 ocks) {.. fre
13cd0 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c e(locks);.. l
13ce0 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 ocks = NULL;..
13cf0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 locksCount = 0
13d00 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 ;..}.#endif..ini
13d10 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 tialized = 0;..#
13d20 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 if defined(OPENS
13d30 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 SL_THREADS) && d
13d40 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 efined(TCL_THREA
13d50 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e DS)..Tcl_MutexUn
13d60 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a lock(&init_mx);.
13d70 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 #endif...return(
13d80 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a TCL_OK);. }..
13d90 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 if (initiali
13da0 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 zed) {..dprintf(
13db0 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 "Called, but usi
13dc0 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 ng cached value"
13dd0 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 );..return(statu
13de0 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 s);. }.. d
13df0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
13e00 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f ;..#if defined(O
13e10 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
13e20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
13e30 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f HREADS). Tcl_
13e40 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f MutexLock(&init_
13e50 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 mx);.#endif.
13e60 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b initialized = 1;
13e70 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 ..#if defined(OP
13e80 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 ENSSL_THREADS) &
13e90 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 & defined(TCL_TH
13ea0 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c READS). num_l
13eb0 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f ocks = 1;. lo
13ec0 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 cksCount = (int)
13ed0 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 num_locks;.
13ee0 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 locks = malloc(s
13ef0 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 izeof(*locks) *
13f00 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 num_locks);.
13f10 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c memset(locks, 0,
13f20 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 sizeof(*locks)
13f30 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 * num_locks);.#e
13f40 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 ndif.. /* Ini
13f50 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 tialize BOTH lib
13f60 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 crypto and libss
13f70 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 l. */. OPENSS
13f80 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 L_init_ssl(OPENS
13f90 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c SL_INIT_LOAD_SSL
13fa0 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 _STRINGS | OPENS
13fb0 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 SL_INIT_LOAD_CRY
13fc0 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f PTO_STRINGS..| O
13fd0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f PENSSL_INIT_ADD_
13fe0 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 ALL_CIPHERS | OP
13ff0 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 ENSSL_INIT_ADD_A
14000 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c LL_DIGESTS, NULL
14010 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f );.. BIO_new_
14020 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 tcl(NULL, 0);..#
14030 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 if 0. /*.
14040 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d * XXX:TODO: Rem
14050 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e ove this code an
14060 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 d replace it wit
14070 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a h a check. *
14080 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 for enough entr
14090 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 opy and do not t
140a0 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 ry to create our
140b0 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 own. * terr
140c0 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 ible entropy.
140d0 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 */. /*.
140e0 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 * Seed the rand
140f0 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 om number genera
14100 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c tor in the SSL l
14110 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 ibrary,. * u
14120 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c sing the do/whil
14130 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 e construct beca
14140 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e use of the bug n
14150 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 ote in the.
14160 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 * OpenSSL FAQ at
14170 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e http://www.open
14180 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f ssl.org/support/
14190 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 faq.html#USER1.
141a0 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 *. * The
141b0 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f crux of the pro
141c0 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c blem is that Sol
141d0 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 aris 7 does not
141e0 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 have a. * /d
141f0 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 ev/random or /de
14200 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 v/urandom device
14210 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 so it cannot ga
14220 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 ther enough.
14230 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 * entropy from
14240 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 the RAND_seed()
14250 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c when TLS initial
14260 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 izes and refuses
14270 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 . * to go fu
14280 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 rther. Earlier v
14290 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 ersions of OpenS
142a0 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 SL carried on re
142b0 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a gardless.. *
142c0 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 /. srand((uns
142d0 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 igned int) time(
142e0 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 (time_t *) NULL)
142f0 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 );. do {..for
14300 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b (i = 0; i < 16;
14310 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 i++) {.. rnd
14320 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 _seed[i] = 1 + (
14330 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 char) (255.0 * r
14340 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b and()/(RAND_MAX+
14350 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 1.0));..}..RAND_
14360 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 seed(rnd_seed, s
14370 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 izeof(rnd_seed))
14380 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 ;. } while (R
14390 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 AND_status() !=
143a0 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 1);.#endif..#if
143b0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
143c0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
143d0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
143e0 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 ..Tcl_MutexUnloc
143f0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
14400 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 dif...return(sta
14410 74 75 73 29 3b 0a 7d 0a tus);.}.