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 6c 65 76 65 6c 22 2c -securitylevel",
80e0: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f level);..OPTBOO
80f0: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 L("-server", ser
8100: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d ver);..OPTSTR("-
8110: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 servername", ser
8120: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 vername);..OPTST
8130: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c R("-session_id",
8140: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f session_id);..O
8150: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 PTBOOL("-ssl2",
8160: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 ssl2);..OPTBOOL(
8170: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a "-ssl3", ssl3);.
8180: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 .OPTBOOL("-tls1"
8190: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f , tls1);..OPTBOO
81a0: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 L("-tls1.1", tls
81b0: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 1_1);..OPTBOOL("
81c0: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 -tls1.2", tls1_2
81d0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c );..OPTBOOL("-tl
81e0: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a s1.3", tls1_3);.
81f0: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 .OPTOBJ("-valida
8200: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 tecommand", vcmd
8210: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d );..OPTOBJ("-vcm
8220: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 d", vcmd);...OPT
8230: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d BAD("option", "-
8240: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 alpn, -cadir, -c
8250: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 afile, -cert, -c
8260: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 ertfile, -cipher
8270: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c , -ciphersuites,
8280: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 -command, -dhpa
8290: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 rams, -key, -key
82a0: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 file, -model, -p
82b0: 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 assword, -post_h
82c0: 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 andshake, -reque
82d0: 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 st, -require, -s
82e0: 65 63 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d 73 ecuritylevel, -s
82f0: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 erver, -serverna
8300: 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c me, -session_id,
8310: 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d -ssl2, -ssl3, -
8320: 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d tls1, -tls1.1, -
8330: 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c tls1.2, -tls1.3,
8340: 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d or -validatecom
8350: 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e mand");...return
8360: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8370: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 }. if (reques
8380: 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53 t)..verify |= SS
8390: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f L_VERIFY_CLIENT_
83a0: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 ONCE | SSL_VERIF
83b0: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 Y_PEER;. if (
83c0: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69 request && requi
83d0: 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 re).verify |= SS
83e0: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 L_VERIFY_FAIL_IF
83f0: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 _NO_PEER_CERT;.
8400: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 if (request &
8410: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 & post_handshake
8420: 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f ).verify |= SSL_
8430: 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 VERIFY_POST_HAND
8440: 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 SHAKE;. if (v
8450: 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72 erify == 0)..ver
8460: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 ify = SSL_VERIFY
8470: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 _NONE;.. prot
8480: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 o |= (ssl2 ? TLS
8490: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 _PROTO_SSL2 : 0)
84a0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
84b0: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f ssl3 ? TLS_PROTO
84c0: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 _SSL3 : 0);.
84d0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f proto |= (tls1 ?
84e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 TLS_PROTO_TLS1
84f0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
8500: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 |= (tls1_1 ? TLS
8510: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 _PROTO_TLS1_1 :
8520: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
8530: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 (tls1_2 ? TLS_P
8540: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 ROTO_TLS1_2 : 0)
8550: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 ;. proto |= (
8560: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f tls1_3 ? TLS_PRO
8570: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a TO_TLS1_3 : 0);.
8580: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f . /* reset to
8590: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 NULL if blank s
85a0: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a tring provided *
85b0: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26 /. if (cert &
85c0: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 & !*cert)..
85d0: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20 cert.
85e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
85f0: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 key && !*key)..
8600: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 key.
8610: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
8620: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 f (certfile && !
8630: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 *certfile)
8640: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 certfile.= NU
8650: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 LL;. if (keyf
8660: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 ile && !*keyfile
8670: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 )..keyfile.
8680: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
8690: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a f (ciphers && !*
86a0: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20 ciphers).
86b0: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20 ciphers.
86c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
86d0: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26 (ciphersuites &&
86e0: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29 !*ciphersuites)
86f0: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20 ciphersuites
8700: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
8710: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 (CAfile && !*CAf
8720: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66 ile). CAf
8730: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 ile. = NU
8740: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 LL;. if (CAdi
8750: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20 r && !*CAdir).
8760: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20 CAdir.
8770: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 = NULL;.
8780: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 if (DHparams &&
8790: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 !*DHparams).
87a0: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 DHparams
87b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 = NULL;..
87c0: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 /* new SSL stat
87d0: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 e */. statePt
87e0: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 r..= (State *) c
87f0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 kalloc((unsigned
8800: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 ) sizeof(State))
8810: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 ;. memset(sta
8820: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 tePtr, 0, sizeof
8830: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 (State));.. s
8840: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d tatePtr->flags.=
8850: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 flags;. stat
8860: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 ePtr->interp.= i
8870: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 nterp;. state
8880: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 Ptr->vflags.= ve
8890: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 rify;. stateP
88a0: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 tr->err.= "";..
88b0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 /* allocate s
88c0: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 cript */. if
88d0: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 (script) {..(voi
88e0: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 d) Tcl_GetString
88f0: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 FromObj(script,
8900: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 &len);..if (len)
8910: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 {.. statePtr
8920: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 ->callback = scr
8930: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e ipt;.. Tcl_In
8940: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 crRefCount(state
8950: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a Ptr->callback);.
8960: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
8970: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f allocate passwo
8980: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 rd */. if (pa
8990: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 ssword) {..(void
89a0: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 ) Tcl_GetStringF
89b0: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c romObj(password,
89c0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e &len);..if (len
89d0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 ) {.. statePt
89e0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 r->password = pa
89f0: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c ssword;.. Tcl
8a00: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _IncrRefCount(st
8a10: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 atePtr->password
8a20: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
8a30: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c /* allocate val
8a40: 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f idate command */
8a50: 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b . if (vcmd) {
8a60: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 ..(void) Tcl_Get
8a70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 StringFromObj(vc
8a80: 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 md, &len);..if (
8a90: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 len) {.. stat
8aa0: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d ePtr->vcmd = vcm
8ab0: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 d;.. Tcl_Incr
8ac0: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 RefCount(statePt
8ad0: 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 r->vcmd);..}.
8ae0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 }.. if (mode
8af0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e l != NULL) {..in
8b00: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 t mode;../* Get
8b10: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 the "model" cont
8b20: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 ext */..chan = T
8b30: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e cl_GetChannel(in
8b40: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f terp, model, &mo
8b50: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d de);..if (chan =
8b60: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
8b70: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 NULL) {.. Tls
8b80: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
8b90: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
8ba0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8bb0: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b ..}.../*.. * Mak
8bc0: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 e sure to operat
8bd0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 e on the topmost
8be0: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 channel.. */..c
8bf0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
8c00: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 Channel(chan);..
8c10: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
8c20: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
8c30: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 Tls_ChannelType(
8c40: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
8c50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8c60: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
8c70: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
8c80: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
8c90: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 ."\": not a TLS
8ca0: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b channel", NULL);
8cb0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
8cc0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
8cd0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
8ce0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 "CHANNEL", "INVA
8cf0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LID", (char *) N
8d00: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
8d10: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
8d20: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
8d30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
8d40: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 }..ctx = ((State
8d50: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 *)Tcl_GetChanne
8d60: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 lInstanceData(ch
8d70: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d an))->ctx;. }
8d80: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 else {..if ((ct
8d90: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 x = CTX_Init(sta
8da0: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 tePtr, server, p
8db0: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 roto, keyfile, c
8dc0: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 ertfile, key, ce
8dd0: 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 rt, key_len,..
8de0: 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 cert_len, CAdi
8df0: 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 r, CAfile, ciphe
8e00: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 rs, ciphersuites
8e10: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d , level, DHparam
8e20: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 s)) == NULL) {..
8e30: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 Tls_Free((ch
8e40: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
8e50: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
8e60: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
8e70: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e .. statePtr->
8e80: 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 ctx = ctx;..
8e90: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 /*. * We nee
8ea0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 d to make sure t
8eb0: 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 hat the channel
8ec0: 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 works in binary
8ed0: 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 (for the. *
8ee0: 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 encryption not t
8ef0: 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 o get goofed up)
8f00: 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 .. * We only
8f10: 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 want to adjust
8f20: 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e the buffering in
8f30: 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 pre-v2 channels
8f40: 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 , where. * e
8f50: 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 ach channel in t
8f60: 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 he stack maintai
8f70: 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 ned its own buff
8f80: 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ers.. */.
8f90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
8fa0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 (&upperChannelTr
8fb0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 anslation);.
8fc0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 Tcl_DStringInit(
8fd0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f &upperChannelBlo
8fe0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f cking);. Tcl_
8ff0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 DStringInit(&upp
9000: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 erChannelEOFChar
9010: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
9020: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 ngInit(&upperCha
9030: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 nnelEncoding);.
9040: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 Tcl_GetChanne
9050: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
9060: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 chan, "-eofchar"
9070: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 , &upperChannelE
9080: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c OFChar);. Tcl
9090: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _GetChannelOptio
90a0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
90b0: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 "-encoding", &up
90c0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 perChannelEncodi
90d0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 ng);. Tcl_Get
90e0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
90f0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
9100: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 anslation", &upp
9110: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 erChannelTransla
9120: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 tion);. Tcl_G
9130: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9140: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
9150: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 blocking", &uppe
9160: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
9170: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
9180: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
9190: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
91a0: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 slation", "binar
91b0: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 y");. Tcl_Set
91c0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
91d0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
91e0: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 ocking", "true")
91f0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 ;. dprintf("C
9200: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 onsuming Tcl cha
9210: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 nnel %s", Tcl_Ge
9220: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
9230: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 n));. statePt
9240: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 r->self = Tcl_St
9250: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ackChannel(inter
9260: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 p, Tls_ChannelTy
9270: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 pe(), (ClientDat
9280: 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 54 43 a) statePtr, (TC
9290: 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c L_READABLE | TCL
92a0: 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e _WRITABLE), chan
92b0: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
92c0: 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 Created channel
92d0: 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 named %s", Tcl_G
92e0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
92f0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a atePtr->self));.
9300: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
9310: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 ->self == (Tcl_C
9320: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
9330: 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f ./*.. * No use o
9340: 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 f Tcl_Eventually
9350: 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 Free because no
9360: 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 possible Tcl_Pre
9370: 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 serve... */..Tls
9380: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
9390: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 tatePtr);..retur
93a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
93b0: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 }.. Tcl_SetC
93c0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
93d0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 erp, statePtr->s
93e0: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 elf, "-translati
93f0: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 on", Tcl_DString
9400: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e Value(&upperChan
9410: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 nelTranslation))
9420: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 ;. Tcl_SetCha
9430: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
9440: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c p, statePtr->sel
9450: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 f, "-encoding",
9460: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
9470: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e (&upperChannelEn
9480: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 coding));. Tc
9490: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
94a0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 on(interp, state
94b0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 Ptr->self, "-eof
94c0: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 char", Tcl_DStri
94d0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 ngValue(&upperCh
94e0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a annelEOFChar));.
94f0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
9500: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
9510: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c statePtr->self,
9520: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 "-blocking", Tc
9530: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
9540: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 upperChannelBloc
9550: 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a king));.. /*.
9560: 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 * SSL Initi
9570: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a alization. *
9580: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e /. statePtr->
9590: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 ssl = SSL_new(st
95a0: 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 atePtr->ctx);.
95b0: 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d if (!statePtr-
95c0: 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 >ssl) {../* SSL
95d0: 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f library error */
95e0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
95f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c lt(interp, "coul
9600: 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73 dn't construct s
9610: 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 sl session: ", R
9620: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
9630: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 ) NULL);.. Tc
9640: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
9650: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 nterp, "TLS", "I
9660: 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 MPORT", "INIT",
9670: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 "FAILED", (char
9680: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 *) NULL);..Tls_F
9690: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
96a0: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 tePtr);..return
96b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
96c0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 .. /* Set hos
96d0: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f t server name */
96e0: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e . if (servern
96f0: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 ame) {../* Sets
9700: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 the server name
9710: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 indication (SNI)
9720: 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 in ClientHello
9730: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a extension */../*
9740: 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68 Per RFC 6066, h
9750: 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43 ostname is a ASC
9760: 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e II encoded strin
9770: 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33 g, though RFC 43
9780: 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 66 says UTF-8. *
9790: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f /..if (!SSL_set_
97a0: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 tlsext_host_name
97b0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
97c0: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72 servername) && r
97d0: 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54 equire) {.. T
97e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
97f0: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 interp, "setting
9800: 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 TLS host name e
9810: 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 xtension failed"
9820: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9830: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
9840: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
9850: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
9860: 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 "SNI", "FAILED"
9870: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9880: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 ;.. Tls_Free(
9890: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
98a0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
98b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
98c0: 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 /* Set hostname
98d0: 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 for peer certifi
98e0: 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 cate hostname ve
98f0: 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c rification in cl
9900: 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 ients... Don't
9910: 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f use SSL_set1_ho
9920: 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 st since it has
9930: 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a limitations. */.
9940: 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 .if (!SSL_add1_h
9950: 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ost(statePtr->ss
9960: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 l, servername))
9970: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
9980: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
9990: 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 6f 73 "setting DNS hos
99a0: 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 2c 20 t name failed",
99b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
99c0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f . Tcl_SetErro
99d0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
99e0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 LS", "IMPORT", "
99f0: 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c HOSTNAME", "FAIL
9a00: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
9a10: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 LL);.. Tls_Fr
9a20: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 ee((char *) stat
9a30: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 ePtr);.. retu
9a40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
9a50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 . }.. /* R
9a60: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 esume session id
9a70: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 */. if (sess
9a80: 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e ion_id && strlen
9a90: 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 (session_id) <=
9aa0: 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f SSL_MAX_SID_CTX_
9ab0: 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 LENGTH) {../* SS
9ac0: 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 L_set_session()
9ad0: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 */..if (!SSL_SES
9ae0: 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e SION_set1_id_con
9af0: 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 text(SSL_get_ses
9b00: 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 sion(statePtr->s
9b10: 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c sl), session_id,
9b20: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
9b30: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 strlen(session_i
9b40: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f d))) {.. Tcl_
9b50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
9b60: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 erp, "Resume ses
9b70: 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69 sion id ", sessi
9b80: 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22 on_id, " failed"
9b90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9ba0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
9bb0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
9bc0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
9bd0: 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 "SESSION", "FAI
9be0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
9bf0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 ULL);.. Tls_F
9c00: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 ree((char *) sta
9c10: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 tePtr);.. ret
9c20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
9c30: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
9c40: 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 Enable Applicati
9c50: 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f on-Layer Protoco
9c60: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 l Negotiation. E
9c70: 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 xamples are: htt
9c80: 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 p/1.0,..http/1.1
9c90: 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 , h2, h3, ftp, i
9ca0: 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d map, pop3, xmpp-
9cb0: 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 client, xmpp-ser
9cc0: 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 ver, mqtt, irc,
9cd0: 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 etc. */. if (
9ce0: 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 alpn) {../* Conv
9cf0: 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 ert a TCL list i
9d00: 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c nto a protocol-l
9d10: 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d ist in wire-form
9d20: 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 at */..unsigned
9d30: 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 char *protos, *p
9d40: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ;..unsigned int
9d50: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a protos_len = 0;.
9d60: 09 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 .int i, len, cnt
9d70: 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 ;..Tcl_Obj **lis
9d80: 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 t;...if (Tcl_Lis
9d90: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
9da0: 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 interp, alpn, &c
9db0: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 nt, &list) != TC
9dc0: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 L_OK) {.. Tls
9dd0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
9de0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
9df0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9e00: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 ..}.../* Determi
9e10: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 ne the memory re
9e20: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 quired for the p
9e30: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
9e40: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
9e50: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 cnt; i++) {..
9e60: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 Tcl_GetStringF
9e70: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
9e80: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 &len);.. if (
9e90: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 len > 255) {...T
9ea0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
9eb0: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 interp, "ALPN pr
9ec0: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 otocol name too
9ed0: 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 long", (char *)
9ee0: 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 NULL);...Tcl_Set
9ef0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
9f00: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 , "TLS", "IMPORT
9f10: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c ", "ALPN", "FAIL
9f20: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ED", (char *) NU
9f30: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 LL);...Tls_Free(
9f40: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 (char *) statePt
9f50: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c r);...return TCL
9f60: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
9f70: 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b protos_len +
9f80: 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 = 1 + len;..}...
9f90: 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d /* Build the com
9fa0: 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c plete protocol-l
9fb0: 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d ist */..protos =
9fc0: 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f ckalloc(protos_
9fd0: 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 len);../* protoc
9fe0: 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 ol-lists consist
9ff0: 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 of 8-bit length
a000: 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 -prefixed, byte
a010: 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 strings */..for
a020: 28 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 (i = 0, p = prot
a030: 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b os; i < cnt; i++
a040: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 ) {.. char *s
a050: 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 tr = Tcl_GetStri
a060: 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 ngFromObj(list[i
a070: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a ], &len);.. *
a080: 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 p++ = len;..
a090: 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 6c memcpy(p, str, l
a0a0: 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c en);.. p += l
a0b0: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f en;..}.../* SSL_
a0c0: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 set_alpn_protos
a0d0: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 makes a copy of
a0e0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 the protocol-lis
a0f0: 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 t */../* Note: T
a100: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 his functions re
a110: 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 verses the retur
a120: 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 n value conventi
a130: 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 on */..if (SSL_s
a140: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 et_alpn_protos(s
a150: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 tatePtr->ssl, pr
a160: 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e otos, protos_len
a170: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 )) {.. Tcl_Ap
a180: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
a190: 70 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65 p, "failed to se
a1a0: 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 t ALPN protocols
a1b0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
a1c0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
a1d0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
a1e0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
a1f0: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 , "ALPN", "FAILE
a200: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
a210: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
a220: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
a230: 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 Ptr);.. ckfre
a240: 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 e(protos);..
a250: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a260: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 ;..}.../* Store
a270: 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a protocols list *
a280: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f /..statePtr->pro
a290: 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 tos = protos;..s
a2a0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
a2b0: 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e len = protos_len
a2c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
a2d0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
a2e0: 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 = NULL;..stateP
a2f0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d tr->protos_len =
a300: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 0;. }.. /
a310: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c *. * SSL Cal
a320: 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 lbacks. */.
a330: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 SSL_set_app_d
a340: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ata(statePtr->ss
a350: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 l, (void *)state
a360: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 Ptr);./* point b
a370: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 ack to us */.
a380: 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 SSL_set_verify(
a390: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 statePtr->ssl, v
a3a0: 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c erify, VerifyCal
a3b0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f lback);. SSL_
a3c0: 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 set_info_callbac
a3d0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c k(statePtr->ssl,
a3e0: 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a InfoCallback);.
a3f0: 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b . /* Callback
a400: 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 for observing p
a410: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 rotocol messages
a420: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e */.#ifndef OPEN
a430: 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 SSL_NO_SSL_TRACE
a440: 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c . /* void SSL
a450: 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c _CTX_set_msg_cal
a460: 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 lback_arg(stateP
a470: 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a tr->ctx, (void *
a480: 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 )statePtr);.
a490: 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 void SSL_CTX_set
a4a0: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 _msg_callback(st
a4b0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 atePtr->ctx, Mes
a4c0: 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a sageCallback); *
a4d0: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 /. SSL_set_ms
a4e0: 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 g_callback_arg(s
a4f0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 tatePtr->ssl, (v
a500: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
a510: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 . SSL_set_msg
a520: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 _callback(stateP
a530: 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 tr->ssl, Message
a540: 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 Callback);.#endi
a550: 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 f.. /* Create
a560: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f Tcl_Channel BIO
a570: 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 Handler */.
a580: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 statePtr->p_bio.
a590: 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 = BIO_new_tcl(st
a5a0: 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c atePtr, BIO_NOCL
a5b0: 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 OSE);. stateP
a5c0: 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 tr->bio.= BIO_ne
a5d0: 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a w(BIO_f_ssl());.
a5e0: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 . if (server)
a5f0: 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 {../* Server ca
a600: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f llbacks */..SSL_
a610: 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 CTX_set_tlsext_s
a620: 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 ervername_arg(st
a630: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f atePtr->ctx, (vo
a640: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a id *)statePtr);.
a650: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 .SSL_CTX_set_tls
a660: 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 ext_servername_c
a670: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 allback(statePtr
a680: 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 ->ctx, SNICallba
a690: 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 ck);..SSL_CTX_se
a6a0: 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 t_client_hello_c
a6b0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
a6c0: 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 HelloCallback,
a6d0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 (void *)statePtr
a6e0: 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 );..if (statePtr
a6f0: 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c ->protos != NULL
a700: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 ) {.. SSL_CTX
a710: 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 _set_alpn_select
a720: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _cb(statePtr->ct
a730: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c x, ALPNCallback,
a740: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
a750: 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e r);.#ifdef USE_N
a760: 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 PN.. if (tls1
a770: 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f _2 == 0 && tls1_
a780: 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 3 == 0) {...SSL_
a790: 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f CTX_set_next_pro
a7a0: 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 tos_advertised_c
a7b0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c b(statePtr->ctx,
a7c0: 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 NPNCallback, (v
a7d0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
a7e0: 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 .. }.#endif..
a7f0: 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 }.../* Enable se
a800: 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 rver to send cer
a810: 74 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20 t request after
a820: 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 handshake (TLS 1
a830: 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 .3 only) */../*
a840: 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f A write operatio
a850: 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 n must take plac
a860: 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 e for the Certif
a870: 69 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f icate Request to
a880: 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 be.. sent to
a890: 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 the client, this
a8a0: 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 can be done wit
a8b0: 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 h SSL_do_handsha
a8c0: 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 ke(). */..if (re
a8d0: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 quest && post_ha
a8e0: 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f ndshake && tls1_
a8f0: 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 3) {.. SSL_ve
a900: 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 rify_client_post
a910: 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 _handshake(state
a920: 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 Ptr->ssl);..}...
a930: 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 /* set automatic
a940: 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e curve selection
a950: 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 */..SSL_set_ecd
a960: 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d h_auto(statePtr-
a970: 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 >ssl, 1);.../* S
a980: 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a et server mode *
a990: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 /..statePtr->fla
a9a0: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 gs |= TLS_TCL_SE
a9b0: 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 RVER;..SSL_set_a
a9c0: 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 ccept_state(stat
a9d0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 ePtr->ssl);.
a9e0: 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 } else {../* Cli
a9f0: 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f ent callbacks */
aa00: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a .#ifdef USE_NPN.
aa10: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 .if (statePtr->p
aa20: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 rotos != NULL &&
aa30: 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 tls1_2 == 0 &&
aa40: 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 tls1_3 == 0) {..
aa50: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f SSL_CTX_set_
aa60: 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 next_proto_selec
aa70: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 t_cb(statePtr->c
aa80: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b tx, ALPNCallback
aa90: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
aaa0: 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a tr);..}.#endif..
aab0: 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 ./* Session cach
aac0: 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f ing */..SSL_CTX_
aad0: 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 set_session_cach
aae0: 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d e_mode(statePtr-
aaf0: 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 >ctx, SSL_SESS_C
ab00: 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 ACHE_CLIENT | SS
ab10: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f L_SESS_CACHE_NO_
ab20: 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b INTERNAL_STORE);
ab30: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 ..SSL_CTX_sess_s
ab40: 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 et_new_cb(stateP
ab50: 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e tr->ctx, Session
ab60: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 Callback);.../*
ab70: 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 Enable post hand
ab80: 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 shake Authentica
ab90: 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 tion extension.
aba0: 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f TLS 1.3 only, no
abb0: 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 t http/2. */..if
abc0: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 (request && pos
abd0: 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 t_handshake) {..
abe0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 SSL_set_post
abf0: 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 _handshake_auth(
ac00: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 statePtr->ssl, 1
ac10: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 );..}.../* Set c
ac20: 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 lient mode */..S
ac30: 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 SL_set_connect_s
ac40: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 tate(statePtr->s
ac50: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 sl);. }. S
ac60: 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 SL_set_bio(state
ac70: 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 Ptr->ssl, stateP
ac80: 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 tr->p_bio, state
ac90: 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 Ptr->p_bio);.
aca0: 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 BIO_set_ssl(sta
acb0: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 tePtr->bio, stat
acc0: 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e ePtr->ssl, BIO_N
acd0: 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a OCLOSE);.. /*
ace0: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 . * End of S
acf0: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a SL Init. */.
ad00: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
ad10: 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f urning %s", Tcl_
ad20: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
ad30: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b tatePtr->self));
ad40: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
ad50: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 lt(interp, (char
ad60: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e *) Tcl_GetChann
ad70: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
ad80: 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 >self), TCL_VOLA
ad90: 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 TILE);.. retu
ada0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 rn TCL_OK;..clie
adb0: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 ntData = clientD
adc0: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ata;.}.../*. *--
add0: 2d 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 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 -. *. * Unimport
ae20: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
ae30: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
ae40: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d s invoked to rem
ae50: 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 ove the topmost
ae60: 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a channel filter..
ae70: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
ae80: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
ae90: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
aea0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
aeb0: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 May modify the b
aec0: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f ehavior of an IO
aed0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
aee0: 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
af30: 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 t.UnimportObjCmd
af40: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
af50: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
af60: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
af70: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
af80: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
af90: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
afa0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
afb0: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f nnel to set a mo
afc0: 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 de on. */.. d
afd0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
afe0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
aff0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f != 2) {..Tcl_Wro
b000: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
b010: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e , 1, objv, "chan
b020: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 nel");..return T
b030: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
b040: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
b050: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
b060: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
b070: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 (objv[1]), NULL)
b080: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
b090: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
b0a0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
b0b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
b0c0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
b0d0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
b0e0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
b0f0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
b100: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
b110: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
b120: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
b130: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
b140: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
b150: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
b160: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b170: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
b180: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
b190: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c Name(chan),..."\
b1a0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 ": not a TLS cha
b1b0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 nnel", NULL);..
b1c0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
b1d0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
b1e0: 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 ", "UNIMPORT", "
b1f0: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c CHANNEL", "INVAL
b200: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ID", (char *) NU
b210: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
b220: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
b230: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 if (Tcl_Unsta
b240: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 ckChannel(interp
b250: 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 , chan) == TCL_E
b260: 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 RROR) {..return
b270: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
b280: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
b290: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 _OK;..clientData
b2a0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d = clientData;.}
b2b0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 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 0a 20 2a 0a 20 -----------. *.
b300: 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f * CTX_Init -- co
b310: 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 nstruct a SSL_CT
b320: 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a X instance. *. *
b330: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 Results:. *.A v
b340: 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 alid SSL_CTX ins
b350: 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 tance or NULL..
b360: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
b370: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 s:. *.constructs
b380: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 SSL context (CT
b390: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d X). *. *--------
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 0a 20 2a 2f 0a -----------. */.
b3e0: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a static SSL_CTX *
b3f0: 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 .CTX_Init(State
b400: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 *statePtr, int i
b410: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f sServer, int pro
b420: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c to, char *keyfil
b430: 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c e, char *certfil
b440: 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 e,. unsigned
b450: 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 char *key, unsig
b460: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 ned char *cert,
b470: 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 int key_len, int
b480: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 cert_len, char
b490: 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61 72 *CAdir,. char
b4a0: 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a *CAfile, char *
b4b0: 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 ciphers, char *c
b4c0: 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 iphersuites, int
b4d0: 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 level, char *DH
b4e0: 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 params) {. Tc
b4f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
b500: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 = statePtr->int
b510: 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 erp;. SSL_CTX
b520: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ctx = NULL;.
b530: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 Tcl_DString ds
b540: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
b550: 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f g ds1;. int o
b560: 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 ff = 0;. int
b570: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
b580: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f ;. const SSL_
b590: 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a METHOD *method;.
b5a0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
b5b0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 lled");.. if
b5c0: 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f (!proto) {..Tcl_
b5d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
b5e0: 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 erp, "no valid p
b5f0: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 rotocol selected
b600: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
b610: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 n NULL;. }..
b620: 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c /* create SSL
b630: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 context */.#if
b640: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
b650: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 NUMBER >= 0x1010
b660: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 0000L || defined
b670: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 (NO_SSL2) || def
b680: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
b690: 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e SSL2). if (EN
b6a0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
b6b0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a _PROTO_SSL2)) {.
b6c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
b6d0: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 t(interp, "SSL2
b6e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 protocol not sup
b6f0: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a ported", NULL);.
b700: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
b710: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 }.#endif.#if d
b720: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
b730: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
b740: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 SL_NO_SSL3).
b750: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 if (ENABLED(prot
b760: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c o, TLS_PROTO_SSL
b770: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 3)) {..Tcl_Appen
b780: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
b790: 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e "SSL3 protocol n
b7a0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e ot supported", N
b7b0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
b7c0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
b7d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
b7e0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 TLS1) || defined
b7f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
b800: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
b810: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
b820: 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c TO_TLS1)) {..Tcl
b830: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
b840: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 terp, "TLS 1.0 p
b850: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
b860: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
b870: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
b880: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
b890: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
b8a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
b8b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 SSL_NO_TLS1_1).
b8c0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
b8d0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
b8e0: 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f TLS1_1)) {..Tcl_
b8f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
b900: 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 erp, "TLS 1.1 pr
b910: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
b920: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 rted", NULL);..r
b930: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
b940: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
b950: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
b960: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 || defined(OPENS
b970: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 SL_NO_TLS1_2).
b980: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 if (ENABLED(pr
b990: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
b9a0: 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 LS1_2)) {..Tcl_A
b9b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
b9c0: 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f rp, "TLS 1.2 pro
b9d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
b9e0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ted", NULL);..re
b9f0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
ba00: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
ba10: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c ned(NO_TLS1_3) |
ba20: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
ba30: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
ba40: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f if (ENABLED(pro
ba50: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
ba60: 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 S1_3)) {..Tcl_Ap
ba70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
ba80: 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 p, "TLS 1.3 prot
ba90: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
baa0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
bab0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
bac0: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 #endif. if (p
bad0: 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a roto == 0) {../*
bae0: 20 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 Use full range
baf0: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f */..SSL_CTX_set_
bb00: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f min_proto_versio
bb10: 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f n(ctx, 0);..SSL_
bb20: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 CTX_set_max_prot
bb30: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 o_version(ctx, 0
bb40: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 );. }.. sw
bb50: 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 itch (proto) {.#
bb60: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
bb70: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
bb80: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
bb90: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
bba0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
bbb0: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 _NO_SSL2). ca
bbc0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c se TLS_PROTO_SSL
bbd0: 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 2:..method = isS
bbe0: 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 erver ? SSLv2_se
bbf0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 rver_method() :
bc00: 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 SSLv2_client_met
bc10: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 hod();..break;.#
bc20: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
bc30: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 ed(NO_SSL3) && !
bc40: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
bc50: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 NO_SSL3) && !def
bc60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
bc70: 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 SSL3_METHOD).
bc80: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
bc90: 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 SSL3:..method =
bca0: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 isServer ? SSLv3
bcb0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
bcc0: 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f : SSLv3_client_
bcd0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
bce0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
bcf0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 fined(NO_TLS1) &
bd00: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
bd10: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 SL_NO_TLS1) && !
bd20: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
bd30: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
bd40: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
bd50: 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 TO_TLS1:..method
bd60: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c = isServer ? TL
bd70: 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Sv1_server_metho
bd80: 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 d() : TLSv1_clie
bd90: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
bda0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
bdb0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
bdc0: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 _1) && !defined(
bdd0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
bde0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 1) && !defined(O
bdf0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 PENSSL_NO_TLS1_1
be00: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 _METHOD). cas
be10: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 e TLS_PROTO_TLS1
be20: 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 _1:..method = is
be30: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 Server ? TLSv1_1
be40: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
be50: 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e : TLSv1_1_clien
be60: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 t_method();..bre
be70: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ak;.#endif.#if !
be80: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
be90: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
bea0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 PENSSL_NO_TLS1_2
beb0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
bec0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f ENSSL_NO_TLS1_2_
bed0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 METHOD). case
bee0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
bef0: 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 2:..method = isS
bf00: 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f erver ? TLSv1_2_
bf10: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
bf20: 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 : TLSv1_2_client
bf30: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
bf40: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 k;.#endif.#if !d
bf50: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
bf60: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
bf70: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
bf80: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 . case TLS_PR
bf90: 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 OTO_TLS1_3:../*
bfa0: 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 Use the generic
bfb0: 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 method and const
bfc0: 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 raint range afte
bfd0: 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 r context is cre
bfe0: 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 ated */..method
bff0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 = isServer ? TLS
c000: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
c010: 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 : TLS_client_me
c020: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a thod();..break;.
c030: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 #endif. defau
c040: 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 lt:../* Negotiat
c050: 65 20 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 e highest availa
c060: 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 ble SSL/TLS vers
c070: 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d ion */..method =
c080: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f isServer ? TLS_
c090: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 server_method()
c0a0: 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 : TLS_client_met
c0b0: 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 hod();.#if OPENS
c0c0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
c0d0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 R < 0x10100000L
c0e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 && !defined(NO_S
c0f0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 SL2) && !defined
c100: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 (OPENSSL_NO_SSL2
c110: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c )..off |= (ENABL
c120: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
c130: 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 OTO_SSL2) ? 0
c140: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 : SSL_OP_NO_SSLv
c150: 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 2);.#endif.#if !
c160: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
c170: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
c180: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f NSSL_NO_SSL3)..o
c190: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
c1a0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
c1b0: 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 SSL3) ? 0 : SS
c1c0: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a L_OP_NO_SSLv3);.
c1d0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
c1e0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 ned(NO_TLS1) &&
c1f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
c200: 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c _NO_TLS1)..off |
c210: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
c220: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
c230: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 ) ? 0 : SSL_OP
c240: 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 _NO_TLSv1);.#end
c250: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 if.#if !defined(
c260: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 NO_TLS1_1) && !d
c270: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
c280: 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c O_TLS1_1)..off |
c290: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f = (ENABLED(proto
c2a0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 , TLS_PROTO_TLS1
c2b0: 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 _1) ? 0 : SSL_OP
c2c0: 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 _NO_TLSv1_1);.#e
c2d0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 ndif.#if !define
c2e0: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 d(NO_TLS1_2) &&
c2f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
c300: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 _NO_TLS1_2)..off
c310: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f |= (ENABLED(pro
c320: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c to, TLS_PROTO_TL
c330: 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f S1_2) ? 0 : SSL_
c340: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a OP_NO_TLSv1_2);.
c350: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
c360: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
c370: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
c380: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f SL_NO_TLS1_3)..o
c390: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 ff |= (ENABLED(p
c3a0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
c3b0: 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 TLS1_3) ? 0 : SS
c3c0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 L_OP_NO_TLSv1_3)
c3d0: 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b ;.#endif..break;
c3e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f . }.. ERR_
c3f0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
c400: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 ctx = SSL_CT
c410: 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 X_new(method);.
c420: 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 if (!ctx) {..
c430: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 return(NULL);.
c440: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 }.. if (get
c450: 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c env(SSLKEYLOGFIL
c460: 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 E)) {..SSL_CTX_s
c470: 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 et_keylog_callba
c480: 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 ck(ctx, KeyLogCa
c490: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a llback);. }..
c4a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f #if !defined(NO_
c4b0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 TLS1_3) && !defi
c4c0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c4d0: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 LS1_3). if (p
c4e0: 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 roto == TLS_PROT
c4f0: 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c O_TLS1_3) {..SSL
c500: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f _CTX_set_min_pro
c510: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 to_version(ctx,
c520: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b TLS1_3_VERSION);
c530: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 ..SSL_CTX_set_ma
c540: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 x_proto_version(
c550: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
c560: 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 ION);. }.#end
c570: 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 if.. /* Force
c580: 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f cipher selectio
c590: 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 n order by serve
c5a0: 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 r */. if (!is
c5b0: 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 Server) {..SSL_C
c5c0: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
c5d0: 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 tx, SSL_OP_CIPHE
c5e0: 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 R_SERVER_PREFERE
c5f0: 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 NCE);. }..#if
c600: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
c610: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 _NUMBER < 0x1010
c620: 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 0000L. OpenSS
c630: 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 L_add_all_algori
c640: 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 thms(); /* Load
c650: 63 69 70 68 65 72 73 20 61 6e 64 20 64 69 67 65 ciphers and dige
c660: 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 sts */.#endif..
c670: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 SSL_CTX_set_a
c680: 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76 6f pp_data(ctx, (vo
c690: 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 id*)interp);./*
c6a0: 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 remember the int
c6b0: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 erpreter */.
c6c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 SSL_CTX_set_opti
c6d0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f ons(ctx, SSL_OP_
c6e0: 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c ALL);./* all SSL
c6f0: 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 bug workarounds
c700: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f */. SSL_CTX_
c710: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c set_options(ctx,
c720: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 SSL_OP_NO_COMPR
c730: 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 ESSION);./* disa
c740: 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 ble compression
c750: 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 even if supporte
c760: 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 d */. SSL_CTX
c770: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 _set_options(ctx
c780: 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 , off);../* disa
c790: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 ble protocol ver
c7a0: 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 sions */.#if OPE
c7b0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
c7c0: 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 BER < 0x10101000
c7d0: 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 L. SSL_CTX_se
c7e0: 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f t_mode(ctx, SSL_
c7f0: 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 MODE_AUTO_RETRY)
c800: 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 ;./* handle new
c810: 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61 handshakes in ba
c820: 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 ckground. On by
c830: 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 default in OpenS
c840: 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e SL 1.1.1. */.#en
c850: 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f dif. SSL_CTX_
c860: 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 sess_set_cache_s
c870: 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a ize(ctx, 128);..
c880: 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 /* Set user
c890: 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c defined ciphers,
c8a0: 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 cipher suites,
c8b0: 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 and security lev
c8c0: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 el */. if ((c
c8d0: 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 iphers != NULL)
c8e0: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f && !SSL_CTX_set_
c8f0: 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c cipher_list(ctx,
c900: 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 ciphers)) {..Tc
c910: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c920: 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 nterp, "Set ciph
c930: 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 ers failed: No v
c940: 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 alid ciphers", (
c950: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
c960: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 SSL_CTX_free(ctx
c970: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
c980: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 . }. if ((
c990: 63 69 70 68 65 72 73 75 69 74 65 73 20 21 3d 20 ciphersuites !=
c9a0: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 NULL) && !SSL_CT
c9b0: 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 74 X_set_ciphersuit
c9c0: 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 75 es(ctx, ciphersu
c9d0: 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 ites)) {..Tcl_Ap
c9e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
c9f0: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 73 p, "Set cipher s
ca00: 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f uites failed: No
ca10: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c valid ciphers",
ca20: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
ca30: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
ca40: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
ca50: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
ca60: 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 Set security le
ca70: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c vel */. if (l
ca80: 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 evel > -1 && lev
ca90: 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 el < 6) {../* SS
caa0: 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c L_set_security_l
cab0: 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 evel */..SSL_CTX
cac0: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 _set_security_le
cad0: 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b vel(ctx, level);
cae0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 . }.. /* s
caf0: 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b et some callback
cb00: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 s */. SSL_CTX
cb10: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 _set_default_pas
cb20: 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 swd_cb(ctx, Pass
cb30: 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 wordCallback);.
cb40: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 SSL_CTX_set_d
cb50: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 efault_passwd_cb
cb60: 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 _userdata(ctx, (
cb70: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
cb80: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 ;.. /* read a
cb90: 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 Diffie-Hellman
cba0: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c parameters file,
cbb0: 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c or use the buil
cbc0: 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 t-in one */.#ifd
cbd0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 ef OPENSSL_NO_DH
cbe0: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
cbf0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 s != NULL) {..Tc
cc00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
cc10: 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d nterp, "DH param
cc20: 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 eter support not
cc30: 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 available", (ch
cc40: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 ar *) NULL);..SS
cc50: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
cc60: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
cc70: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b }.#else. {
cc80: 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 ..DH* dh;..if (D
cc90: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 Hparams != NULL)
cca0: 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f {.. BIO *bio
ccb0: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ;.. Tcl_DStri
ccc0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 ngInit(&ds);..
ccd0: 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f bio = BIO_new_
cce0: 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d file(F2N(DHparam
ccf0: 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 s, &ds), "r");..
cd00: 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a if (!bio) {.
cd10: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
cd20: 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 e(&ds);...Tcl_Ap
cd30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
cd40: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 p, "Could not fi
cd50: 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 nd DH parameters
cd60: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 file", (char *)
cd70: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 NULL);...SSL_CT
cd80: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 X_free(ctx);...r
cd90: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 eturn NULL;..
cda0: 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 }... dh = PE
cdb0: 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 M_read_bio_DHpar
cdc0: 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e ams(bio, NULL, N
cdd0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ULL, NULL);..
cde0: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a BIO_free(bio);.
cdf0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
ce00: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 Free(&ds);..
ce10: 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c if (!dh) {...Tcl
ce20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
ce30: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 terp, "Could not
ce40: 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 read DH paramet
ce50: 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 ers from file",
ce60: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
ce70: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
ce80: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
ce90: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c LL;.. }..} el
cea0: 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 67 se {.. dh = g
ceb0: 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a 09 et_dhParams();..
cec0: 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 }..SSL_CTX_set_t
ced0: 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a mp_dh(ctx, dh);.
cee0: 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 .DH_free(dh);.
cef0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 }.#endif..
cf00: 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 /* set our certi
cf10: 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f ficate */. lo
cf20: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d ad_private_key =
cf30: 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 0;. if (cert
cf40: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a file != NULL) {.
cf50: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 .load_private_ke
cf60: 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 y = 1;...Tcl_DSt
cf70: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a ringInit(&ds);..
cf80: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 .if (SSL_CTX_use
cf90: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c _certificate_fil
cfa0: 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 e(ctx, F2N(certf
cfb0: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 ile, &ds), SSL_F
cfc0: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 ILETYPE_PEM) <=
cfd0: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 0) {.. Tcl_DS
cfe0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
cff0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
d000: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
d010: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 nable to set cer
d020: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
d030: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
d040: 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 .... REASON(
d050: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
d060: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f );.. SSL_CTX_
d070: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 free(ctx);..
d080: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a return NULL;..}.
d090: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
d0a0: 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ert != NULL) {..
d0b0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
d0c0: 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 = 1;..if (SSL_C
d0d0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 TX_use_certifica
d0e0: 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72 te_ASN1(ctx, cer
d0f0: 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 t_len, cert) <=
d100: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 0) {.. Tcl_DS
d110: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
d120: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
d130: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 esult(interp, "u
d140: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 nable to set cer
d150: 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 09 tificate: ",....
d160: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 REASON(), (
d170: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
d180: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
d190: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
d1a0: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 rn NULL;..}.
d1b0: 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 } else {..certfi
d1c0: 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 le = (char*)X509
d1d0: 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 _get_default_cer
d1e0: 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 t_file();...if (
d1f0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 SSL_CTX_use_cert
d200: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 ificate_file(ctx
d210: 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f , certfile, SSL_
d220: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d FILETYPE_PEM) <=
d230: 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 0) {.#if 0..
d240: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
d250: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f (&ds);.. Tcl_
d260: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d270: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 erp, "unable to
d280: 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 use default cert
d290: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 ificate file ",
d2a0: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a certfile, ": ",.
d2b0: 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 ... REASON()
d2c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
d2d0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 ;.. SSL_CTX_f
d2e0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 ree(ctx);.. r
d2f0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 eturn NULL;.#end
d300: 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 if..}. }..
d310: 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 /* set our priv
d320: 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 ate key */. i
d330: 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f f (load_private_
d340: 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 key) {..if (keyf
d350: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b ile == NULL && k
d360: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ey == NULL) {..
d370: 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 keyfile = cer
d380: 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 tfile;..}...if (
d390: 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 keyfile != NULL)
d3a0: 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 {.. /* get t
d3b0: 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 he private key a
d3c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
d3d0: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 his certificate
d3e0: 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 */.. if (keyf
d3f0: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ile == NULL) {..
d400: 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 .keyfile = certf
d410: 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 ile;.. }...
d420: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 if (SSL_CTX_us
d430: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c e_PrivateKey_fil
d440: 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 e(ctx, F2N(keyfi
d450: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 le, &ds), SSL_FI
d460: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 LETYPE_PEM) <= 0
d470: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ) {...Tcl_DStrin
d480: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a gFree(&ds);.../*
d490: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 flush the passp
d4a0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 hrase which migh
d4b0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 t be left in the
d4c0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c result */...Tcl
d4d0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
d4e0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 p, NULL, TCL_STA
d4f0: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 TIC);...Tcl_Appe
d500: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
d510: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 "unable to set
d520: 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 public key file
d530: 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c ", keyfile, " ",
d540: 0a 09 09 09 20 20 20 20 20 20 20 20 20 52 45 41 .... REA
d550: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
d560: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 NULL);...SSL_CTX
d570: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 _free(ctx);...re
d580: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
d590: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
d5a0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d ngFree(&ds);...}
d5b0: 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d else if (key !=
d5c0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 NULL) {.. if
d5d0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 (SSL_CTX_use_Pr
d5e0: 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 ivateKey_ASN1(EV
d5f0: 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c P_PKEY_RSA, ctx,
d600: 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d key,key_len) <=
d610: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 0) {...Tcl_DStr
d620: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 ingFree(&ds);...
d630: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 /* flush the pas
d640: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 sphrase which mi
d650: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 ght be left in t
d660: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 he result */...T
d670: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
d680: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 erp, NULL, TCL_S
d690: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 TATIC);...Tcl_Ap
d6a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d6b0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 p, "unable to se
d6c0: 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c t public key: ",
d6d0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 REASON(), (char
d6e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c *) NULL);...SSL
d6f0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a _CTX_free(ctx);.
d700: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
d710: 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 }..}../* Now
d720: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 we know that a
d730: 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 key and cert hav
d740: 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e e been set again
d750: 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 st.. * the SSL c
d760: 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 ontext */..if (!
d770: 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 SSL_CTX_check_pr
d780: 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 ivate_key(ctx))
d790: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
d7a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
d7b0: 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65 "private key doe
d7c0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 s not match the
d7d0: 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62 6c certificate publ
d7e0: 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 20 ic key",....
d7f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d800: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 .. SSL_CTX_fr
d810: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 ee(ctx);.. re
d820: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 turn NULL;..}.
d830: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
d840: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73 verification CAs
d850: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
d860: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 ingInit(&ds);.
d870: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
d880: 74 28 26 64 73 31 29 3b 0a 20 20 20 20 2f 2a 20 t(&ds1);. /*
d890: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 64 65 66 There is one def
d8a0: 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 2c 20 ault directory,
d8b0: 6f 6e 65 20 64 65 66 61 75 6c 74 20 66 69 6c 65 one default file
d8c0: 2c 20 61 6e 64 20 6f 6e 65 20 64 65 66 61 75 6c , and one defaul
d8d0: 74 20 73 74 6f 72 65 2e 0a 09 54 68 65 20 64 65 t store...The de
d8e0: 66 61 75 6c 74 20 43 41 20 63 65 72 74 69 66 69 fault CA certifi
d8f0: 63 61 74 65 73 20 64 69 72 65 63 74 6f 72 79 20 cates directory
d900: 28 61 6e 64 20 64 65 66 61 75 6c 74 20 73 74 6f (and default sto
d910: 72 65 29 20 69 73 20 69 6e 20 74 68 65 20 4f 70 re) is in the Op
d920: 65 6e 53 53 4c 0a 09 63 65 72 74 73 20 64 69 72 enSSL..certs dir
d930: 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 ectory. It can b
d940: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 e overridden by
d950: 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 the SSL_CERT_DIR
d960: 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a 09 64 env var. The..d
d970: 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69 66 efault CA certif
d980: 69 63 61 74 65 73 20 66 69 6c 65 20 69 73 20 63 icates file is c
d990: 61 6c 6c 65 64 20 63 65 72 74 2e 70 65 6d 20 69 alled cert.pem i
d9a0: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 4f 70 n the default Op
d9b0: 65 6e 53 53 4c 0a 09 64 69 72 65 63 74 6f 72 79 enSSL..directory
d9c0: 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76 65 72 . It can be over
d9d0: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 ridden by the SS
d9e0: 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20 L_CERT_FILE env
d9f0: 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 69 6e 74 20 var. */../* int
da00: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 SSL_CTX_set_defa
da10: 75 6c 74 5f 76 65 72 69 66 79 5f 64 69 72 28 53 ult_verify_dir(S
da20: 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 61 6e 64 SL_CTX *ctx) and
da30: 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 int SSL_CTX_set
da40: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f _default_verify_
da50: 66 69 6c 65 28 53 53 4c 5f 43 54 58 20 2a 63 74 file(SSL_CTX *ct
da60: 78 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 x) */. if (!S
da70: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 SL_CTX_load_veri
da80: 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 fy_locations(ctx
da90: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 , F2N(CAfile, &d
daa0: 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20 26 s), F2N(CAdir, &
dab0: 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 ds1)) ||..!SSL_C
dac0: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 TX_set_default_v
dad0: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 erify_paths(ctx)
dae0: 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f 44 ) {.#if 0..Tcl_D
daf0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
db00: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
db10: 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e e(&ds1);../* Don
db20: 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 't currently car
db30: 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73 20 e if this fails
db40: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 */..Tcl_AppendRe
db50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 sult(interp, "SS
db60: 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66 79 L default verify
db70: 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53 4f paths: ", REASO
db80: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
db90: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 LL);..SSL_CTX_fr
dba0: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e ee(ctx);..return
dbb0: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 NULL;.#endif.
dbc0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 }.. /* http
dbd0: 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e s://sourceforge.
dbe0: 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 net/p/tls/bugs/5
dbf0: 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 7/ */. /* XXX
dc00: 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 :TODO: Let the u
dc10: 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 ser supply value
dc20: 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f s here instead o
dc30: 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 f something that
dc40: 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 exists on the f
dc50: 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 ilesystem */.
dc60: 20 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e if (CAfile != N
dc70: 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 ULL) {..STACK_OF
dc80: 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 (X509_NAME) *cer
dc90: 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 tNames = SSL_loa
dca0: 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 d_client_CA_file
dcb0: 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 (F2N(CAfile, &ds
dcc0: 29 29 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d ));..if (certNam
dcd0: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 es != NULL) {..
dce0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 SSL_CTX_set_c
dcf0: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 lient_CA_list(ct
dd00: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 x, certNames);..
dd10: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c }. }.. Tcl
dd20: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
dd30: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 );. Tcl_DStri
dd40: 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 ngFree(&ds1);.
dd50: 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a return ctx;.}.
dd60: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 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 0a 20 2a 0a 20 2a ----------. *. *
ddb0: 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d StatusObjCmd --
ddc0: 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 return certific
ddd0: 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 ate for connecte
dde0: 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 d peer.. *. * Re
ddf0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
de00: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
de10: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
de20: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
de30: 0a 20 2a 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
de80: 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 c int.StatusObjC
de90: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
dea0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
deb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
dec0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
ded0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
dee0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
def0: 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a ePtr;. X509 *
df00: 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 peer;. Tcl_Ob
df10: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 j *objPtr;. T
df20: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
df30: 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e . char *chann
df40: 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 elName, *ciphers
df50: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a ;. int mode;.
df60: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e const unsign
df70: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a ed char *proto;.
df80: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
df90: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 len;. int ni
dfa0: 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 d, res;.. dpr
dfb0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
dfc0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
dfd0: 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 2 || objc > 3 ||
dfe0: 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 (objc == 3 && !
dff0: 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 strcmp(Tcl_GetSt
e000: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 ring(objv[1]), "
e010: 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 -local"))) {..Tc
e020: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
e030: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
e040: 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 "?-local? channe
e050: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
e060: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
e070: 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 /* Get channe
e080: 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e l Id */. chan
e090: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 nelName = Tcl_Ge
e0a0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
e0b0: 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f bjv[(objc == 2 ?
e0c0: 20 31 20 3a 20 32 29 5d 2c 20 4e 55 4c 4c 29 3b 1 : 2)], NULL);
e0d0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
e0e0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
e0f0: 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 p, channelName,
e100: 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 &mode);. if (
e110: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 chan == (Tcl_Cha
e120: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 nnel) NULL) {..r
e130: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
e140: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d . }.. /* M
e150: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 ake sure to oper
e160: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f ate on the topmo
e170: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 st channel */.
e180: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
e190: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 TopChannel(chan)
e1a0: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 ;. if (Tcl_Ge
e1b0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
e1c0: 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 n) != Tls_Channe
e1d0: 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f lType()) {..Tcl_
e1e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
e1f0: 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 erp, "bad channe
e200: 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 l \"", Tcl_GetCh
e210: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
e220: 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c ..."\": not a TL
e230: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c S channel", NULL
e240: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
e250: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c Code(interp, "TL
e260: 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 S", "STATUS", "C
e270: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 HANNEL", "INVALI
e280: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
e290: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
e2a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
e2b0: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
e2c0: 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 te *) Tcl_GetCha
e2d0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
e2e0: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 (chan);.. /*
e2f0: 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 Get certificate
e300: 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 for peer or self
e310: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
e320: 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d == 2) {..peer =
e330: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 SSL_get_peer_ce
e340: 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 rtificate(stateP
e350: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 tr->ssl);. }
e360: 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 else {..peer = S
e370: 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 SL_get_certifica
e380: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c te(statePtr->ssl
e390: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 );. }. /*
e3a0: 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69 Get X509 certifi
e3b0: 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 cate info */.
e3c0: 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 if (peer) {..ob
e3d0: 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 jPtr = Tls_NewX5
e3e0: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 09Obj(interp, pe
e3f0: 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d er);..if (objc =
e400: 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 = 2) {.. X509
e410: 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 _free(peer);..
e420: 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 peer = NULL;..
e430: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
e440: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
e450: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
e460: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
e470: 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 Peer name */.
e480: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
e490: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 erp, objPtr, "pe
e4a0: 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 ername", SSL_get
e4b0: 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 0_peername(state
e4c0: 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a Ptr->ssl), -1);.
e4d0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 LAPPEND_INT(
e4e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
e4f0: 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 "sbits", SSL_get
e500: 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 _cipher_bits(sta
e510: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c tePtr->ssl, NULL
e520: 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 ));.. ciphers
e530: 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 = (char*)SSL_ge
e540: 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 t_cipher(statePt
e550: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 r->ssl);. LAP
e560: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
e570: 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
e580: 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b ", ciphers, -1);
e590: 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
e5a0: 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 the X509 certifi
e5b0: 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 cate presented b
e5c0: 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 y the peer */.
e5d0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
e5e0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
e5f0: 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 erifyResult",..X
e600: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
e610: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c error_string(SSL
e620: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
e630: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
e640: 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a )), -1);.. /*
e650: 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a Verify mode */.
e660: 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 mode = SSL_g
e670: 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 et_verify_mode(s
e680: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
e690: 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 if (mode && S
e6a0: 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 SL_VERIFY_NONE)
e6b0: 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 {..LAPPEND_STR(i
e6c0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
e6d0: 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f verifyMode", "no
e6e0: 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 ne", -1);. }
e6f0: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 else {..Tcl_Obj
e700: 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 *listObjPtr = Tc
e710: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
e720: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 NULL);..if (mode
e730: 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 && SSL_VERIFY_P
e740: 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f EER) {.. Tcl_
e750: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
e760: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
e770: 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
e780: 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 StringObj("peer"
e790: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
e7a0: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
e7b0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
e7c0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
e7d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e7e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e7f0: 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
e800: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 _NewStringObj("f
e810: 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 ail if no peer c
e820: 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ert", -1));..}..
e830: 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
e840: 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e VERIFY_CLIENT_ON
e850: 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c CE) {.. Tcl_L
e860: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
e870: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
e880: 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
e890: 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 tringObj("client
e8a0: 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d once", -1));..}
e8b0: 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
e8c0: 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 L_VERIFY_POST_HA
e8d0: 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 NDSHAKE) {..
e8e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
e8f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
e900: 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
e910: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
e920: 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 ost handshake",
e930: 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e -1));..}..LAPPEN
e940: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 D_OBJ(interp, ob
e950: 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 jPtr, "verifyMod
e960: 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a e", listObjPtr).
e970: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 }.. /* Ve
e980: 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 rify mode depth
e990: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 */. LAPPEND_I
e9a0: 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
e9b0: 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 22 r, "verifyDepth"
e9c0: 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 , SSL_get_verify
e9d0: 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72 2d _depth(statePtr-
e9e0: 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 >ssl));.. /*
e9f0: 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
ea00: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
ea10: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
ea20: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 negotiation */.
ea30: 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e SSL_get0_alpn
ea40: 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
ea50: 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
ea60: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 &len);. LAPP
ea70: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
ea80: 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
ea90: 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 (char *)proto, (
eaa0: 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c int) len);. L
eab0: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
eac0: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 p, objPtr, "prot
ead0: 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 ocol", SSL_get_v
eae0: 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d ersion(statePtr-
eaf0: 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 >ssl), -1);..
eb00: 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f /* Valid for no
eb10: 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 n-RSA signature
eb20: 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 and TLS 1.3 */.
eb30: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 if (objc == 2
eb40: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 ) {..res = SSL_g
eb50: 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 et_peer_signatur
eb60: 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
eb70: 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
eb80: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 } else {..res =
eb90: 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 SSL_get_signatur
eba0: 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e e_nid(statePtr->
ebb0: 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 ssl, &nid);.
ebc0: 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 }. if (!res)
ebd0: 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c {nid = 0;}. L
ebe0: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
ebf0: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e p, objPtr, "sign
ec00: 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 atureHashAlgorit
ec10: 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 hm", OBJ_nid2ln(
ec20: 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 nid), -1);..
ec30: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
ec40: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f ..res = SSL_get_
ec50: 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 peer_signature_t
ec60: 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 ype_nid(statePtr
ec70: 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 ->ssl, &nid);.
ec80: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 } else {..res
ec90: 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 = SSL_get_signat
eca0: 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 ure_type_nid(sta
ecb0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
ecc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
ecd0: 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b (!res) {nid = 0;
ece0: 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 }. LAPPEND_ST
ecf0: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
ed00: 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 , "signatureType
ed10: 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 ", OBJ_nid2ln(ni
ed20: 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 d), -1);.. Tc
ed30: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
ed40: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a nterp, objPtr);.
ed50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
ed60: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d K;..clientData =
ed70: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c clientData;.}..
ed80: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 ---------. *. *
edd0: 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 ConnectionInfoOb
ede0: 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 jCmd -- return c
edf0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 onnection info f
ee00: 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a rom OpenSSL.. *.
ee10: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
ee20: 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 list of connect
ee30: 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d ion info. *. *-
ee40: 2d 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
ee90: 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 nt ConnectionInf
eea0: 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 oObjCmd(ClientDa
eeb0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
eec0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
eed0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
eee0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
eef0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
ef00: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
ef10: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
ef20: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a et a mode on */.
ef30: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
ef40: 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 Ptr;../* client
ef50: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f state for ssl so
ef60: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f cket */. Tcl_
ef70: 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 Obj *objPtr, *li
ef80: 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 stPtr;. const
ef90: 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 SSL *ssl;. c
efa0: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 onst SSL_CIPHER
efb0: 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e *cipher;. con
efc0: 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a st SSL_SESSION *
efd0: 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e session;. con
efe0: 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 0a st EVP_MD *md;..
eff0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
f000: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
f010: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
f020: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
f030: 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f ");..return(TCL_
f040: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 ERROR);. }..
f050: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
f060: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
f070: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
f080: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e omObj(objv[1], N
f090: 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 ULL), NULL);.
f0a0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
f0b0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
f0c0: 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 {..return(TCL_E
f0d0: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 RROR);. }..
f0e0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
f0f0: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
f100: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
f110: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
f120: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
f130: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 (chan);. if (
f140: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
f150: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
f160: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
f170: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
f180: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
f190: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
f1a0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
f1b0: 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a chan),.. "\":
f1c0: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
f1d0: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c el", NULL);..Tcl
f1e0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
f1f0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f terp, "TLS", "CO
f200: 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e NNECTION", "CHAN
f210: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c NEL", "INVALID",
f220: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
f230: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 ..return(TCL_ERR
f240: 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 OR);. }..
f250: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
f260: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
f270: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 ;.. /* Connec
f280: 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 tion info */.
f290: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 statePtr = (Sta
f2a0: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e te *)Tcl_GetChan
f2b0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
f2c0: 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d chan);. ssl =
f2d0: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a statePtr->ssl;.
f2e0: 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e if (ssl != N
f2f0: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 ULL) {../* conne
f300: 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 ction state */..
f310: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
f320: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 rp, objPtr, "sta
f330: 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 te", SSL_state_s
f340: 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c tring_long(ssl),
f350: 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 -1);.../* Get S
f360: 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 NI requested ser
f370: 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 ver name */..LAP
f380: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
f390: 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 objPtr, "server
f3a0: 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 name", SSL_get_s
f3b0: 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 ervername(ssl, T
f3c0: 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 LSEXT_NAMETYPE_h
f3d0: 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a ost_name), -1);.
f3e0: 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f ../* Get protoco
f3f0: 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 l */..LAPPEND_ST
f400: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 R(interp, objPtr
f410: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 , "protocol", SS
f420: 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 L_get_version(ss
f430: 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 l), -1);.../* Re
f440: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f negotiation allo
f450: 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f wed */..LAPPEND_
f460: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
f470: 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 Ptr, "renegotiat
f480: 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 ion_allowed", SS
f490: 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e L_get_secure_ren
f4a0: 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f egotiation_suppo
f4b0: 72 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 rt(ssl));.../* G
f4c0: 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 et security leve
f4d0: 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e l */..LAPPEND_IN
f4e0: 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
f4f0: 2c 20 22 73 65 63 75 72 69 74 79 6c 65 76 65 6c , "securitylevel
f500: 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 ", SSL_get_secur
f510: 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b ity_level(ssl));
f520: 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e .../* Session in
f530: 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 fo */..LAPPEND_B
f540: 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
f550: 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 tr, "session_reu
f560: 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f sed", SSL_sessio
f570: 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a n_reused(ssl));.
f580: 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 ../* Is server i
f590: 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f nfo */..LAPPEND_
f5a0: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
f5b0: 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 Ptr, "is_server"
f5c0: 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 , SSL_is_server(
f5d0: 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 ssl));.../* Is D
f5e0: 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f TLS */..LAPPEND_
f5f0: 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a BOOL(interp, obj
f600: 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 Ptr, "is_dtls",
f610: 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 SSL_is_dtls(ssl)
f620: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
f630: 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a Cipher info */.
f640: 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c cipher = SSL
f650: 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 _get_current_cip
f660: 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 her(ssl);. if
f670: 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c (cipher != NULL
f680: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 ) {..char buf[BU
f690: 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e FSIZ] = {0};..in
f6a0: 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 t bits, alg_bits
f6b0: 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 ;.../* Cipher na
f6c0: 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 me */..LAPPEND_S
f6d0: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
f6e0: 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c r, "cipher", SSL
f6f0: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 _CIPHER_get_name
f700: 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
f710: 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 ./* RFC name of
f720: 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 cipher */..LAPPE
f730: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
f740: 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 bjPtr, "standard
f750: 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 _name", SSL_CIPH
f760: 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
f770: 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a (cipher), -1);..
f780: 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 ./* OpenSSL name
f790: 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c of cipher */..L
f7a0: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
f7b0: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e p, objPtr, "open
f7c0: 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 ssl_name", OPENS
f7d0: 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 SL_cipher_name(S
f7e0: 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 SL_CIPHER_standa
f7f0: 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 rd_name(cipher))
f800: 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 , -1);.../* numb
f810: 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 er of secret bit
f820: 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 s used for ciphe
f830: 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c r */..bits = SSL
f840: 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 _CIPHER_get_bits
f850: 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 (cipher, &alg_bi
f860: 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e ts);..LAPPEND_IN
f870: 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
f880: 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c , "secret_bits",
f890: 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 bits);..LAPPEND
f8a0: 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
f8b0: 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f Ptr, "algorithm_
f8c0: 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 bits", alg_bits)
f8d0: 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 ;../* alg_bits i
f8e0: 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 s actual key sec
f8f0: 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 ret bits. If use
f900: 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 bits and secret
f910: 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 (algorithm) bit
f920: 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 s differ,.. th
f930: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 e rest of the bi
f940: 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e ts are fixed, i.
f950: 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 e. for limited e
f960: 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 xport ciphers (b
f970: 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f its < 56) */.../
f980: 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 * Indicates whic
f990: 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 h SSL/TLS protoc
f9a0: 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 ol version first
f9b0: 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 defined the cip
f9c0: 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
f9d0: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
f9e0: 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e tr, "min_version
f9f0: 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ", SSL_CIPHER_ge
fa00: 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 t_version(cipher
fa10: 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 ), -1);.../* Cip
fa20: 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 her NID */..LAPP
fa30: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
fa40: 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e objPtr, "cipherN
fa50: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a ID", (char *)OBJ
fa60: 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 _nid2ln(SSL_CIPH
fa70: 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 ER_get_cipher_ni
fa80: 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b d(cipher)), -1);
fa90: 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e ..LAPPEND_STR(in
faa0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 terp, objPtr, "d
fab0: 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 igestNID", (char
fac0: 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 *)OBJ_nid2ln(SS
fad0: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 L_CIPHER_get_dig
fae0: 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 est_nid(cipher))
faf0: 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f , -1);..LAPPEND_
fb00: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
fb10: 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 tr, "keyExchange
fb20: 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 NID", (char *)OB
fb30: 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 J_nid2ln(SSL_CIP
fb40: 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 HER_get_kx_nid(c
fb50: 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c ipher)), -1);..L
fb60: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
fb70: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 p, objPtr, "auth
fb80: 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 enticationNID",
fb90: 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 (char *)OBJ_nid2
fba0: 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 ln(SSL_CIPHER_ge
fbb0: 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 t_auth_nid(ciphe
fbc0: 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d r)), -1);.../* m
fbd0: 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 essage authentic
fbe0: 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 ation code - Cip
fbf0: 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 her is AEAD (e.g
fc00: 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 . GCM or ChaCha2
fc10: 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 0/Poly1305) or n
fc20: 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e ot */../* Authen
fc30: 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 ticated Encrypti
fc40: 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 on with associat
fc50: 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63 ed data (AEAD) c
fc60: 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 heck */..LAPPEND
fc70: 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 _BOOL(interp, ob
fc80: 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 jPtr, "cipher_is
fc90: 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 _aead", SSL_CIPH
fca0: 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 ER_is_aead(ciphe
fcb0: 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 r));.../* Digest
fcc0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 used during the
fcd0: 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 SSL/TLS handsha
fce0: 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 ke when using th
fcf0: 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 e cipher. */..md
fd00: 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 = SSL_CIPHER_ge
fd10: 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 t_handshake_dige
fd20: 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 st(cipher);..LAP
fd30: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
fd40: 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 objPtr, "handsh
fd50: 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68 ake_digest", (ch
fd60: 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 ar *)EVP_MD_name
fd70: 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 (md), -1);.../*
fd80: 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 Get OpenSSL-spec
fd90: 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e ific ID, not IAN
fda0: 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 A ID */..LAPPEND
fdb0: 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
fdc0: 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 Ptr, "cipher_id"
fdd0: 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 , (int) SSL_CIPH
fde0: 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 ER_get_id(cipher
fdf0: 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 ));.../* Two-byt
fe00: 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 e ID used in the
fe10: 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 TLS protocol of
fe20: 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 the given ciphe
fe30: 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e r */..LAPPEND_IN
fe40: 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 T(interp, objPtr
fe50: 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c , "protocol_id",
fe60: 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 (int) SSL_CIPHE
fe70: 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 R_get_protocol_i
fe80: 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a d(cipher));.../*
fe90: 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 Textual descrip
fea0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 tion of the ciph
feb0: 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 er */..if (SSL_C
fec0: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f IPHER_descriptio
fed0: 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 n(cipher, buf, s
fee0: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e izeof(buf)) != N
fef0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 ULL) {.. LAPP
ff00: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
ff10: 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 objPtr, "descrip
ff20: 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b tion", buf, -1);
ff30: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
ff40: 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a * Session info *
ff50: 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 /. session =
ff60: 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 SSL_get_session(
ff70: 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65 ssl);. if (se
ff80: 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b ssion != NULL) {
ff90: 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
ffa0: 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 char *ticket;..
ffb0: 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e size_t len2;..un
ffc0: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b signed int ulen;
ffd0: 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 ..const unsigned
ffe0: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 char *session_i
fff0: 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 61 72 d, *proto;..char
10000 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f buffer[SSL_MAX_
10010 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 MASTER_KEY_LENGT
10020 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 H];.../* Report
10030 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f the selected pro
10040 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c tocol as a resul
10050 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 t of the ALPN ne
10060 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 gotiation */..SS
10070 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 L_SESSION_get0_a
10080 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 lpn_selected(ses
10090 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c sion, &proto, &l
100a0 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 en2);..LAPPEND_S
100b0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
100c0 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 r, "alpn", (char
100d0 20 2a 29 20 70 72 6f 74 6f 2c 20 28 69 6e 74 29 *) proto, (int)
100e0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 len2);.../* Rep
100f0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 ort the selected
10100 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 protocol as a r
10110 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e esult of the NPN
10120 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a negotiation */.
10130 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 #ifdef USE_NPN..
10140 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 SSL_get0_next_pr
10150 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 oto_negotiated(s
10160 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 sl, &proto, &ule
10170 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 n);..LAPPEND_STR
10180 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10190 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 "npn", (char *)
101a0 20 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 75 6c proto, (int) ul
101b0 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a en);.#endif.../*
101c0 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 Resumable sessi
101d0 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 on */..LAPPEND_B
101e0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
101f0 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c tr, "resumable",
10200 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f SSL_SESSION_is_
10210 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f resumable(sessio
10220 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f n));.../* Sessio
10230 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 n start time (se
10240 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 conds since epoc
10250 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c h) */..LAPPEND_L
10260 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ONG(interp, objP
10270 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 tr, "start_time"
10280 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 , SSL_SESSION_ge
10290 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 t_time(session))
102a0 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 ;.../* Timeout v
102b0 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 alue - SSL_CTX_g
102c0 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 et_timeout (in s
102d0 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 econds) */..LAPP
102e0 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
102f0 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 objPtr, "timeou
10300 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f t", SSL_SESSION_
10310 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 get_timeout(sess
10320 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ion));.../* Sess
10330 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 ion id - TLSv1.2
10340 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 and below only
10350 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d */..session_id =
10360 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
10370 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c _id(session, &ul
10380 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 en);..LAPPEND_BA
10390 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
103a0 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 Ptr, "session_id
103b0 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 ", session_id, (
103c0 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a int) ulen);.../*
103d0 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 Session context
103e0 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 */..session_id
103f0 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
10400 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 t0_id_context(se
10410 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 ssion, &ulen);..
10420 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
10430 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10440 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 session_context"
10450 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 , session_id, (i
10460 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 nt) ulen);.../*
10470 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d Session ticket -
10480 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a client only */.
10490 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 .SSL_SESSION_get
104a0 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 0_ticket(session
104b0 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 , &ticket, &len2
104c0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 );..LAPPEND_BARR
104d0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 AY(interp, objPt
104e0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b r, "session_tick
104f0 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 69 6e et", ticket, (in
10500 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 t) len2);.../* S
10510 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 ession ticket li
10520 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 fetime hint (in
10530 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 seconds) */..LAP
10540 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 PEND_LONG(interp
10550 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 , objPtr, "lifet
10560 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f ime", SSL_SESSIO
10570 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 N_get_ticket_lif
10580 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 etime_hint(sessi
10590 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 on));.../* Ticke
105a0 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 09 53 t app data */..S
105b0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f SL_SESSION_get0_
105c0 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 73 ticket_appdata(s
105d0 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c ession, &ticket,
105e0 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e &len2);..LAPPEN
105f0 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c D_BARRAY(interp,
10600 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 objPtr, "ticket
10610 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b _app_data", tick
10620 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b et, (int) len2);
10630 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 .../* Get master
10640 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 key */..len2 =
10650 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f SSL_SESSION_get_
10660 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 master_key(sessi
10670 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f on, buffer, SSL_
10680 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c MAX_MASTER_KEY_L
10690 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 ENGTH);..LAPPEND
106a0 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
106b0 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f objPtr, "master_
106c0 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 69 key", buffer, (i
106d0 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 nt) len2);.../*
106e0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a Compression id *
106f0 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 /..unsigned int
10700 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e id = SSL_SESSION
10710 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 _get_compress_id
10720 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 (session);..LAPP
10730 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10740 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
10750 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 sion_id", id ==
10760 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 1 ? "zlib" : "no
10770 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a ne", -1);. }.
10780 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 . /* Compress
10790 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 ion info */.
107a0 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 if (ssl != NULL)
107b0 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 {.#ifdef HAVE_S
107c0 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 SL_COMPRESSION..
107d0 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f const COMP_METHO
107e0 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a D *comp, *expn;.
107f0 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f .comp = SSL_get_
10800 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 current_compress
10810 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 ion(ssl);..expn
10820 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e = SSL_get_curren
10830 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 t_expansion(ssl)
10840 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 ;...LAPPEND_STR(
10850 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10860 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 "compression", c
10870 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 omp ? SSL_COMP_g
10880 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 et_name(comp) :
10890 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 "none", -1);..LA
108a0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
108b0 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e , objPtr, "expan
108c0 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 sion", expn ? SS
108d0 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 L_COMP_get_name(
108e0 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 expn) : "none",
108f0 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 -1);.#else..LAPP
10900 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10910 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 objPtr, "compres
10920 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d sion", "none", -
10930 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 1);..LAPPEND_STR
10940 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10950 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e "expansion", "n
10960 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 one", -1);.#endi
10970 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 f. }.. /*
10980 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 Server info */.
10990 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 {..long mode
109a0 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 = SSL_CTX_get_se
109b0 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 ssion_cache_mode
109c0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b (statePtr->ctx);
109d0 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 ..char *msg;...i
109e0 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 f (mode & SSL_SE
109f0 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a SS_CACHE_OFF) {.
10a00 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 . msg = "off"
10a10 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f ;..} else if (mo
10a20 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 de & SSL_SESS_CA
10a30 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 CHE_CLIENT) {..
10a40 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 msg = "client
10a50 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d ";..} else if (m
10a60 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 ode & SSL_SESS_C
10a70 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 ACHE_SERVER) {..
10a80 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 msg = "serve
10a90 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 r";..} else if (
10aa0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f mode & SSL_SESS_
10ab0 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 CACHE_BOTH) {..
10ac0 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b msg = "both";
10ad0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
10ae0 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b msg = "unknown";
10af0 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 ..}..LAPPEND_STR
10b00 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
10b10 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f "session_cache_
10b20 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b mode", msg, -1);
10b30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
10b40 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a A List */. /*
10b50 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 IF not a server
10b60 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 , same as SSL_ge
10b70 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e t0_peer_CA_list.
10b80 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 If server same
10b90 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 as SSL_CTX_get_c
10ba0 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f lient_CA_list */
10bb0 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 . listPtr = T
10bc0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
10bd0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 NULL);. STAC
10be0 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 K_OF(X509_NAME)
10bf0 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 *ca_list;. if
10c00 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c ((ca_list = SSL
10c10 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c _get_client_CA_l
10c20 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c ist(ssl)) != NUL
10c30 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 L) {..char buffe
10c40 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 r[BUFSIZ];..for
10c50 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 (int i = 0; i <
10c60 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d sk_X509_NAME_num
10c70 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 (ca_list); i++)
10c80 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 {.. X509_NAME
10c90 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 *name = sk_X509
10ca0 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c _NAME_value(ca_l
10cb0 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 ist, i);.. if
10cc0 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 (name) {...X509
10cd0 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 _NAME_oneline(na
10ce0 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 me, buffer, BUFS
10cf0 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f IZ);...Tcl_ListO
10d00 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
10d10 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c interp, listPtr,
10d20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
10d30 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a j(buffer, -1));.
10d40 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a . }..}. }.
10d50 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 LAPPEND_OBJ(
10d60 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
10d70 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 "caList", listPt
10d80 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f r);. LAPPEND_
10d90 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
10da0 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 tr, "caListCount
10db0 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f ", sk_X509_NAME_
10dc0 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a num(ca_list));..
10dd0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
10de0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
10df0 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
10e00 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
10e10 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
10e20 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
10e30 2d 2d 2d 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 0a ---------------.
10e70 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 *. * MiscObjCmd
10e80 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 -- misc command
10e90 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a s. *. * Results:
10ea0 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
10eb0 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
10ec0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
10ed0 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
10ee0 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
10f30 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e MiscObjCmd(Clien
10f40 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
10f50 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
10f60 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
10f70 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
10f80 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 bjv[]) {. sta
10f90 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
10fa0 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 commands [] = {
10fb0 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c "req", "strreq",
10fc0 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 NULL };. enu
10fd0 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 m command { C_RE
10fe0 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 Q, C_STRREQ, C_D
10ff0 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 UMMY };. int
11000 63 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 cmd, isStr;.
11010 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 char buffer[1638
11020 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 4];.. dprintf
11030 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
11040 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b if (objc < 2) {
11050 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
11060 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
11070 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 jv, "subcommand
11080 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 ?args?");..retur
11090 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
110a0 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 }. if (Tcl_G
110b0 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 etIndexFromObj(i
110c0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 nterp, objv[1],
110d0 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 commands, "comma
110e0 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d nd", 0, &cmd) !=
110f0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
11100 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
11110 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 }.. ERR_cle
11120 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 ar_error();..
11130 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d isStr = (cmd ==
11140 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 C_STRREQ);.
11150 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f switch ((enum co
11160 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 mmand) cmd) {..c
11170 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 ase C_REQ:..case
11180 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 C_STRREQ: {..
11190 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 EVP_PKEY *pkey
111a0 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 =NULL;.. X509
111b0 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 *cert=NULL;..
111c0 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d X509_NAME *nam
111d0 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c e=NULL;.. Tcl
111e0 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 _Obj **listv;..
111f0 20 20 20 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a int listc,i;.
11200 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e .. BIO *out=N
11210 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 ULL;... char
11220 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 *k_C="",*k_ST=""
11230 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 ,*k_L="",*k_O=""
11240 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d ,*k_OU="",*k_CN=
11250 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a "",*k_Email="";.
11260 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 . char *keyou
11270 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a t,*pemout,*str;.
11280 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 . int keysize
11290 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 ,serial=0,days=3
112a0 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 65;..#if OPENSSL
112b0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
112c0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 < 0x30000000L..
112d0 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d BIGNUM *bne =
112e0 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 NULL;.. RSA
112f0 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c *rsa = NULL;.#el
11300 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 se.. EVP_PKEY
11310 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c _CTX *ctx = NULL
11320 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 ;.#endif... i
11330 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 f ((objc<5) || (
11340 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c objc>6)) {...Tcl
11350 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
11360 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 terp, 2, objv, "
11370 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 keysize keyfile
11380 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 certfile ?info?"
11390 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
113a0 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 ERROR;.. }...
113b0 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
113c0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
113d0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 , objv[2], &keys
113e0 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ize) != TCL_OK)
113f0 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {...return TCL_E
11400 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
11410 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 keyout=Tcl_Get
11420 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b String(objv[3]);
11430 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c .. pemout=Tcl
11440 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
11450 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 4]);.. if (is
11460 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 Str) {...Tcl_Set
11470 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 Var(interp,keyou
11480 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 t,"",0);...Tcl_S
11490 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d etVar(interp,pem
114a0 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 out,"",0);..
114b0 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 }... if (objc
114c0 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c >=6) {...if (Tcl
114d0 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
114e0 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 nts(interp, objv
114f0 5b 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 [5],....&listc,
11500 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f &listv) != TCL_O
11510 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 K) {... retur
11520 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d n TCL_ERROR;...}
11530 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 ....if ((listc%2
11540 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 ) != 0) {...
11550 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
11560 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f terp,"Informatio
11570 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 n list must have
11580 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 even number of
11590 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 arguments",NULL)
115a0 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 ;... return T
115b0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 CL_ERROR;...}...
115c0 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 for (i=0; i<list
115d0 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 c; i+=2) {...
115e0 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 str=Tcl_GetStri
115f0 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 ng(listv[i]);...
11600 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 if (strcmp(s
11610 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b tr,"days")==0) {
11620 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
11630 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
11640 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 ,listv[i+1],&day
11650 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 s)!=TCL_OK)....
11660 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
11670 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 ROR;... } els
11680 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
11690 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b ,"serial")==0) {
116a0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 ....if (Tcl_GetI
116b0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 ntFromObj(interp
116c0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 ,listv[i+1],&ser
116d0 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 ial)!=TCL_OK)...
116e0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
116f0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 ERROR;... } e
11700 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 lse if (strcmp(s
11710 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 tr,"C")==0) {...
11720 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 .k_C=Tcl_GetStri
11730 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a ng(listv[i+1]);.
11740 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
11750 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 (strcmp(str,"ST"
11760 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d )==0) {....k_ST=
11770 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 Tcl_GetString(li
11780 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 stv[i+1]);...
11790 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 } else if (strc
117a0 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 mp(str,"L")==0)
117b0 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 {....k_L=Tcl_Get
117c0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
117d0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
117e0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
117f0 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f "O")==0) {....k_
11800 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 O=Tcl_GetString(
11810 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 listv[i+1]);...
11820 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
11830 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d rcmp(str,"OU")==
11840 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 0) {....k_OU=Tcl
11850 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 _GetString(listv
11860 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 [i+1]);... }
11870 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
11880 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a str,"CN")==0) {.
11890 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 ...k_CN=Tcl_GetS
118a0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d tring(listv[i+1]
118b0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
118c0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 if (strcmp(str,"
118d0 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 Email")==0) {...
118e0 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 .k_Email=Tcl_Get
118f0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
11900 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
11910 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 {....Tcl_SetRes
11920 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e ult(interp,"Unkn
11930 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e own parameter",N
11940 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 ULL);....return
11950 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 TCL_ERROR;...
11960 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 }...}.. }..#
11970 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
11980 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 ON_NUMBER < 0x30
11990 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 000000L.. bne
119a0 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 = BN_new();..
119b0 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 rsa = RSA_new(
119c0 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 );.. pkey = E
119d0 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 VP_PKEY_new();..
119e0 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e if (bne == N
119f0 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 ULL || rsa == NU
11a00 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 LL || pkey == NU
11a10 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f LL || !BN_set_wo
11a20 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c rd(bne,RSA_F4) |
11a30 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 |...!RSA_generat
11a40 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 e_key_ex(rsa, ke
11a50 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c ysize, bne, NULL
11a60 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 ) || !EVP_PKEY_a
11a70 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 ssign_RSA(pkey,
11a80 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b rsa)) {...EVP_PK
11a90 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
11aa0 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 ./* RSA_free(rsa
11ab0 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f ); freed by EVP_
11ac0 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 PKEY_free */...B
11ad0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c N_free(bne);.#el
11ae0 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 se.. pkey = E
11af0 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 VP_RSA_gen((unsi
11b00 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a gned int) keysiz
11b10 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 e);.. ctx = E
11b20 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 VP_PKEY_CTX_new(
11b30 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 pkey,NULL);..
11b40 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c if (pkey == NUL
11b50 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c L || ctx == NULL
11b60 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 || !EVP_PKEY_ke
11b70 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c ygen_init(ctx) |
11b80 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 |...!EVP_PKEY_CT
11b90 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e X_set_rsa_keygen
11ba0 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 _bits(ctx, keysi
11bb0 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 ze) || !EVP_PKEY
11bc0 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b _keygen(ctx, &pk
11bd0 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 ey)) {...EVP_PKE
11be0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 Y_free(pkey);...
11bf0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 EVP_PKEY_CTX_fre
11c00 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 e(ctx);.#endif..
11c10 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 .Tcl_SetResult(i
11c20 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e nterp,"Error gen
11c30 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 erating private
11c40 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 key",NULL);...re
11c50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
11c60 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
11c70 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 if (isStr) {...
11c80 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 out=BIO_new(B
11c90 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 IO_s_mem());...
11ca0 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f PEM_write_bio
11cb0 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c _PrivateKey(out,
11cc0 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 pkey,NULL,NULL,0
11cd0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 ,NULL,NULL);...
11ce0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 i=BIO_read(ou
11cf0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 t,buffer,sizeof(
11d00 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 buffer)-1);...
11d10 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 i=(i<0) ? 0 :
11d20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b i;... buffer[
11d30 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 i]='\0';... T
11d40 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
11d50 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 ,keyout,buffer,0
11d60 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 );... BIO_flu
11d70 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 sh(out);... B
11d80 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 IO_free(out);...
11d90 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f } else {... o
11da0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 ut=BIO_new(BIO_s
11db0 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 _file());...
11dc0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 BIO_write_filena
11dd0 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a me(out,keyout);.
11de0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f .. PEM_write_
11df0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f bio_PrivateKey(o
11e00 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c ut,pkey,NULL,NUL
11e10 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a L,0,NULL,NULL);.
11e20 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 .. /* PEM_wri
11e30 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 te_bio_RSAPrivat
11e40 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e eKey(out, rsa, N
11e50 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 ULL, NULL, 0, NU
11e60 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 LL, NULL); */...
11e70 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c BIO_free_all
11e80 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 (out);.. .}....i
11e90 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 f ((cert=X509_ne
11ea0 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 w())==NULL) {...
11eb0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c Tcl_SetResul
11ec0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 t(interp,"Error
11ed0 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 generating certi
11ee0 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c ficate request",
11ef0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 NULL);... EVP
11f00 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
11f10 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
11f20 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
11f30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 x30000000L...
11f40 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 BN_free(bne);.#
11f50 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 endif... retu
11f60 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 rn(TCL_ERROR);..
11f70 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 .}....X509_set_v
11f80 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a ersion(cert,2);.
11f90 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 ..ASN1_INTEGER_s
11fa0 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 et(X509_get_seri
11fb0 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 alNumber(cert),s
11fc0 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 erial);...X509_g
11fd0 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
11fe0 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 etm_notBefore(ce
11ff0 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 rt),0);...X509_g
12000 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
12010 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 etm_notAfter(cer
12020 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 t),(long)60*60*2
12030 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 4*days);...X509_
12040 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c set_pubkey(cert,
12050 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 pkey);....name=X
12060 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 509_get_subject_
12070 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 name(cert);....X
12080 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
12090 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
120a0 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 C", MBSTRING_ASC
120b0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
120c0 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d d char *) k_C, -
120d0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
120e0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
120f0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 _by_txt(name,"ST
12100 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
12110 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
12120 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d char *) k_ST, -
12130 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
12140 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
12150 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 _by_txt(name,"L"
12160 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
12170 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
12180 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c char *) k_L, -1,
12190 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
121a0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
121b0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 y_txt(name,"O",
121c0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
121d0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
121e0 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d ar *) k_O, -1, -
121f0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
12200 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
12210 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d txt(name,"OU", M
12220 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
12230 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
12240 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d r *) k_OU, -1, -
12250 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
12260 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
12270 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d txt(name,"CN", M
12280 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
12290 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
122a0 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d r *) k_CN, -1, -
122b0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
122c0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
122d0 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 txt(name,"Email"
122e0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
122f0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
12300 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c char *) k_Email,
12310 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 -1, -1, 0);....
12320 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 X509_set_subject
12330 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 _name(cert,name)
12340 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 ;....if (!X509_s
12350 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 ign(cert,pkey,EV
12360 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 P_sha256())) {..
12370 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 . X509_free(c
12380 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ert);... EVP_
12390 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
123a0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
123b0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
123c0 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
123d0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
123e0 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 ndif... Tcl_S
123f0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
12400 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 "Error signing c
12410 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c ertificate",NULL
12420 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 );... return
12430 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
12440 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 ..if (isStr) {..
12450 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
12460 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 (BIO_s_mem());..
12470 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
12480 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
12490 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
124a0 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
124b0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
124c0 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
124d0 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
124e0 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
124f0 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
12500 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 interp,pemout,bu
12510 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
12520 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
12530 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
12540 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
12550 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
12560 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
12570 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
12580 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d filename(out,pem
12590 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
125a0 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
125b0 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
125c0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 BIO_free_all(out
125d0 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 );...}....X509_f
125e0 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 ree(cert);...EVP
125f0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
12600 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
12610 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
12620 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f x30000000L...BN_
12630 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
12640 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 f.. }..}..bre
12650 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
12660 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 ..break;. }.
12670 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
12680 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
12690 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
126a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
126b0 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 *****/./* Init
126c0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a */./*
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
126e0 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
126f0 2d 2d 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 0a 20 --------------.
12730 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d *. * Tls_Free --
12740 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
12750 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 edure cleans up
12760 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 when a SSL socke
12770 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a t based channel.
12780 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 *.is closed and
12790 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 its reference c
127a0 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 ount falls below
127b0 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 1. *. * Results
127c0 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.none. *. *
127d0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
127e0 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 .Frees all the s
127f0 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d tate. *. *------
12800 2d 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 0a 20 2a -------------. *
12840 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28 /.void.Tls_Free(
12850 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20 char *blockPtr)
12860 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
12870 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
12880 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 )blockPtr;..
12890 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
128a0 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 );.. Tls_Clea
128b0 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 n(statePtr);.
128c0 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 ckfree(blockPtr
128d0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
128e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
128f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
12920 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 *. * Tls_Clean
12930 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
12940 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 ocedure cleans u
12950 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 p when a SSL soc
12960 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
12970 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 l. *.is closed a
12980 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 nd its reference
12990 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c count falls bel
129a0 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 ow 1. This shou
129b0 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 ld. *.be called
129c0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 synchronously by
129d0 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 the CloseProc,
129e0 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 not in the. *.Ev
129f0 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c entuallyFree cal
12a00 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 lback.. *. * Res
12a10 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a ults:. *.none. *
12a20 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
12a30 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 :. *.Frees all t
12a40 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d he state. *. *--
12a50 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 -. */.void Tls_C
12aa0 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 lean(State *stat
12ab0 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 ePtr) {. dpri
12ac0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
12ad0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 /*. * we
12ae0 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 're assuming her
12af0 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e e that we're sin
12b00 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 gle-threaded.
12b10 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 */. if (sta
12b20 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
12b30 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
12b40 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
12b50 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 leteTimerHandler
12b60 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
12b70 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
12b80 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 mer = NULL;.
12b90 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
12ba0 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 Ptr->protos) {..
12bb0 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d ckfree(statePtr-
12bc0 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 >protos);..state
12bd0 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 Ptr->protos = NU
12be0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
12bf0 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 (statePtr->bio)
12c00 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c {../* This will
12c10 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f call SSL_shutdo
12c20 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20 wn. Bug 1414045
12c30 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f */..dprintf("BIO
12c40 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 _free_all(%p)",
12c50 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
12c60 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 .BIO_free_all(st
12c70 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 atePtr->bio);..s
12c80 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e tatePtr->bio = N
12c90 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ULL;. }. i
12ca0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c f (statePtr->ssl
12cb0 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 ) {..dprintf("SS
12cc0 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 L_free(%p)", sta
12cd0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 tePtr->ssl);..SS
12ce0 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d L_free(statePtr-
12cf0 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 >ssl);..statePtr
12d00 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 ->ssl = NULL;.
12d10 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 }. if (stat
12d20 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 ePtr->ctx) {..SS
12d30 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 L_CTX_free(state
12d40 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 Ptr->ctx);..stat
12d50 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c ePtr->ctx = NULL
12d60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
12d70 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 statePtr->callba
12d80 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 ck) {..Tcl_DecrR
12d90 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
12da0 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 ->callback);..st
12db0 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
12dc0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
12dd0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
12de0 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 >password) {..Tc
12df0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 l_DecrRefCount(s
12e00 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 tatePtr->passwor
12e10 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 d);..statePtr->p
12e20 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a assword = NULL;.
12e30 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
12e40 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a atePtr->vcmd) {.
12e50 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
12e60 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 t(statePtr->vcmd
12e70 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63 );..statePtr->vc
12e80 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d md = NULL;. }
12e90 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
12ea0 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a eturning");.}...
12eb0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 --------. *. * T
12f00 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a ls_Init --. *. *
12f10 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 .This is a packa
12f20 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f ge initializatio
12f30 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 n procedure, whi
12f40 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 ch is called. *.
12f50 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 by Tcl when this
12f60 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 package is to b
12f70 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e e added to an in
12f80 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a terpreter.. *. *
12f90 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 Results: Ssl c
12fa0 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f onfigured and lo
12fb0 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 aded. *. * Side
12fc0 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 effects:. *. cre
12fd0 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d ate the ssl comm
12fe0 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 and, initialize
12ff0 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 ssl context. *.
13000 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
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 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f ----. */.DLLEXPO
13050 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 RT int Tls_Init(
13060 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
13070 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 rp) {. const
13080 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 char tlsTclInitS
13090 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 cript[] = {.#inc
130a0 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 lude "tls.tcl.h"
130b0 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 ..0x00. };..
130c0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
130d0 65 64 22 29 3b 0a 0a 23 69 66 20 54 43 4c 5f 4d ed");..#if TCL_M
130e0 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 AJOR_VERSION > 8
130f0 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f .#ifdef USE_TCL_
13100 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 STUBS. if (Tc
13110 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 l_InitStubs(inte
13120 72 70 2c 20 22 39 2e 30 22 2c 20 30 29 20 3d 3d rp, "9.0", 0) ==
13130 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
13140 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
13150 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 }.#endif. if
13160 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 (Tcl_PkgRequire(
13170 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 interp, "Tcl", "
13180 39 2e 30 2d 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 9.0-", 0) == NUL
13190 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
131a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 _ERROR;. }.#e
131b0 6c 73 65 0a 23 69 66 64 65 66 20 55 53 45 5f 54 lse.#ifdef USE_T
131c0 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 CL_STUBS. if
131d0 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 (Tcl_InitStubs(i
131e0 6e 74 65 72 70 2c 20 22 38 2e 35 22 2c 20 30 29 nterp, "8.5", 0)
131f0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
13200 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
13210 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
13220 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 if (Tcl_PkgRequi
13230 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 re(interp, "Tcl"
13240 2c 20 22 38 2e 35 2d 22 2c 20 30 29 20 3d 3d 20 , "8.5-", 0) ==
13250 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
13260 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
13270 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 .#endif.. if
13280 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 (TlsLibInit(0) !
13290 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c = TCL_OK) {..Tcl
132a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
132b0 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 terp, "could not
132c0 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 initialize SSL
132d0 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b library", NULL);
132e0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
132f0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 OR;. }.. T
13300 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
13310 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
13320 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 ::connection", C
13330 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a onnectionInfoObj
13340 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
13350 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
13360 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
13370 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
13380 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
13390 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 p, "tls::handsha
133a0 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 ke", HandshakeOb
133b0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
133c0 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
133d0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
133e0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
133f0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
13400 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 rp, "tls::import
13410 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c ", ImportObjCmd,
13420 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
13430 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
13440 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
13450 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
13460 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
13470 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 tls::misc", Misc
13480 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
13490 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
134a0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
134b0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
134c0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
134d0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d terp, "tls::unim
134e0 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f port", UnimportO
134f0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
13500 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
13510 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
13520 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
13530 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
13540 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 erp, "tls::statu
13550 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 s", StatusObjCmd
13560 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
13570 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
13580 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a Proc *) NULL);..
13590 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74 43 6f Tls_DigestCo
135a0 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a mmands(interp);.
135b0 20 20 20 20 54 6c 73 5f 49 6e 66 6f 43 6f 6d 6d Tls_InfoComm
135c0 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 0a 20 ands(interp);..
135d0 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b if (interp) {
135e0 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 ..Tcl_Eval(inter
135f0 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 p, tlsTclInitScr
13600 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ipt);. }..
13610 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 return Tcl_PkgP
13620 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 rovide(interp, P
13630 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 ACKAGE_NAME, PAC
13640 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d KAGE_VERSION);.}
13650 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
13660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
13690 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 *. *.Tls_SafeIni
136a0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d t --. *. *.-----
136b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 -----------*. *.
136e0 53 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 Standard procedu
136f0 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 re required by '
13700 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 load'.. *.Initia
13710 6c 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e lizes this exten
13720 73 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 sion for a safe
13730 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 interpreter.. *.
13740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13770 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 *. *. *.Side eff
13780 65 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 ects:. *..As of
13790 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 'Tls_Init'. *. *
137a0 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 .Result:. *..A s
137b0 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f tandard Tcl erro
137c0 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d r code.. *. *---
137d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
137e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
137f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13800 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f ---*. */.DLLEXPO
13810 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 RT int Tls_SafeI
13820 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a nit(Tcl_Interp *
13830 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 interp) {. dp
13840 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
13850 0a 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f . return(Tls_
13860 49 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d Init(interp));.}
13870 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
13880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
138b0 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 *. *.TlsLibInit
138c0 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d --. *. *.-------
138d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
138f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e ---------*. *.In
13900 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 itializes SSL li
13910 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 brary once per a
13920 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d pplication. *.--
13930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
13960 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 *. *.Side effec
13970 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 ts:. *..initiali
13980 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a zes SSL library.
13990 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a *. *.Result:. *
139a0 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d ..none. *. *----
139b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
139c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
139d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
139e0 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 --*. */.static i
139f0 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e nt TlsLibInit(in
13a00 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 t uninitialize)
13a10 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 {. static int
13a20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 initialized = 0
13a30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 ;. int status
13a40 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 = TCL_OK;.#if d
13a50 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
13a60 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
13a70 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
13a80 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c size_t num_l
13a90 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 ocks;.#endif..
13aa0 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 if (uninitiali
13ab0 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 ze) {..if (!init
13ac0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 ialized) {..
13ad0 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
13ae0 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 o uninitialize,
13af0 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 but we are not i
13b00 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 nitialized");...
13b10 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f return(TCL_O
13b20 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 K);..}...dprintf
13b30 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 ("Asked to unini
13b40 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 tialize");..#if
13b50 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
13b60 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 THREADS) && defi
13b70 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 ned(TCL_THREADS)
13b80 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 ..Tcl_MutexLock(
13b90 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 &init_mx);...if
13ba0 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 (locks) {.. f
13bb0 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 ree(locks);..
13bc0 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 locks = NULL;..
13bd0 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d locksCount =
13be0 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 0;..}.#endif..i
13bf0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a nitialized = 0;.
13c00 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 .#if defined(OPE
13c10 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 NSSL_THREADS) &&
13c20 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 defined(TCL_THR
13c30 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 EADS)..Tcl_Mutex
13c40 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 Unlock(&init_mx)
13c50 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 ;.#endif...retur
13c60 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d n(TCL_OK);. }
13c70 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 .. if (initia
13c80 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 lized) {..dprint
13c90 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 f("Called, but u
13ca0 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 sing cached valu
13cb0 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 e");..return(sta
13cc0 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 tus);. }..
13cd0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
13ce0 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 ");..#if defined
13cf0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 (OPENSSL_THREADS
13d00 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c ) && defined(TCL
13d10 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 _THREADS). Tc
13d20 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 l_MutexLock(&ini
13d30 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 t_mx);.#endif.
13d40 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 initialized =
13d50 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 1;..#if defined(
13d60 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
13d70 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
13d80 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d THREADS). num
13d90 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 _locks = 1;.
13da0 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e locksCount = (in
13db0 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 t) num_locks;.
13dc0 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 locks = malloc
13dd0 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 (sizeof(*locks)
13de0 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 * num_locks);.
13df0 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 memset(locks,
13e00 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 0, sizeof(*locks
13e10 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a ) * num_locks);.
13e20 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 #endif.. /* I
13e30 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c nitialize BOTH l
13e40 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 ibcrypto and lib
13e50 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e ssl. */. OPEN
13e60 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 SSL_init_ssl(OPE
13e70 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 NSSL_INIT_LOAD_S
13e80 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 SL_STRINGS | OPE
13e90 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 NSSL_INIT_LOAD_C
13ea0 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c RYPTO_STRINGS..|
13eb0 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 OPENSSL_INIT_AD
13ec0 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 D_ALL_CIPHERS |
13ed0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 OPENSSL_INIT_ADD
13ee0 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 _ALL_DIGESTS, NU
13ef0 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 LL);.. BIO_ne
13f00 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a w_tcl(NULL, 0);.
13f10 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 .#if 0. /*.
13f20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 * XXX:TODO: R
13f30 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 emove this code
13f40 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 and replace it w
13f50 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 ith a check.
13f60 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e * for enough en
13f70 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 tropy and do not
13f80 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f try to create o
13f90 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 ur own. * te
13fa0 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 rrible entropy.
13fb0 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 */. /*.
13fc0 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 * Seed the ra
13fd0 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 ndom number gene
13fe0 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c rator in the SSL
13ff0 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a library,. *
14000 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 using the do/wh
14010 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 ile construct be
14020 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 cause of the bug
14030 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 note in the.
14040 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 * OpenSSL FAQ
14050 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 at http://www.op
14060 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 enssl.org/suppor
14070 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 t/faq.html#USER1
14080 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 . *. * T
14090 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 he crux of the p
140a0 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 roblem is that S
140b0 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f olaris 7 does no
140c0 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 t have a. *
140d0 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f /dev/random or /
140e0 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 dev/urandom devi
140f0 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 ce so it cannot
14100 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 gather enough.
14110 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f * entropy fro
14120 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 m the RAND_seed(
14130 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 ) when TLS initi
14140 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 alizes and refus
14150 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 es. * to go
14160 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 further. Earlier
14170 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 versions of Ope
14180 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 nSSL carried on
14190 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 regardless..
141a0 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 */. srand((u
141b0 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d nsigned int) tim
141c0 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c e((time_t *) NUL
141d0 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 L));. do {..f
141e0 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 or (i = 0; i < 1
141f0 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6; i++) {.. r
14200 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b nd_seed[i] = 1 +
14210 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a (char) (255.0 *
14220 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 rand()/(RAND_MA
14230 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e X+1.0));..}..RAN
14240 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c D_seed(rnd_seed,
14250 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 sizeof(rnd_seed
14260 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 ));. } while
14270 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 (RAND_status() !
14280 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 = 1);.#endif..#i
14290 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 f defined(OPENSS
142a0 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 L_THREADS) && de
142b0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 fined(TCL_THREAD
142c0 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c S)..Tcl_MutexUnl
142d0 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 ock(&init_mx);.#
142e0 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 73 endif...return(s
142f0 74 61 74 75 73 29 3b 0a 7d 0a tatus);.}.