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 20 2a 2f 0a * Cipher NID */.
fa30: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
fa40: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 erp, objPtr, "ci
fa50: 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20 pherNID", (char
fa60: 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c *)OBJ_nid2ln(SSL
fa70: 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68 _CIPHER_get_ciph
fa80: 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c er_nid(cipher)),
fa90: 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
faa0: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
fab0: 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20 r, "digestNID",
fac0: 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
fad0: 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
fae0: 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70 t_digest_nid(cip
faf0: 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 her)), -1);..LAP
fb00: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
fb10: 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 objPtr, "keyExc
fb20: 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72 hangeNID", (char
fb30: 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
fb40: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f L_CIPHER_get_kx_
fb50: 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 nid(cipher)), -1
fb60: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 );..LAPPEND_STR(
fb70: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
fb80: 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e "authenticationN
fb90: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
fba0: 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
fbb0: 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 ER_get_auth_nid(
fbc0: 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a cipher)), -1);..
fbd0: 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68 ./* message auth
fbe0: 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 entication code
fbf0: 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44 - Cipher is AEAD
fc00: 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 (e.g. GCM or Ch
fc10: 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 aCha20/Poly1305)
fc20: 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 or not */../* A
fc30: 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63 uthenticated Enc
fc40: 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73 ryption with ass
fc50: 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45 ociated data (AE
fc60: 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 AD) check */..LA
fc70: 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 PPEND_BOOL(inter
fc80: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 p, objPtr, "ciph
fc90: 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c er_is_aead", SSL
fca0: 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28 _CIPHER_is_aead(
fcb0: 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 47 cipher));.../* G
fcc0: 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 et OpenSSL-speci
fcd0: 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 fic ID, not IANA
fce0: 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ID */..LAPPEND_
fcf0: 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
fd00: 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 2c tr, "cipher_id",
fd10: 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 (int) SSL_CIPHE
fd20: 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 R_get_id(cipher)
fd30: 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 );.../* Two-byte
fd40: 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 20 ID used in the
fd50: 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 TLS protocol of
fd60: 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 72 the given cipher
fd70: 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 */..LAPPEND_INT
fd80: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
fd90: 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 "protocol_id",
fda0: 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 (int) SSL_CIPHER
fdb0: 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 _get_protocol_id
fdc0: 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 (cipher));.../*
fdd0: 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 Textual descript
fde0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 ion of the ciphe
fdf0: 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 r */..if (SSL_CI
fe00: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e PHER_description
fe10: 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 (cipher, buf, si
fe20: 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 zeof(buf)) != NU
fe30: 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 LL) {.. LAPPE
fe40: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
fe50: 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 bjPtr, "descript
fe60: 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a ion", buf, -1);.
fe70: 09 7d 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 .}.../* Digest u
fe80: 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 sed during the S
fe90: 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 SL/TLS handshake
fea0: 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 when using the
feb0: 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d cipher. */..md =
fec0: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
fed0: 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 handshake_digest
fee0: 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 (cipher);..LAPPE
fef0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
ff00: 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b bjPtr, "handshak
ff10: 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 e_digest", (char
ff20: 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d *)EVP_MD_name(m
ff30: 64 29 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a d), -1);. }..
ff40: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 /* Session i
ff50: 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 nfo */. sessi
ff60: 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 on = SSL_get_ses
ff70: 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 sion(ssl);. i
ff80: 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 f (session != NU
ff90: 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 LL) {..const uns
ffa0: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b igned char *tick
ffb0: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 et;..size_t len2
ffc0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ;..unsigned int
ffd0: 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 ulen;..const uns
ffe0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 igned char *sess
fff0: 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a ion_id, *proto;.
10000 09 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c .char buffer[SSL
10010 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f _MAX_MASTER_KEY_
10020 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 LENGTH];.../* Re
10030 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 port the selecte
10040 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 d protocol as a
10050 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c result of the AL
10060 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a PN negotiation *
10070 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 /..SSL_SESSION_g
10080 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 et0_alpn_selecte
10090 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 d(session, &prot
100a0 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 o, &len2);..LAPP
100b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
100c0 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
100d0 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 (char *) proto,
100e0 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f (int) len2);.../
100f0 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c * Report the sel
10100 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 ected protocol a
10110 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 s a result of th
10120 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f e NPN negotiatio
10130 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f n */.#ifdef USE_
10140 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 NPN..SSL_get0_ne
10150 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 xt_proto_negotia
10160 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c ted(ssl, &proto,
10170 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e &ulen);..LAPPEN
10180 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10190 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 jPtr, "npn", (ch
101a0 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 69 6e ar *) proto, (in
101b0 74 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 t) ulen);.#endif
101c0 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 .../* Resumable
101d0 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 session */..LAPP
101e0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
101f0 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 objPtr, "resuma
10200 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ble", SSL_SESSIO
10210 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 N_is_resumable(s
10220 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 ession));.../* S
10230 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d ession start tim
10240 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 e (seconds since
10250 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 epoch) */..LAPP
10260 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
10270 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f objPtr, "start_
10280 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 time", SSL_SESSI
10290 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 ON_get_time(sess
102a0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 ion));.../* Time
102b0 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f out value - SSL_
102c0 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 CTX_get_timeout
102d0 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a (in seconds) */.
102e0 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e .LAPPEND_LONG(in
102f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 terp, objPtr, "t
10300 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 imeout", SSL_SES
10310 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 SION_get_timeout
10320 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a (session));.../*
10330 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c Session id - TL
10340 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 Sv1.2 and below
10350 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e only */..session
10360 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f _id = SSL_SESSIO
10370 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e N_get_id(session
10380 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 , &ulen);..LAPPE
10390 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 ND_BARRAY(interp
103a0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
103b0 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f on_id", session_
103c0 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 3b id, (int) ulen);
103d0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f .../* Session co
103e0 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f ntext */..sessio
103f0 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 n_id = SSL_SESSI
10400 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 ON_get0_id_conte
10410 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 xt(session, &ule
10420 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 n);..LAPPEND_BAR
10430 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
10440 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e tr, "session_con
10450 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 text", session_i
10460 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 3b 0a d, (int) ulen);.
10470 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 ../* Session tic
10480 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c ket - client onl
10490 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f y */..SSL_SESSIO
104a0 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 N_get0_ticket(se
104b0 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 ssion, &ticket,
104c0 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 &len2);..LAPPEND
104d0 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
104e0 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
104f0 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 _ticket", ticket
10500 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a , (int) len2);..
10510 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b ./* Session tick
10520 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 et lifetime hint
10530 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f (in seconds) */
10540 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 ..LAPPEND_LONG(i
10550 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10560 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 lifetime", SSL_S
10570 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 ESSION_get_ticke
10580 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 t_lifetime_hint(
10590 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 session));.../*
105a0 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 Ticket app data
105b0 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f */..SSL_SESSION_
105c0 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 get0_ticket_appd
105d0 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 ata(session, &ti
105e0 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c cket, &len2);..L
105f0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
10600 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 terp, objPtr, "t
10610 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c icket_app_data",
10620 20 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c ticket, (int) l
10630 65 6e 32 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d en2);.../* Get m
10640 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 aster key */..le
10650 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e n2 = SSL_SESSION
10660 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 _get_master_key(
10670 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c session, buffer,
10680 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f SSL_MAX_MASTER_
10690 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 KEY_LENGTH);..LA
106a0 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
106b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 erp, objPtr, "ma
106c0 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 ster_key", buffe
106d0 72 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a r, (int) len2);.
106e0 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e ../* Compression
106f0 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 id */..unsigned
10700 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 int id = SSL_SE
10710 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 SSION_get_compre
10720 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a ss_id(session);.
10730 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
10740 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
10750 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 mpression_id", i
10760 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 d == 1 ? "zlib"
10770 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 : "none", -1);.
10780 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d }.. /* Com
10790 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f pression info */
107a0 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 . if (ssl !=
107b0 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 NULL) {.#ifdef H
107c0 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 AVE_SSL_COMPRESS
107d0 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f ION..const COMP_
107e0 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 METHOD *comp, *e
107f0 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c xpn;..comp = SSL
10800 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d _get_current_com
10810 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 pression(ssl);..
10820 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 expn = SSL_get_c
10830 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e urrent_expansion
10840 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 (ssl);...LAPPEND
10850 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a _STR(interp, obj
10860 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f Ptr, "compressio
10870 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 n", comp ? SSL_C
10880 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d OMP_get_name(com
10890 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 p) : "none", -1)
108a0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
108b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
108c0 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e expansion", expn
108d0 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f ? SSL_COMP_get_
108e0 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f name(expn) : "no
108f0 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a ne", -1);.#else.
10900 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
10910 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f erp, objPtr, "co
10920 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e mpression", "non
10930 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e e", -1);..LAPPEN
10940 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10950 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e jPtr, "expansion
10960 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a ", "none", -1);.
10970 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 #endif. }..
10980 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f /* Server info
10990 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 */. {..long
109a0 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 mode = SSL_CTX_g
109b0 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 et_session_cache
109c0 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e _mode(statePtr->
109d0 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 ctx);..char *msg
109e0 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 ;...if (mode & S
109f0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 SL_SESS_CACHE_OF
10a00 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 F) {.. msg =
10a10 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 "off";..} else i
10a20 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
10a30 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 SS_CACHE_CLIENT)
10a40 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 {.. msg = "c
10a50 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 lient";..} else
10a60 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 if (mode & SSL_S
10a70 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 ESS_CACHE_SERVER
10a80 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 ) {.. msg = "
10a90 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 server";..} else
10aa0 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f if (mode & SSL_
10ab0 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 SESS_CACHE_BOTH)
10ac0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 {.. msg = "b
10ad0 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a oth";..} else {.
10ae0 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e . msg = "unkn
10af0 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e own";..}..LAPPEN
10b00 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10b10 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 jPtr, "session_c
10b20 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c ache_mode", msg,
10b30 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 -1);. }..
10b40 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 /* CA List */.
10b50 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 /* IF not a s
10b60 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 erver, same as S
10b70 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f SL_get0_peer_CA_
10b80 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 list. If server
10b90 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f same as SSL_CTX_
10ba0 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 get_client_CA_li
10bb0 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 st */. listPt
10bc0 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
10bd0 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 bj(0, NULL);.
10be0 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e STACK_OF(X509_N
10bf0 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 AME) *ca_list;.
10c00 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 if ((ca_list
10c10 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 = SSL_get_client
10c20 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 _CA_list(ssl)) !
10c30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 = NULL) {..char
10c40 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a buffer[BUFSIZ];.
10c50 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 ..for (int i = 0
10c60 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 ; i < sk_X509_NA
10c70 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b ME_num(ca_list);
10c80 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 i++) {.. X50
10c90 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 9_NAME *name = s
10ca0 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 k_X509_NAME_valu
10cb0 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 e(ca_list, i);..
10cc0 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a if (name) {.
10cd0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c ..X509_NAME_onel
10ce0 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 ine(name, buffer
10cf0 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c , BUFSIZ);...Tcl
10d00 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
10d10 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 ement(interp, li
10d20 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 stPtr, Tcl_NewSt
10d30 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 ringObj(buffer,
10d40 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a -1));.. }..}.
10d50 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e }. LAPPEN
10d60 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 D_OBJ(interp, ob
10d70 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 jPtr, "caList",
10d80 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 listPtr);. LA
10d90 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 PPEND_INT(interp
10da0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 , objPtr, "caLis
10db0 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 tCount", sk_X509
10dc0 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 _NAME_num(ca_lis
10dd0 74 29 29 3b 0a 0a 0a 20 20 20 20 54 63 6c 5f 53 t));... Tcl_S
10de0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
10df0 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
10e00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
10e10 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
10e20 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
10e30 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
10e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e70 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 ------. *. * Mis
10e80 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 cObjCmd -- misc
10e90 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 commands. *. * R
10ea0 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
10eb0 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
10ec0 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
10ed0 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
10ee0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
10ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
10f30 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d ic int.MiscObjCm
10f40 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
10f50 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
10f60 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
10f70 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
10f80 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
10f90 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 static const
10fa0 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 char *commands
10fb0 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 [] = { "req", "s
10fc0 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a trreq", NULL };.
10fd0 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 enum command
10fe0 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 { C_REQ, C_STRR
10ff0 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 EQ, C_DUMMY };.
11000 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 int cmd, isSt
11010 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 r;. char buff
11020 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 er[16384];..
11030 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
11040 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
11050 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f < 2) {..Tcl_Wro
11060 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
11070 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 , 1, objv, "subc
11080 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b ommand ?args?");
11090 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
110a0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
110b0 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
110c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
110d0 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c jv[1], commands,
110e0 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 "command", 0, &
110f0 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 cmd) != TCL_OK)
11100 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
11110 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
11120 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
11130 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 );.. isStr =
11140 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 (cmd == C_STRREQ
11150 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 );. switch ((
11160 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d enum command) cm
11170 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 d) {..case C_REQ
11180 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 :..case C_STRREQ
11190 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 : {.. EVP_PKE
111a0 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 Y *pkey=NULL;..
111b0 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 X509 *cert=NU
111c0 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 LL;.. X509_NA
111d0 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 ME *name=NULL;..
111e0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 Tcl_Obj **li
111f0 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 stv;.. int li
11200 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f stc,i;... BIO
11210 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 *out=NULL;...
11220 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a char *k_C="",*
11230 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c k_ST="",*k_L="",
11240 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 *k_O="",*k_OU=""
11250 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 ,*k_CN="",*k_Ema
11260 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 il="";.. char
11270 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 *keyout,*pemout
11280 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 ,*str;.. int
11290 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 keysize,serial=0
112a0 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 ,days=365;..#if
112b0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
112c0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 NUMBER < 0x30000
112d0 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 000L.. BIGNUM
112e0 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 *bne = NULL;..
112f0 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 RSA *rsa = NU
11300 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 LL;.#else.. E
11310 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 VP_PKEY_CTX *ctx
11320 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a = NULL;.#endif.
11330 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c .. if ((objc<
11340 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 5) || (objc>6))
11350 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {...Tcl_WrongNum
11360 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 Args(interp, 2,
11370 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b objv, "keysize k
11380 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 eyfile certfile
11390 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 ?info?");...retu
113a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
113b0 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 }... if (T
113c0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
113d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d (interp, objv[2]
113e0 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 , &keysize) != T
113f0 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 CL_OK) {...retur
11400 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
11410 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d }.. keyout=
11420 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 Tcl_GetString(ob
11430 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d jv[3]);.. pem
11440 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e out=Tcl_GetStrin
11450 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 g(objv[4]);..
11460 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 if (isStr) {...
11470 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
11480 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a p,keyout,"",0);.
11490 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 ..Tcl_SetVar(int
114a0 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 erp,pemout,"",0)
114b0 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
114c0 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 f (objc>=6) {...
114d0 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 if (Tcl_ListObjG
114e0 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 etElements(inter
114f0 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 p, objv[5],....&
11500 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 listc, &listv) !
11510 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 = TCL_OK) {...
11520 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
11530 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 OR;...}....if ((
11540 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b listc%2) != 0) {
11550 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 ... Tcl_SetRe
11560 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 sult(interp,"Inf
11570 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 ormation list mu
11580 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d st have even num
11590 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
115a0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 ",NULL);... r
115b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
115c0 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b ...}...for (i=0;
115d0 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 i<listc; i+=2)
115e0 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f {... str=Tcl_
115f0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
11600 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 i]);... if (s
11610 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 trcmp(str,"days"
11620 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
11630 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
11640 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
11650 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 1],&days)!=TCL_O
11660 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e K).... return
11670 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
11680 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
11690 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 cmp(str,"serial"
116a0 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 )==0) {....if (T
116b0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
116c0 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b (interp,listv[i+
116d0 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 1],&serial)!=TCL
116e0 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 _OK).... retu
116f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
11700 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
11710 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d trcmp(str,"C")==
11720 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 0) {....k_C=Tcl_
11730 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b GetString(listv[
11740 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 i+1]);... } e
11750 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
11760 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 tr,"ST")==0) {..
11770 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 ..k_ST=Tcl_GetSt
11780 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 ring(listv[i+1])
11790 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 ;... } else i
117a0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c f (strcmp(str,"L
117b0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d ")==0) {....k_L=
117c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
117d0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
117e0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
117f0 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 mp(str,"O")==0)
11800 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 {....k_O=Tcl_Get
11810 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
11820 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
11830 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
11840 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b "OU")==0) {....k
11850 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e _OU=Tcl_GetStrin
11860 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 g(listv[i+1]);..
11870 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
11880 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 strcmp(str,"CN")
11890 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 ==0) {....k_CN=T
118a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 cl_GetString(lis
118b0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 tv[i+1]);...
118c0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
118d0 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d p(str,"Email")==
118e0 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 0) {....k_Email=
118f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
11900 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
11910 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c } else {....Tcl
11920 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
11930 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d p,"Unknown param
11940 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 eter",NULL);....
11950 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
11960 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 ;... }...}..
11970 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 }..#if OPENSS
11980 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
11990 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 < 0x30000000L..
119a0 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 bne = BN_new
119b0 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 ();.. rsa = R
119c0 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 SA_new();.. p
119d0 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e key = EVP_PKEY_n
119e0 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 ew();.. if (b
119f0 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 ne == NULL || rs
11a00 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 a == NULL || pke
11a10 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e y == NULL || !BN
11a20 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 _set_word(bne,RS
11a30 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f A_F4) ||...!RSA_
11a40 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 generate_key_ex(
11a50 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e rsa, keysize, bn
11a60 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 e, NULL) || !EVP
11a70 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 _PKEY_assign_RSA
11a80 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 (pkey, rsa)) {..
11a90 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 .EVP_PKEY_free(p
11aa0 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 key);.../* RSA_f
11ab0 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 ree(rsa); freed
11ac0 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 by EVP_PKEY_free
11ad0 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e */...BN_free(bn
11ae0 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 e);.#else.. p
11af0 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 key = EVP_RSA_ge
11b00 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 n((unsigned int)
11b10 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 keysize);..
11b20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 ctx = EVP_PKEY_C
11b30 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c TX_new(pkey,NULL
11b40 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 );.. if (pkey
11b50 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 == NULL || ctx
11b60 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f == NULL || !EVP_
11b70 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 PKEY_keygen_init
11b80 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f (ctx) ||...!EVP_
11b90 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 PKEY_CTX_set_rsa
11ba0 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 _keygen_bits(ctx
11bb0 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 , keysize) || !E
11bc0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 VP_PKEY_keygen(c
11bd0 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 tx, &pkey)) {...
11be0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b EVP_PKEY_free(pk
11bf0 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f ey);...EVP_PKEY_
11c00 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 CTX_free(ctx);.#
11c10 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 endif...Tcl_SetR
11c20 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 esult(interp,"Er
11c30 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 ror generating p
11c40 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c rivate key",NULL
11c50 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
11c60 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c ERROR;.. } el
11c70 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 se {...if (isStr
11c80 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 ) {... out=BI
11c90 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 O_new(BIO_s_mem(
11ca0 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 ));... PEM_wr
11cb0 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b ite_bio_PrivateK
11cc0 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c ey(out,pkey,NULL
11cd0 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c ,NULL,0,NULL,NUL
11ce0 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f L);... i=BIO_
11cf0 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c read(out,buffer,
11d00 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 sizeof(buffer)-1
11d10 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 );... i=(i<0)
11d20 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 ? 0 : i;...
11d30 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a buffer[i]='\0';.
11d40 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 .. Tcl_SetVar
11d50 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 (interp,keyout,b
11d60 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 uffer,0);...
11d70 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a BIO_flush(out);.
11d80 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f .. BIO_free(o
11d90 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ut);...} else {.
11da0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 .. out=BIO_ne
11db0 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b w(BIO_s_file());
11dc0 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 ... BIO_write
11dd0 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 _filename(out,ke
11de0 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d yout);... PEM
11df0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 _write_bio_Priva
11e00 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e teKey(out,pkey,N
11e10 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c ULL,NULL,0,NULL,
11e20 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 NULL);... /*
11e30 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 PEM_write_bio_RS
11e40 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c APrivateKey(out,
11e50 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c rsa, NULL, NULL
11e60 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 , 0, NULL, NULL)
11e70 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 ; */... BIO_f
11e80 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 ree_all(out);..
11e90 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d .}....if ((cert=
11ea0 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c X509_new())==NUL
11eb0 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 L) {... Tcl_S
11ec0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
11ed0 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e "Error generatin
11ee0 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65 g certificate re
11ef0 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 quest",NULL);...
11f00 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 EVP_PKEY_fre
11f10 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
11f20 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
11f30 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
11f40 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 L... BN_free(
11f50 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 bne);.#endif...
11f60 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 return(TCL_ER
11f70 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 ROR);...}....X50
11f80 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 9_set_version(ce
11f90 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e rt,2);...ASN1_IN
11fa0 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 TEGER_set(X509_g
11fb0 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 et_serialNumber(
11fc0 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 cert),serial);..
11fd0 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a .X509_gmtime_adj
11fe0 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 (X509_getm_notBe
11ff0 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 fore(cert),0);..
12000 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a .X509_gmtime_adj
12010 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 (X509_getm_notAf
12020 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 ter(cert),(long)
12030 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 60*60*24*days);.
12040 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 ..X509_set_pubke
12050 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 y(cert,pkey);...
12060 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 .name=X509_get_s
12070 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 ubject_name(cert
12080 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f );....X509_NAME_
12090 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 add_entry_by_txt
120a0 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 (name,"C", MBSTR
120b0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 ING_ASC, (const
120c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
120d0 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_C, -1, -1, 0)
120e0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
120f0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
12100 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 ame,"ST", MBSTRI
12110 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 NG_ASC, (const u
12120 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
12130 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 k_ST, -1, -1, 0)
12140 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 ;...X509_NAME_ad
12150 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e d_entry_by_txt(n
12160 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e ame,"L", MBSTRIN
12170 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
12180 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
12190 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a _L, -1, -1, 0);.
121a0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f ..X509_NAME_add_
121b0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d entry_by_txt(nam
121c0 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f e,"O", MBSTRING_
121d0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 ASC, (const unsi
121e0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f gned char *) k_O
121f0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
12200 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
12210 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
12220 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 "OU", MBSTRING_A
12230 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
12240 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 ned char *) k_OU
12250 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
12260 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
12270 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
12280 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 "CN", MBSTRING_A
12290 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 SC, (const unsig
122a0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e ned char *) k_CN
122b0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 , -1, -1, 0);...
122c0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e X509_NAME_add_en
122d0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c try_by_txt(name,
122e0 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e "Email", MBSTRIN
122f0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e G_ASC, (const un
12300 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b signed char *) k
12310 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 _Email, -1, -1,
12320 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 0);....X509_set_
12330 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 subject_name(cer
12340 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 t,name);....if (
12350 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c !X509_sign(cert,
12360 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 pkey,EVP_sha256(
12370 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 ))) {... X509
12380 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 _free(cert);...
12390 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 EVP_PKEY_free
123a0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e (pkey);.#if OPEN
123b0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
123c0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c ER < 0x30000000L
123d0 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 ... BN_free(b
123e0 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 ne);.#endif...
123f0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 Tcl_SetResult(
12400 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 interp,"Error si
12410 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 gning certificat
12420 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 e",NULL);...
12430 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
12440 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 ;...}....if (isS
12450 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d tr) {... out=
12460 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 BIO_new(BIO_s_me
12470 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f m());... PEM_
12480 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
12490 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
124a0 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 i=BIO_read(out,b
124b0 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 uffer,sizeof(buf
124c0 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 fer)-1);... i
124d0 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a =(i<0) ? 0 : i;.
124e0 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d .. buffer[i]=
124f0 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f '\0';... Tcl_
12500 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 SetVar(interp,pe
12510 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a mout,buffer,0);.
12520 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 .. BIO_flush(
12530 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f out);... BIO_
12540 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 free(out);...} e
12550 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d lse {... out=
12560 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 BIO_new(BIO_s_fi
12570 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f le());... BIO
12580 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 _write_filename(
12590 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 out,pemout);...
125a0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
125b0 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b _X509(out,cert);
125c0 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f ... BIO_free_
125d0 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 all(out);...}...
125e0 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 .X509_free(cert)
125f0 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 ;...EVP_PKEY_fre
12600 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 e(pkey);.#if OPE
12610 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
12620 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
12630 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 L...BN_free(bne)
12640 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a ;.#endif.. }.
12650 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 .}..break;. d
12660 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a efault:..break;.
12670 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
12680 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
12690 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
126a0 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a a;.}.../********
126b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a ************/./*
126c0 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 Init
126d0 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./**********
126e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
126f0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
12700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12730 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
12740 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Free --. *. *.Th
12750 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 is procedure cle
12760 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 ans up when a SS
12770 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
12780 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f hannel. *.is clo
12790 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 sed and its refe
127a0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c rence count fall
127b0 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 s below 1. *. *
127c0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 Results:. *.none
127d0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
127e0 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c cts:. *.Frees al
127f0 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 l the state. *.
12800 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
12810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12840 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c ----. */.void.Tl
12850 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f s_Free(char *blo
12860 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 ckPtr) {. Sta
12870 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
12880 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 State *)blockPtr
12890 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
128a0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 Called");.. T
128b0 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 ls_Clean(statePt
128c0 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 r);. ckfree(b
128d0 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a lockPtr);.}.../*
128e0 0a 20 2a 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 2d 2d 2d ----------------
12920 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
12930 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 _Clean --. *. *.
12940 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 This procedure c
12950 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 leans up when a
12960 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
12970 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 channel. *.is c
12980 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 losed and its re
12990 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 ference count fa
129a0 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 lls below 1. Th
129b0 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 is should. *.be
129c0 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f called synchrono
129d0 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 usly by the Clos
129e0 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 eProc, not in th
129f0 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 e. *.EventuallyF
12a00 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a ree callback.. *
12a10 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
12a20 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 none. *. * Side
12a30 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 effects:. *.Free
12a40 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a s all the state.
12a50 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
12a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a90 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
12aa0 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 d Tls_Clean(Stat
12ab0 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 e *statePtr) {.
12ac0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
12ad0 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 ed");.. /*.
12ae0 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d * we're assum
12af0 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 ing here that we
12b00 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 're single-threa
12b10 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ded. */.
12b20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 if (statePtr->ti
12b30 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 mer != (Tcl_Time
12b40 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a rToken) NULL) {.
12b50 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 .Tcl_DeleteTimer
12b60 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 Handler(statePtr
12b70 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 ->timer);..state
12b80 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c Ptr->timer = NUL
12b90 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 L;. }.. if
12ba0 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 (statePtr->prot
12bb0 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 os) {..ckfree(st
12bc0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b atePtr->protos);
12bd0 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 ..statePtr->prot
12be0 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d os = NULL;. }
12bf0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
12c00 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 r->bio) {../* Th
12c10 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c is will call SSL
12c20 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 _shutdown. Bug 1
12c30 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 414045 */..dprin
12c40 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c tf("BIO_free_all
12c50 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d (%p)", statePtr-
12c60 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 >bio);..BIO_free
12c70 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 _all(statePtr->b
12c80 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e io);..statePtr->
12c90 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 bio = NULL;.
12ca0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 }. if (stateP
12cb0 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 tr->ssl) {..dpri
12cc0 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 ntf("SSL_free(%p
12cd0 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 )", statePtr->ss
12ce0 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 l);..SSL_free(st
12cf0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 atePtr->ssl);..s
12d00 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e tatePtr->ssl = N
12d10 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
12d20 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 f (statePtr->ctx
12d30 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 ) {..SSL_CTX_fre
12d40 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 e(statePtr->ctx)
12d50 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ;..statePtr->ctx
12d60 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
12d70 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
12d80 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 >callback) {..Tc
12d90 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
12da0 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
12db0 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 k);..statePtr->c
12dc0 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a allback = NULL;.
12dd0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
12de0 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
12df0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
12e00 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
12e10 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 password);..stat
12e20 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d ePtr->password =
12e30 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
12e40 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 if (statePtr->v
12e50 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 cmd) {..Tcl_Decr
12e60 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
12e70 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 r->vcmd);..state
12e80 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c Ptr->vcmd = NULL
12e90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
12ea0 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 intf("Returning"
12eb0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
12f00 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d *. * Tls_Init -
12f10 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 -. *. *.This is
12f20 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 a package initia
12f30 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 lization procedu
12f40 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c re, which is cal
12f50 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 led. *.by Tcl wh
12f60 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 en this package
12f70 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 is to be added t
12f80 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 o an interpreter
12f90 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
12fa0 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 Ssl configured
12fb0 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 and loaded. *.
12fc0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
12fd0 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 *. create the s
12fe0 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 sl command, init
12ff0 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 ialize ssl conte
13000 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d xt. *. *--------
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
13050 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c DLLEXPORT int Tl
13060 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 s_Init(Tcl_Inter
13070 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 p *interp) {.
13080 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 const char tlsT
13090 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d clInitScript[] =
130a0 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 {.#include "tls
130b0 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 .tcl.h"..0x00.
130c0 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 };.. dprint
130d0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 f("Called");..#i
130e0 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 f TCL_MAJOR_VERS
130f0 49 4f 4e 20 3e 20 38 0a 23 69 66 64 65 66 20 55 ION > 8.#ifdef U
13100 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 SE_TCL_STUBS.
13110 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 if (Tcl_InitStu
13120 62 73 28 69 6e 74 65 72 70 2c 20 22 39 2e 30 22 bs(interp, "9.0"
13130 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a , 0) == NULL) {.
13140 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
13150 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a R;. }.#endif.
13160 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 if (Tcl_PkgR
13170 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 equire(interp, "
13180 54 63 6c 22 2c 20 22 39 2e 30 2d 22 2c 20 30 29 Tcl", "9.0-", 0)
13190 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
131a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
131b0 20 20 20 7d 0a 23 65 6c 73 65 0a 23 69 66 64 65 }.#else.#ifde
131c0 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a f USE_TCL_STUBS.
131d0 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 if (Tcl_Init
131e0 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 Stubs(interp, "8
131f0 2e 35 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 .5", 0) == NULL)
13200 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
13210 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 RROR;. }.#end
13220 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 if. if (Tcl_P
13230 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 kgRequire(interp
13240 2c 20 22 54 63 6c 22 2c 20 22 38 2e 35 2d 22 2c , "Tcl", "8.5-",
13250 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 0) == NULL) {..
13260 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
13270 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
13280 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e if (TlsLibIn
13290 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 it(0) != TCL_OK)
132a0 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
132b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f sult(interp, "co
132c0 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 uld not initiali
132d0 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c ze SSL library",
132e0 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
132f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
13300 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 .. Tcl_Create
13310 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
13320 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 p, "tls::connect
13330 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e ion", Connection
13340 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 InfoObjCmd, (Cli
13350 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
13360 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
13370 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
13380 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
13390 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
133a0 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 handshake", Hand
133b0 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c shakeObjCmd, (Cl
133c0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
133d0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
133e0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
133f0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
13400 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
13410 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 :import", Import
13420 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
13430 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
13440 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
13450 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
13460 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
13470 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 terp, "tls::misc
13480 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 ", MiscObjCmd, (
13490 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
134a0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
134b0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
134c0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
134d0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
134e0 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e s::unimport", Un
134f0 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 importObjCmd, (C
13500 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
13510 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
13520 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
13530 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
13540 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
13550 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 ::status", Statu
13560 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
13570 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
13580 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
13590 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 44 ULL);.. Tls_D
135a0 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 28 69 6e igestCommands(in
135b0 74 65 72 70 29 3b 0a 20 20 20 20 54 6c 73 5f 45 terp);. Tls_E
135c0 6e 63 72 79 70 74 43 6f 6d 6d 61 6e 64 73 28 69 ncryptCommands(i
135d0 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 6c 73 5f nterp);. Tls_
135e0 49 6e 66 6f 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 InfoCommands(int
135f0 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 erp);.. if (i
13600 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 nterp) {..Tcl_Ev
13610 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 al(interp, tlsTc
13620 6c 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 lInitScript);.
13630 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 }.. return
13640 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 Tcl_PkgProvide(i
13650 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e nterp, PACKAGE_N
13660 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 AME, PACKAGE_VER
13670 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d SION);.}../*. *-
13680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136b0 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
136c0 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a _SafeInit --. *.
136d0 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.-------------
136e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13700 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 ---*. *.Standard
13710 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 procedure requi
13720 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 red by 'load'..
13730 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 *.Initializes th
13740 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 is extension for
13750 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 a safe interpre
13760 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d ter.. *.--------
13770 2d 2d 2d 2d 2d 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 2a 0a 20 2a 0a 20 2a 09 --------*. *. *.
137a0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
137b0 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 ..As of 'Tls_Ini
137c0 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a t'. *. *.Result:
137d0 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 . *..A standard
137e0 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a Tcl error code..
137f0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
13800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f -----------*. */
13830 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 .DLLEXPORT int T
13840 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f ls_SafeInit(Tcl_
13850 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 Interp *interp)
13860 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 {. dprintf("C
13870 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 alled");. ret
13880 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 urn(Tls_Init(int
13890 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d erp));.}../*. *-
138a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138d0 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 -----*. *. *.Tls
138e0 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a LibInit --. *. *
138f0 09 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 09 49 6e 69 74 69 61 6c 69 7a 65 -*. *.Initialize
13930 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e s SSL library on
13940 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 ce per applicati
13950 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d on. *.----------
13960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13980 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 ------*. *. *.Si
13990 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 de effects:. *..
139a0 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 initializes SSL
139b0 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 library. *. *.Re
139c0 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 sult:. *..none.
139d0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
139e0 2d 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 2f 0a ----------*. */.
13a10 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 static int TlsLi
13a20 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 bInit(int uninit
13a30 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 ialize) {. st
13a40 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c atic int initial
13a50 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e ized = 0;. in
13a60 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f t status = TCL_O
13a70 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f K;.#if defined(O
13a80 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 PENSSL_THREADS)
13a90 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 && defined(TCL_T
13aa0 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 HREADS). size
13ab0 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 _t num_locks;.#e
13ac0 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e ndif.. if (un
13ad0 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 initialize) {..i
13ae0 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 f (!initialized)
13af0 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
13b00 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 "Asked to uninit
13b10 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 ialize, but we a
13b20 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a re not initializ
13b30 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 ed");... retu
13b40 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a rn(TCL_OK);..}..
13b50 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 .dprintf("Asked
13b60 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 to uninitialize"
13b70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
13b80 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
13b90 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
13ba0 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
13bb0 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 texLock(&init_mx
13bc0 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 );...if (locks)
13bd0 7b 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b {.. free(lock
13be0 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d s);.. locks =
13bf0 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b NULL;.. lock
13c00 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 sCount = 0;..}.#
13c10 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a endif..initializ
13c20 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 ed = 0;..#if def
13c30 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
13c40 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
13c50 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 (TCL_THREADS)..T
13c60 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
13c70 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
13c80 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b ...return(TCL_OK
13c90 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
13ca0 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b (initialized) {
13cb0 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 ..dprintf("Calle
13cc0 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 d, but using cac
13cd0 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 hed value");..re
13ce0 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 turn(status);.
13cf0 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
13d00 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 ("Called");..#if
13d10 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
13d20 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 _THREADS) && def
13d30 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
13d40 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c ). Tcl_MutexL
13d50 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 ock(&init_mx);.#
13d60 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 endif. initia
13d70 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 lized = 1;..#if
13d80 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
13d90 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
13da0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
13db0 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d . num_locks =
13dc0 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 1;. locksCou
13dd0 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c nt = (int) num_l
13de0 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 ocks;. locks
13df0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 = malloc(sizeof(
13e00 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
13e10 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 cks);. memset
13e20 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f (locks, 0, sizeo
13e30 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f f(*locks) * num_
13e40 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a locks);.#endif..
13e50 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a /* Initializ
13e60 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f e BOTH libcrypto
13e70 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a and libssl. */.
13e80 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 OPENSSL_init
13e90 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 _ssl(OPENSSL_INI
13ea0 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e T_LOAD_SSL_STRIN
13eb0 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 GS | OPENSSL_INI
13ec0 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 T_LOAD_CRYPTO_ST
13ed0 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c RINGS..| OPENSSL
13ee0 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 _INIT_ADD_ALL_CI
13ef0 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f PHERS | OPENSSL_
13f00 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 INIT_ADD_ALL_DIG
13f10 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 ESTS, NULL);..
13f20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 BIO_new_tcl(NU
13f30 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 LL, 0);..#if 0.
13f40 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 /*. * XXX
13f50 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 :TODO: Remove th
13f60 69 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c is code and repl
13f70 61 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68 ace it with a ch
13f80 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 eck. * for e
13f90 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e nough entropy an
13fa0 64 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 d do not try to
13fb0 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 create our own.
13fc0 20 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 * terrible e
13fd0 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 ntropy. */.
13fe0 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 /*. * See
13ff0 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d d the random num
14000 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e ber generator in
14010 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 the SSL library
14020 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 ,. * using t
14030 68 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 he do/while cons
14040 74 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 truct because of
14050 20 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e the bug note in
14060 20 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e the. * Open
14070 53 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a SSL FAQ at http:
14080 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 //www.openssl.or
14090 67 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 g/support/faq.ht
140a0 6d 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a ml#USER1. *.
140b0 20 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 * The crux
140c0 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 of the problem i
140d0 73 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 s that Solaris 7
140e0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 does not have a
140f0 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e . * /dev/ran
14100 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e dom or /dev/uran
14110 64 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 dom device so it
14120 20 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 cannot gather e
14130 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 nough. * ent
14140 72 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 ropy from the RA
14150 4e 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 ND_seed() when T
14160 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 LS initializes a
14170 6e 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 nd refuses.
14180 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e * to go further.
14190 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e Earlier version
141a0 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 s of OpenSSL car
141b0 72 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 ried on regardle
141c0 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ss.. */.
141d0 73 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 srand((unsigned
141e0 69 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f int) time((time_
141f0 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 t *) NULL));.
14200 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 do {..for (i =
14210 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 0; i < 16; i++)
14220 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b {.. rnd_seed[
14230 69 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 i] = 1 + (char)
14240 28 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f (255.0 * rand()/
14250 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b (RAND_MAX+1.0));
14260 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 ..}..RAND_seed(r
14270 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 nd_seed, sizeof(
14280 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 rnd_seed));.
14290 7d 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 } while (RAND_st
142a0 61 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 atus() != 1);.#e
142b0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 ndif..#if define
142c0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 d(OPENSSL_THREAD
142d0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 S) && defined(TC
142e0 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f L_THREADS)..Tcl_
142f0 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 MutexUnlock(&ini
14300 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 t_mx);.#endif...
14310 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a return(status);.
14320 7d 0a }.