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: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63 "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 h>.#include <ope
03a0: 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 nssl/crypto.h>.#
03b0: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c include <openssl
03c0: 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 /ssl.h>.#include
03d0: 20 3c 6f 70 65 6e 73 73 6c 2f 65 76 70 2e 68 3e <openssl/evp.h>
03e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 .#include <opens
03f0: 73 6c 2f 6f 62 6a 65 63 74 73 2e 68 3e 0a 23 69 sl/objects.h>.#i
0400: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0410: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 rsa.h>.#include
0420: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61 <openssl/safesta
0430: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 ck.h>../* Min Op
0440: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f enSSL version */
0450: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
0460: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
0470: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 10101000L.#error
0480: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 "Only OpenSSL v
0490: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 1.1.1 or later i
04a0: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e s supported".#en
04b0: 64 69 66 0a 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 dif.../*. * Forw
04c0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 ard declarations
04d0: 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 . */..#define F2
04e0: 4e 28 6b 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 N(key, dsp) \..(
04f0: 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 ((key) == NULL)
0500: 3f 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 ? (char *) NULL
0510: 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c : \...Tcl_Transl
0520: 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 ateFileName(inte
0530: 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73 70 29 rp, (key), (dsp)
0540: 29 29 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 ))..static SSL_C
0550: 54 58 20 2a 43 54 58 5f 49 6e 69 74 28 53 74 61 TX *CTX_Init(Sta
0560: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e te *statePtr, in
0570: 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 t isServer, int
0580: 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 proto, char *key
0590: 2c 0a 09 09 63 68 61 72 20 2a 63 65 72 74 66 69 ,...char *certfi
05a0: 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 le, unsigned cha
05b0: 72 20 2a 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73 r *key_asn1, uns
05c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 igned char *cert
05d0: 5f 61 73 6e 31 2c 0a 09 09 69 6e 74 20 6b 65 79 _asn1,...int key
05e0: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 _asn1_len, int c
05f0: 65 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 ert_asn1_len, ch
0600: 61 72 20 2a 43 41 70 61 74 68 2c 20 63 68 61 72 ar *CApath, char
0610: 20 2a 43 41 66 69 6c 65 2c 0a 09 09 63 68 61 72 *CAfile,...char
0620: 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 *ciphers, char
0630: 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 *ciphersuites, i
0640: 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a nt level, char *
0650: 44 48 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61 74 DHparams);..stat
0660: 69 63 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e 69 ic int.TlsLibIni
0670: 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 t(int uninitiali
0680: 7a 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c ze);..#define TL
0690: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78 S_PROTO_SSL2..0x
06a0: 30 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 01.#define TLS_P
06b0: 52 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a ROTO_SSL3..0x02.
06c0: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 #define TLS_PROT
06d0: 4f 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64 65 O_TLS1..0x04.#de
06e0: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 fine TLS_PROTO_T
06f0: 4c 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66 69 LS1_1.0x08.#defi
0700: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ne TLS_PROTO_TLS
0710: 31 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e 65 1_2.0x10.#define
0720: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f TLS_PROTO_TLS1_
0730: 33 09 30 78 32 30 0a 23 64 65 66 69 6e 65 20 45 3.0x20.#define E
0740: 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 NABLED(flag, mas
0750: 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20 28 6d k).(((flag) & (m
0760: 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 ask)) == (mask))
0770: 0a 0a 23 64 65 66 69 6e 65 20 53 53 4c 4b 45 59 ..#define SSLKEY
0780: 4c 4f 47 46 49 4c 45 09 09 22 53 53 4c 4b 45 59 LOGFILE.."SSLKEY
0790: 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 LOGFILE"../*. *
07a0: 54 68 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20 Thread-Safe TLS
07b0: 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 Code. */..#ifdef
07c0: 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 TCL_THREADS.#de
07d0: 66 69 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 fine OPENSSL_THR
07e0: 45 41 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 EAD_DEFINES.#inc
07f0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 lude <openssl/op
0800: 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 ensslconf.h>..#i
0810: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 fdef OPENSSL_THR
0820: 45 41 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f EADS.#include <o
0830: 70 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e penssl/crypto.h>
0840: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 .#include <opens
0850: 73 6c 2f 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a sl/ssl.h>../*. *
0860: 20 54 68 72 65 61 64 65 64 20 6f 70 65 72 61 74 Threaded operat
0870: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 6c 6f 63 ion requires loc
0880: 6b 69 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 king callbacks.
0890: 2a 20 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 * Based from /cr
08a0: 79 70 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 ypto/cryptlib.c
08b0: 6f 66 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e of OpenSSL and N
08c0: 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 SOpenSSL.. */..s
08d0: 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 tatic Tcl_Mutex
08e0: 2a 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 *locks = NULL;.s
08f0: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 tatic int locksC
0900: 6f 75 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 ount = 0;.static
0910: 20 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f Tcl_Mutex init_
0920: 6d 78 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 mx;.#endif /* OP
0930: 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f ENSSL_THREADS */
0940: 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 .#endif /* TCL_T
0950: 48 52 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a HREADS */..../**
0960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0970: 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 **/./* Callbacks
0980: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a */./****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
09a0: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
09f0: 2a 20 45 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 * Eval Callback
0a00: 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a Command --. *. *
0a10: 09 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 .Eval callback c
0a20: 6f 6d 6d 61 6e 64 20 61 6e 64 20 63 61 74 63 68 ommand and catch
0a30: 20 61 6e 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 any errors. *.
0a40: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 * Results:. *.0
0a50: 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e = Command return
0a60: 65 64 20 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 ed fail or eval
0a70: 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 returned TCL_ERR
0a80: 4f 52 0a 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e OR. *.1 = Comman
0a90: 64 20 72 65 74 75 72 6e 65 64 20 73 75 63 63 65 d returned succe
0aa0: 73 73 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 ss or eval retur
0ab0: 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a ned TCL_OK. *. *
0ac0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0ad0: 2a 09 45 76 61 6c 75 61 74 65 73 20 63 61 6c 6c *.Evaluates call
0ae0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a back command. *.
0af0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
0b40: 20 69 6e 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 int.EvalCallbac
0b50: 6b 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e k(Tcl_Interp *in
0b60: 74 65 72 70 2c 20 53 74 61 74 65 20 2a 73 74 61 terp, State *sta
0b70: 74 65 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a tePtr, Tcl_Obj *
0b80: 63 6d 64 50 74 72 29 20 7b 0a 20 20 20 20 69 6e cmdPtr) {. in
0b90: 74 20 63 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a t code, ok = 0;.
0ba0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
0bb0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 63 6c lled");.. Tcl
0bc0: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e _Preserve((Clien
0bd0: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
0be0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 Tcl_Preserve
0bf0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 ((ClientData) st
0c00: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a atePtr);.. /*
0c10: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 Eval callback w
0c20: 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72 20 ith success for
0c30: 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c ok or return val
0c40: 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 ue 1, fail for e
0c50: 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76 rror or return v
0c60: 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 alue 0 */. Tc
0c70: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
0c80: 74 65 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 terp);. code
0c90: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 = Tcl_EvalObjEx(
0ca0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
0cb0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
0cc0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 ;. dprintf("E
0cd0: 76 61 6c 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 valCallback: %d"
0ce0: 2c 20 63 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 , code);. if
0cf0: 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 (code == TCL_OK)
0d00: 20 7b 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 {../* Check res
0d10: 75 6c 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 ult for return v
0d20: 61 6c 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a alue */..Tcl_Obj
0d30: 20 2a 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 *result = Tcl_G
0d40: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
0d50: 72 70 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 rp);..if (result
0d60: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f == NULL || Tcl_
0d70: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e GetIntFromObj(in
0d80: 74 65 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f terp, result, &o
0d90: 6b 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a k) != TCL_OK) {.
0da0: 09 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a . ok = 1;..}.
0db0: 09 64 70 72 69 6e 74 66 28 22 52 65 73 75 6c 74 .dprintf("Result
0dc0: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 : %d", ok);.
0dd0: 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72 } else {../* Err
0de0: 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20 or - reject the
0df0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 certificate */..
0e00: 64 70 72 69 6e 74 66 28 22 54 63 6c 5f 42 61 63 dprintf("Tcl_Bac
0e10: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 22 29 3b 0a kgroundError");.
0e20: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 #if (TCL_MAJOR_V
0e30: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 ERSION == 8) &&
0e40: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 (TCL_MINOR_VERSI
0e50: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 ON < 6)..Tcl_Bac
0e60: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 kgroundError(int
0e70: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c erp);.#else..Tcl
0e80: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 _BackgroundExcep
0e90: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 tion(interp, cod
0ea0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d e);.#endif. }
0eb0: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 .. Tcl_Releas
0ec0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 e((ClientData) s
0ed0: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 tatePtr);. Tc
0ee0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e l_Release((Clien
0ef0: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a tData) interp);.
0f00: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d return ok;.}
0f10: 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
0f60: 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d * InfoCallback -
0f70: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 -. *. *.Monitors
0f80: 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 SSL connection
0f90: 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 process. *. * Re
0fa0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 sults:. *.None.
0fb0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
0fc0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c s:. *.Calls call
0fd0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 back (if defined
0fe0: 29 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
1030: 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 tatic void.InfoC
1040: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 allback(const SS
1050: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 L *ssl, int wher
1060: 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20 20 e, int ret) {.
1070: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
1080: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f r = (State*)SSL_
1090: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 get_app_data((SS
10a0: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 L *)ssl);. Tc
10b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
10c0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
10d0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
10e0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 *cmdPtr;. ch
10f0: 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 20 ar *major; char
1100: 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72 *minor;.. dpr
1110: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
1120: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
1130: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 r->callback == (
1140: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 Tcl_Obj*)NULL)..
1150: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20 return;.. if
1160: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f (where & SSL_CB_
1170: 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 29 HANDSHAKE_START)
1180: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e {..major = "han
1190: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 dshake";..minor
11a0: 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 7d = "start";. }
11b0: 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 else if (where
11c0: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 & SSL_CB_HANDSHA
11d0: 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f KE_DONE) {..majo
11e0: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b r = "handshake";
11f0: 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 ..minor = "done"
1200: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
1210: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1220: 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 CB_ALERT)..major
1230: 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 = "alert";..els
1240: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 e if (where & SS
1250: 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 L_ST_CONNECT).ma
1260: 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b jor = "connect";
1270: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 ..else if (where
1280: 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 & SSL_ST_ACCEPT
1290: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 )..major = "acce
12a0: 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d pt";..else.....m
12b0: 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 ajor = "unknown"
12c0: 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 ;...if (where &
12d0: 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 SSL_CB_READ)..mi
12e0: 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 nor = "read";..e
12f0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 lse if (where &
1300: 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 6d SSL_CB_WRITE)..m
1310: 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b 0a inor = "write";.
1320: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
1330: 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 & SSL_CB_LOOP)..
1340: 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a minor = "loop";.
1350: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 .else if (where
1360: 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 & SSL_CB_EXIT)..
1370: 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a minor = "exit";.
1380: 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 .else.....minor
1390: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 = "unknown";.
13a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
13b0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 e command to eva
13c0: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c l with fn, chan,
13d0: 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d major, minor, m
13e0: 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 70 65 essage, and type
13f0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 args */. cmd
1400: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
1410: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d ateObj(statePtr-
1420: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 >callback);.
1430: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
1440: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
1450: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
1460: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 StringObj("info"
1470: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f , -1));. Tcl_
1480: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
1490: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 ment(interp, cmd
14a0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
14b0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
14c0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
14d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
14e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
14f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
1500: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
1510: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
1520: 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a bj(major, -1));.
1530: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
1540: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1550: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
1560: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 _NewStringObj(mi
1570: 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 nor, -1));..
1580: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f if (where & SSL_
1590: 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c CB_ALERT) {..Tcl
15a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
15b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
15c0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
15d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f ewStringObj(SSL_
15e0: 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e alert_desc_strin
15f0: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 g_long(ret), -1)
1600: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
1610: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
1620: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 erp, cmdPtr,..
1630: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
1640: 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 bj(SSL_alert_typ
1650: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 e_string_long(re
1660: 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 t), -1));. }
1670: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 else {..Tcl_List
1680: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1690: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
16a0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 .. Tcl_NewStr
16b0: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 ingObj(SSL_state
16c0: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c _string_long(ssl
16d0: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 ), -1));..Tcl_Li
16e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
16f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
1700: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
1710: 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 Obj("info", -1))
1720: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
1730: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
1740: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
1750: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
1760: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
1770: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
1780: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
1790: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
17a0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
17b0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1800: 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 . * MessageCallb
1810: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e ack --. *. *.Mon
1820: 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 itors SSL protoc
1830: 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 ol messages. *.
1840: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
1850: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
1860: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
1870: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
1880: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ined). *. *-----
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
18d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 */.#ifndef OPENS
18e0: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a SL_NO_SSL_TRACE.
18f0: 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 static void.Mess
1900: 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 ageCallback(int
1910: 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 write_p, int ver
1920: 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e sion, int conten
1930: 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f t_type, const vo
1940: 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 id *buf, size_t
1950: 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 len, SSL *ssl, v
1960: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 oid *arg) {.
1970: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
1980: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 = (State*)arg;.
1990: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
19a0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 nterp.= statePtr
19b0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 ->interp;. Tc
19c0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 l_Obj *cmdPtr;.
19d0: 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 char *ver, *t
19e0: 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 ype;. BIO *bi
19f0: 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 o;. char buff
1a00: 65 72 5b 33 30 30 30 30 5d 3b 0a 20 20 20 20 62 er[30000];. b
1a10: 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 uffer[0] = 0;..
1a20: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
1a30: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ed");.. if (s
1a40: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 tatePtr->callbac
1a50: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e k == (Tcl_Obj*)N
1a60: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 ULL)..return;..
1a70: 20 20 20 73 77 69 74 63 68 28 76 65 72 73 69 6f switch(versio
1a80: 6e 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c n) {.#if OPENSSL
1a90: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
1aa0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 < 0x10100000L &&
1ab0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c !defined(NO_SSL
1ac0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 2) && !defined(O
1ad0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a PENSSL_NO_SSL2).
1ae0: 20 20 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45 case SSL2_VE
1af0: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 RSION:..ver = "S
1b00: 53 4c 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 SLv2";..break;.#
1b10: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
1b20: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 ed(NO_SSL3) && !
1b30: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
1b40: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73 NO_SSL3). cas
1b50: 65 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a e SSL3_VERSION:.
1b60: 09 76 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a .ver = "SSLv3";.
1b70: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 .break;.#endif.
1b80: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52 case TLS1_VER
1b90: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c SION:..ver = "TL
1ba0: 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 Sv1";..break;.
1bb0: 20 20 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 case TLS1_1_VE
1bc0: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 RSION:..ver = "T
1bd0: 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b LSv1.1";..break;
1be0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32 . case TLS1_2
1bf0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d _VERSION:..ver =
1c00: 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 "TLSv1.2";..bre
1c10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 ak;. case TLS
1c20: 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 1_3_VERSION:..ve
1c30: 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 r = "TLSv1.3";..
1c40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1c50: 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 0:..ver = "none"
1c60: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 ;..break;. de
1c70: 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 fault:..ver = "u
1c80: 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b nknown";..break;
1c90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 . }.. swit
1ca0: 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 ch (content_type
1cb0: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c ) {. case SSL
1cc0: 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 3_RT_HEADER:..ty
1cd0: 70 65 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 pe = "Header";..
1ce0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
1cf0: 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f SSL3_RT_INNER_CO
1d00: 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 NTENT_TYPE:..typ
1d10: 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 e = "Inner Conte
1d20: 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b nt Type";..break
1d30: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1d40: 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52 RT_CHANGE_CIPHER
1d50: 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 _SPEC:..type = "
1d60: 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a Change Cipher";.
1d70: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 .break;. case
1d80: 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a SSL3_RT_ALERT:.
1d90: 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b .type = "Alert";
1da0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1db0: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 e SSL3_RT_HANDSH
1dc0: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 AKE:..type = "Ha
1dd0: 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b ndshake";..break
1de0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f ;. case SSL3_
1df0: 52 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 RT_APPLICATION_D
1e00: 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 ATA:..type = "Ap
1e10: 70 20 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b p Data";..break;
1e20: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
1e30: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
1e40: 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 63 61 30000000L. ca
1e50: 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 se DTLS1_RT_HEAR
1e60: 54 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 TBEAT:..type = "
1e70: 48 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65 Heartbeat";..bre
1e80: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 ak;.#endif. d
1e90: 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 efault:..type =
1ea0: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d "unknown";. }
1eb0: 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 .. /* Needs c
1ec0: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 ompile time opti
1ed0: 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 on "enable-ssl-t
1ee0: 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 race". */. if
1ef0: 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 ((bio = BIO_new
1f00: 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 (BIO_s_mem())) !
1f10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e = NULL) {..int n
1f20: 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69 ;..SSL_trace(wri
1f30: 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 te_p, version, c
1f40: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 ontent_type, buf
1f50: 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 , len, ssl, (voi
1f60: 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 d *)bio);..n = B
1f70: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66 IO_read(bio, buf
1f80: 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67 fer, BIO_pending
1f90: 28 62 69 6f 29 20 3c 20 31 35 30 30 30 20 3f 20 (bio) < 15000 ?
1fa0: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 BIO_pending(bio)
1fb0: 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20 : 14999);..n =
1fc0: 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09 (n<0) ? 0 : n;..
1fd0: 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09 buffer[n] = 0;..
1fe0: 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28 (void)BIO_flush(
1ff0: 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28 bio);..BIO_free(
2000: 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20 bio);. }..
2010: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e /* Create comman
2020: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 d to eval with f
2030: 6e 2c 20 63 68 61 6e 2c 20 64 69 72 65 63 74 69 n, chan, directi
2040: 6f 6e 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 on, version, typ
2050: 65 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61 e, and message a
2060: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
2070: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
2080: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 eObj(statePtr->c
2090: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 allback);. Tc
20a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
20b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
20c0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
20d0: 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 ringObj("message
20e0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
20f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2100: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2110: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
2120: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
2130: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
2140: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
2150: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
2160: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2170: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2180: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2190: 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53 Obj(write_p ? "S
21a0: 65 6e 74 22 20 3a 20 22 52 65 63 65 69 76 65 64 ent" : "Received
21b0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
21c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
21d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
21e0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 dPtr, Tcl_NewStr
21f0: 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 ingObj(ver, -1))
2200: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ;. Tcl_ListOb
2210: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2220: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
2230: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2240: 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 type, -1));.
2250: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2260: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2270: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 cmdPtr, Tcl_New
2280: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 StringObj(buffer
2290: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 , -1));.. /*
22a0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f Eval callback co
22b0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c mmand */. Tcl
22c0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _IncrRefCount(cm
22d0: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 dPtr);. EvalC
22e0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 allback(interp,
22f0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 statePtr, cmdPtr
2300: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 );. Tcl_DecrR
2310: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b efCount(cmdPtr);
2320: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 .}.#endif.../*.
2330: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2370: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 ----. *. * Verif
2380: 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a yCallback --. *.
2390: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 *.Monitors SSL
23a0: 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 certificate vali
23b0: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 dation process.
23c0: 55 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 Used to control
23d0: 74 68 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 the. *.behavior
23e0: 77 68 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 when the SSL_VER
23f0: 49 46 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73 IFY_PEER flag is
2400: 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 63 61 set. This is ca
2410: 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 lled. *.whenever
2420: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69 a certificate i
2430: 73 20 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64 s inspected or d
2440: 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 ecided invalid.
2450: 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 Called for. *.ea
2460: 63 68 20 63 65 72 74 69 66 69 63 61 74 65 20 69 ch certificate i
2470: 6e 20 74 68 65 20 63 65 72 74 20 63 68 61 69 6e n the cert chain
2480: 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a .. *. * Checks:.
2490: 20 2a 09 54 68 65 20 63 65 72 74 69 66 69 63 61 *.The certifica
24a0: 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 63 te chain is chec
24b0: 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 ked starting wit
24c0: 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e 65 h the deepest ne
24d0: 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 sting level. *.
24e0: 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65 (the root CA ce
24f0: 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 77 rtificate) and w
2500: 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20 orked upward to
2510: 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74 69 the peer's certi
2520: 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 ficate.. *.All s
2530: 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 61 ignatures are va
2540: 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d lid, current tim
2550: 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 73 e is within firs
2560: 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 t and last valid
2570: 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 ity time.. *.Che
2580: 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 74 ck that the cert
2590: 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75 65 ificate is issue
25a0: 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72 20 d by the issuer
25b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75 certificate issu
25c0: 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 er.. *.Check the
25d0: 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 revocation stat
25e0: 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 74 us for each cert
25f0: 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 ificate.. *.Chec
2600: 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f k the validity o
2610: 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20 f the given CRL
2620: 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 76 and the cert rev
2630: 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a ocation status..
2640: 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c *.Check the pol
2650: 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 icies of all the
2660: 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a certificates. *
2670: 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76 . * Args. *.prev
2680: 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 erify_ok indicat
2690: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 63 es whether the c
26a0: 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66 ertificate verif
26b0: 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28 ication passed (
26c0: 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 1) or not (0). *
26d0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
26e0: 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 A callback bound
26f0: 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d to the socket m
2700: 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 ay return one of
2710: 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74 :. *. 0...- t
2720: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 he certificate i
2730: 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 s deemed invalid
2740: 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 74 , send verificat
2750: 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c ion. *.... fail
2760: 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65 ure alert to pee
2770: 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 r, and terminate
2780: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 handshake.. *.
2790: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72 1...- the cer
27a0: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d tificate is deem
27b0: 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e ed valid, contin
27c0: 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b ue with handshak
27d0: 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20 e.. *. empty
27e0: 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e string.- no chan
27f0: 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74 ge to certificat
2800: 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a e validation. *.
2810: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
2820: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c . *.The err fiel
2830: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 d of the current
2840: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 ly operative Sta
2850: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 te is set. *. t
2860: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 o a string descr
2870: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 ibing the SSL ne
2880: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 gotiation failur
2890: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d e reason. *. *--
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28e0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
28f0: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 .VerifyCallback(
2900: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f int ok, X509_STO
2910: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 RE_CTX *ctx) {.
2920: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 Tcl_Obj *cmdP
2930: 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 tr;. SSL *s
2940: 73 6c 20 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f sl = (SSL*)X509_
2950: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 STORE_CTX_get_ex
2960: 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 _data(ctx, SSL_g
2970: 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f et_ex_data_X509_
2980: 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 STORE_CTX_idx())
2990: 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 ;. X509 *cer
29a0: 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f t..= X509_STORE_
29b0: 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f CTX_get_current_
29c0: 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 cert(ctx);. S
29d0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d tate *statePtr.=
29e0: 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 (State*)SSL_get
29f0: 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a _app_data(ssl);.
2a00: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
2a10: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 interp.= statePt
2a20: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 r->interp;. i
2a30: 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 nt depth..= X509
2a40: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 _STORE_CTX_get_e
2a50: 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b rror_depth(ctx);
2a60: 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 . int err..=
2a70: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 X509_STORE_CTX_g
2a80: 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a et_error(ctx);..
2a90: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
2aa0: 6c 65 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e led");. dprin
2ab0: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 tf("VerifyCallba
2ac0: 63 6b 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 ck: %d", ok);..
2ad0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
2ae0: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 >vcmd == (Tcl_Ob
2af0: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 j*)NULL) {../* U
2b00: 73 65 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 se ok value if v
2b10: 65 72 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 erification is r
2b20: 65 71 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 equired */..if (
2b30: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 statePtr->vflags
2b40: 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 & SSL_VERIFY_FA
2b50: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 IL_IF_NO_PEER_CE
2b60: 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 RT) {.. retur
2b70: 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a n ok;..} else {.
2b80: 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 . return 1;..
2b90: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 }. } else if
2ba0: 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (cert == NULL ||
2bb0: 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ssl == NULL) {.
2bc0: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d .return 0;. }
2bd0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 .. dprintf("V
2be0: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 erifyCallback: e
2bf0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a val callback");.
2c00: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
2c10: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 ommand to eval w
2c20: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 ith fn, chan, de
2c30: 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c pth, cert info l
2c40: 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 ist, status, and
2c50: 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 error args */.
2c60: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f cmdPtr = Tcl_
2c70: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 DuplicateObj(sta
2c80: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 tePtr->vcmd);.
2c90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
2ca0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
2cb0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
2cc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 ewStringObj("ver
2cd0: 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 ify", -1));.
2ce0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
2cf0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
2d00: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 cmdPtr,..Tcl_Ne
2d10: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 wStringObj(Tcl_G
2d20: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 etChannelName(st
2d30: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d atePtr->self), -
2d40: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 1));. Tcl_Lis
2d50: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2d60: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2d70: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
2d80: 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c depth));. Tcl
2d90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
2da0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
2db0: 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 dPtr, Tls_NewX50
2dc0: 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 9Obj(interp, cer
2dd0: 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 t));. Tcl_Lis
2de0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2df0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 t(interp, cmdPtr
2e00: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 , Tcl_NewIntObj(
2e10: 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 ok));. Tcl_Li
2e20: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2e30: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
2e40: 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e r,..Tcl_NewStrin
2e50: 67 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 gObj((char*)X509
2e60: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 _verify_cert_err
2e70: 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 or_string(err),
2e80: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 -1));.. /* Pr
2e90: 65 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 event I/O while
2ea0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 callback is in p
2eb0: 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f rogress */. /
2ec0: 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 * statePtr->flag
2ed0: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c s |= TLS_TCL_CAL
2ee0: 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f LBACK; */.. /
2ef0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
2f00: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
2f10: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
2f20: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 cmdPtr);. ok
2f30: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 = EvalCallback(i
2f40: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
2f50: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
2f60: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
2f70: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72 mdPtr);.. dpr
2f80: 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c intf("VerifyCall
2f90: 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 back: command re
2fa0: 73 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b sult = %d", ok);
2fb0: 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 .. /* statePt
2fc0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c r->flags &= ~(TL
2fd0: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b S_TCL_CALLBACK);
2fe0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6f */. return o
2ff0: 6b 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 k;./* By default
3000: 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 , leave verifica
3010: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 tion unchanged.
3020: 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d */.}.../*. *----
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3070: 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 *. * Tls_Error
3080: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 --. *. *.Calls c
3090: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 65 72 72 allback with err
30a0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 or message.. *.
30b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
30c0: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 *.The err field
30d0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c of the currentl
30e0: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 y operative Stat
30f0: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f e is set. *. to
3100: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 a string descri
3110: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 bing the SSL neg
3120: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 otiation failure
3130: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d reason. *. *---
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3180: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 . */.void.Tls_Er
3190: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 ror(State *state
31a0: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20 Ptr, char *msg)
31b0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 {. Tcl_Interp
31c0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 *interp.= state
31d0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 Ptr->interp;.
31e0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 Tcl_Obj *cmdPtr
31f0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 , *listPtr;.
3200: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 unsigned long er
3210: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d r;. statePtr-
3220: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 >err = msg;..
3230: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
3240: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 ");.. if (sta
3250: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 tePtr->callback
3260: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c == (Tcl_Obj*)NUL
3270: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 L)..return;..
3280: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 /* Create comma
3290: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 nd to eval with
32a0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d 65 fn, chan, and me
32b0: 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 20 ssage args */.
32c0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
32d0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
32e0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b ePtr->callback);
32f0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
3300: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
3310: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 terp, cmdPtr, Tc
3320: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 l_NewStringObj("
3330: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 error", -1));.
3340: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3350: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3360: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
3370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
3380: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
3390: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
33a0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 lf), -1));. i
33b0: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 f (msg != NULL)
33c0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 {..Tcl_ListObjAp
33d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
33e0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
33f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 NewStringObj(msg
3400: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 , -1));.. } e
3410: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 lse if ((msg = T
3420: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63 6c cl_GetString(Tcl
3430: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _GetObjResult(in
3440: 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c 29 terp))) != NULL)
3450: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {..Tcl_ListObjA
3460: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
3470: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c erp, cmdPtr, Tcl
3480: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 _NewStringObj(ms
3490: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 g, -1));.. }
34a0: 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 else {..listPtr
34b0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
34c0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c (0, NULL);..whil
34d0: 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 65 e ((err = ERR_ge
34e0: 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 29 t_error()) != 0)
34f0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 {.. Tcl_List
3500: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
3510: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 (interp, listPtr
3520: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
3530: 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 bj(ERR_reason_er
3540: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c ror_string(err),
3550: 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c -1));..}..Tcl_L
3560: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
3570: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
3580: 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 tr, listPtr);.
3590: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c }.. /* Eval
35a0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
35b0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 d */. Tcl_Inc
35c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 rRefCount(cmdPtr
35d0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 );. EvalCallb
35e0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ack(interp, stat
35f0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 ePtr, cmdPtr);.
3600: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
3610: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c unt(cmdPtr);.}..
3620: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3670: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d KeyLogCallback -
3680: 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 -. *. *.Write re
3690: 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 ceived key data
36a0: 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a to log file.. *.
36b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
36c0: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.none. *. *--
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3710: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f -. */.void KeyLo
3720: 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 gCallback(const
3730: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 SSL *ssl, const
3740: 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 char *line) {.
3750: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 65 char *str = ge
3760: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 tenv(SSLKEYLOGFI
3770: 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 LE);. FILE *f
3780: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 d;.. dprintf(
3790: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
37a0: 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d if (str) {..fd =
37b0: 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 fopen(str, "a")
37c0: 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 ;..fprintf(fd, "
37d0: 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 %s\n",line);..fc
37e0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a lose(fd);. }.
37f0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3840: 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c * Password Call
3850: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 back --. *. *.Ca
3860: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 lled when a pass
3870: 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 66 word is needed f
3880: 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 or a private key
3890: 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 20 2a when loading. *
38a0: 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 50 45 .or storing a PE
38b0: 4d 20 63 65 72 74 69 66 69 63 61 74 65 20 77 69 M certificate wi
38c0: 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45 th encryption. E
38d0: 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a 20 2a vals callback. *
38e0: 09 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 .script and retu
38f0: 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 61 rns the result a
3900: 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 20 73 s the password s
3910: 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a tring in buf.. *
3920: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
3930: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
3940: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
3950: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
3960: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
3970: 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f turns:. *.Passwo
3980: 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 rd size in bytes
3990: 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 or -1 for an er
39a0: 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ror.. *. *------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
39f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 /.static int.Pas
3a00: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 swordCallback(ch
3a10: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a ar *buf, int siz
3a20: 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20 76 e, int rwflag, v
3a30: 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 oid *udata) {.
3a40: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
3a50: 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 r.= (State *) ud
3a60: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 ata;. Tcl_Int
3a70: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 erp *interp.= st
3a80: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a atePtr->interp;.
3a90: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
3aa0: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 Ptr;. int cod
3ab0: 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 e;. Tcl_Size
3ac0: 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 len;.. dprint
3ad0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
3ae0: 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62 /* If no callb
3af0: 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c 74 ack, use default
3b00: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 callback */.
3b10: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 if (statePtr->p
3b20: 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 assword == NULL)
3b30: 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c {..if (Tcl_Eval
3b40: 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a Ex(interp, "tls:
3b50: 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20 :password", -1,
3b60: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 TCL_EVAL_GLOBAL)
3b70: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 == TCL_OK) {..
3b80: 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28 char *ret = (
3b90: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 char *) Tcl_GetS
3ba0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c tringFromObj(Tcl
3bb0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _GetObjResult(in
3bc0: 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 20 terp), &len);..
3bd0: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 if (len > (Tc
3be0: 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 l_Size) size-1)
3bf0: 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 {...len = (Tcl_S
3c00: 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 20 20 ize) size-1;..
3c10: 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 70 79 }.. strncpy
3c20: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 (buf, ret, (size
3c30: 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 62 _t) len);.. b
3c40: 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a uf[len] = '\0';.
3c50: 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 . return (int
3c60: 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20 7b ) len;..} else {
3c70: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b .. return -1;
3c80: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
3c90: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 * Create command
3ca0: 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e to eval with fn
3cb0: 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73 69 , rwflag, and si
3cc0: 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 ze args */. c
3cd0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
3ce0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
3cf0: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 r->password);.
3d00: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3d10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3d20: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
3d30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 ewStringObj("pas
3d40: 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 sword", -1));.
3d50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
3d60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
3d70: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
3d80: 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 ewIntObj(rwflag)
3d90: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f );. Tcl_ListO
3da0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
3db0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 interp, cmdPtr,
3dc0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 Tcl_NewIntObj(si
3dd0: 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 ze));.. Tcl_P
3de0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 reserve((ClientD
3df0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 ata) interp);.
3e00: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 Tcl_Preserve((
3e10: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
3e20: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 ePtr);.. /* E
3e30: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d val callback com
3e40: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f mand */. Tcl_
3e50: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 IncrRefCount(cmd
3e60: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d Ptr);. code =
3e70: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
3e80: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 nterp, cmdPtr, T
3e90: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
3ea0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d . if (code !=
3eb0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 TCL_OK) {.#if (
3ec0: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f TCL_MAJOR_VERSIO
3ed0: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f N == 8) && (TCL_
3ee0: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 MINOR_VERSION <
3ef0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6)..Tcl_Backgrou
3f00: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b ndError(interp);
3f10: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b .#else..Tcl_Back
3f20: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 groundException(
3f30: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 interp, code);.#
3f40: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 endif. }.
3f50: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
3f60: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 (cmdPtr);.. T
3f70: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 cl_Release((Clie
3f80: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 ntData) statePtr
3f90: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 );.. /* If su
3fa0: 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62 ccessful, pass b
3fb0: 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72 ack password str
3fc0: 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65 ing and truncate
3fd0: 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a if too long */.
3fe0: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 if (code ==
3ff0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20 TCL_OK) {..char
4000: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 *ret = (char *)
4010: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
4020: 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 mObj(Tcl_GetObjR
4030: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 esult(interp), &
4040: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e len);..if (len >
4050: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 (Tcl_Size) size
4060: 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d -1) {.. len =
4070: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 (Tcl_Size) size
4080: 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28 -1;..}..strncpy(
4090: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f buf, ret, (size_
40a0: 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 t) len);..buf[le
40b0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f n] = '\0';..Tcl_
40c0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 Release((ClientD
40d0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72 ata) interp);..r
40e0: 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e 3b eturn (int) len;
40f0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 . }. Tcl_R
4100: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 elease((ClientDa
4110: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 ta) interp);.
4120: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a return -1;.}...
4130: 2f 2a 0a 20 2a 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 2d ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
4180: 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 ession Callback
4190: 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 for Clients --.
41a0: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e *. *.Called when
41b0: 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 a new session i
41c0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 s added to the c
41d0: 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 ache. In TLS 1.3
41e0: 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 . *.this may be
41f0: 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c received multipl
4200: 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 e times after th
4210: 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 e handshake. For
4220: 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 . *.earlier vers
4230: 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 ions, this will
4240: 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69 be received duri
4250: 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 ng the handshake
4260: 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 .. *.This is the
4270: 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 74 preferred way t
4280: 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d o obtain a resum
4290: 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a able session.. *
42a0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
42b0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 None. *. * Side
42c0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c effects:. *.Call
42d0: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 s callback (if d
42e0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 efined). *. * Re
42f0: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 turn codes:. *.0
4300: 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 = error where s
4310: 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 ession will be i
4320: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 mmediately remov
4330: 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 ed from the inte
4340: 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 rnal cache.. *.1
4350: 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 65 = success where
4360: 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 app retains ses
4370: 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 sion in session
4380: 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 cache, and must
4390: 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e call SSL_SESSION
43a0: 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e _free() when don
43b0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
4400: 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 static int.Sessi
4410: 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a onCallback(SSL *
4420: 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e ssl, SSL_SESSION
4430: 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 *session) {.
4440: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
4450: 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 = (State*)SSL_g
4460: 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c et_app_data((SSL
4470: 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c *)ssl);. Tcl
4480: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 _Interp *interp.
4490: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 = statePtr->inte
44a0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp;. Tcl_Obj
44b0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e *cmdPtr;. con
44c0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
44d0: 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f *ticket;. co
44e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
44f0: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 r *session_id;.
4500: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a size_t len2;.
4510: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
4520: 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 ulen;.. dpri
4530: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
4540: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
4550: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 ->callback == (T
4560: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
4570: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
4580: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
4590: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d else if (ssl ==
45a0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
45b0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f SSL_TLSEXT_ERR_
45c0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 NOACK;. }..
45d0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d /* Create comm
45e0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 and to eval with
45f0: 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73 69 fn, chan, sessi
4600: 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20 74 on id, session t
4610: 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65 74 icket, and lifet
4620: 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 ime args */.
4630: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 cmdPtr = Tcl_Dup
4640: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 licateObj(stateP
4650: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 tr->callback);.
4660: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
4670: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
4680: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
4690: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 NewStringObj("se
46a0: 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 ssion", -1));.
46b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
46c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
46d0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 p, cmdPtr,..
46e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
46f0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e (Tcl_GetChannelN
4700: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ame(statePtr->se
4710: 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 lf), -1));..
4720: 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f /* Session id */
4730: 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 . session_id
4740: 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 = SSL_SESSION_ge
4750: 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 t_id(session, &u
4760: 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 len);. Tcl_Li
4770: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4780: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4790: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
47a0: 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 rayObj(session_i
47b0: 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c d, (Tcl_Size) ul
47c0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 en));.. /* Se
47d0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a ssion ticket */.
47e0: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f SSL_SESSION_
47f0: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 get0_ticket(sess
4800: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c ion, &ticket, &l
4810: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 en2);. Tcl_Li
4820: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
4830: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
4840: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 r, Tcl_NewByteAr
4850: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 rayObj(ticket, (
4860: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 29 Tcl_Size) len2))
4870: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 ;.. /* Lifeti
4880: 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 me - number of s
4890: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 econds */. Tc
48a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
48b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
48c0: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c mdPtr,..Tcl_NewL
48d0: 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 ongObj((long) SS
48e0: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 L_SESSION_get_ti
48f0: 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 cket_lifetime_hi
4900: 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a nt(session)));..
4910: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
4920: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
4930: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
4940: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
4950: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 EvalCallback(i
4960: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
4970: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 cmdPtr);. Tc
4980: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
4990: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 mdPtr);.. /*
49a0: 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f 77 Return 0 for now
49b0: 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20 68 until session h
49c0: 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70 6c andling is compl
49d0: 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 ete */. retur
49e0: 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d n 0;.}.../*. *--
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a00: 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c -. *. * ALPN Cal
4a40: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 lback for Server
4a50: 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 s and NPN Callba
4a60: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d ck for Clients -
4a70: 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 -. *. *.Perform
4a80: 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 protocol (http/1
4a90: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e .1, h2, h3, etc.
4aa0: 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 ) selection for
4ab0: 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 the. *.incoming
4ac0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c connection. Call
4ad0: 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 ed after Hello a
4ae0: 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61 nd server callba
4af0: 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f cks.. *.Where 'o
4b00: 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64 20 ut' is selected
4b10: 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e protocol and 'in
4b20: 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61 64 ' is the peer ad
4b30: 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 vertised list..
4b40: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
4b50: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 .None. *. * Side
4b60: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c effects:. *.Cal
4b70: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 ls callback (if
4b80: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 defined). *. * R
4b90: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 eturn codes:. *.
4ba0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f SSL_TLSEXT_ERR_O
4bb0: 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c K: ALPN protocol
4bc0: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 selected. The c
4bd0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e onnection contin
4be0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 ues.. *.SSL_TLSE
4bf0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 XT_ERR_ALERT_FAT
4c00: 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f AL: There was no
4c10: 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e overlap between
4c20: 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a the client's. *
4c30: 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 . supplied li
4c40: 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 st and the serve
4c50: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e r configuration.
4c60: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
4c70: 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e will be aborted.
4c80: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
4c90: 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 RR_NOACK: ALPN p
4ca0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 rotocol not sele
4cb0: 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 cted, e.g., beca
4cc0: 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 use no ALPN. *.
4cd0: 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 protocols are
4ce0: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 configured for
4cf0: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e this connection.
4d00: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 The connection
4d10: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a continues.. *. *
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d60: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
4d70: 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 nt.ALPNCallback(
4d80: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 SSL *ssl, const
4d90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a unsigned char **
4da0: 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 out, unsigned ch
4db0: 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e ar *outlen,..con
4dc0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
4dd0: 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 *in, unsigned i
4de0: 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a nt inlen, void *
4df0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 arg) {. State
4e00: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
4e10: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 ate*)arg;. Tc
4e20: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
4e30: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 .= statePtr->int
4e40: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp;. Tcl_Obj
4e50: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e *cmdPtr;. in
4e60: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 t code, res;..
4e70: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
4e80: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 d");.. if (ss
4e90: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 l == NULL || arg
4ea0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
4eb0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 urn SSL_TLSEXT_E
4ec0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a RR_NOACK;. }.
4ed0: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 . /* Select p
4ee0: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 rotocol */. i
4ef0: 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 f (SSL_select_ne
4f00: 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67 6e xt_proto((unsign
4f10: 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74 2c ed char **) out,
4f20: 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 outlen, statePt
4f30: 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 r->protos, state
4f40: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c Ptr->protos_len,
4f50: 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 ..in, inlen) ==
4f60: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f OPENSSL_NPN_NEGO
4f70: 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 TIATED) {../* Ma
4f80: 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 tch found */..re
4f90: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
4fa0: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 RR_OK;. } els
4fb0: 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f e {../* OPENSSL_
4fc0: 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d NPN_NO_OVERLAP =
4fd0: 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 No overlap, so
4fe0: 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 use first item f
4ff0: 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f rom client proto
5000: 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 col list */..res
5010: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 = SSL_TLSEXT_ER
5020: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a R_NOACK;. }..
5030: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
5040: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f ->vcmd == (Tcl_O
5050: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 bj*)NULL) {..ret
5060: 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a urn res;. }..
5070: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f /* Create co
5080: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 mmand to eval wi
5090: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 th fn, chan, dep
50a0: 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 th, cert info li
50b0: 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20 st, status, and
50c0: 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 error args */.
50d0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 cmdPtr = Tcl_D
50e0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 uplicateObj(stat
50f0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 ePtr->vcmd);.
5100: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
5110: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
5120: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 , cmdPtr, Tcl_Ne
5130: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e wStringObj("alpn
5140: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c ", -1));. Tcl
5150: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
5160: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d ement(interp, cm
5170: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e dPtr,.. Tcl_N
5180: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
5190: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 GetChannelName(s
51a0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 tatePtr->self),
51b0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 -1));. Tcl_Li
51c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
51d0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
51e0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
51f0: 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72 20 Obj((const char
5200: 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 20 *) *out, -1));.
5210: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
5220: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
5230: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f rp, cmdPtr, Tcl_
5240: 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 NewBooleanObj(re
5250: 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f s == SSL_TLSEXT_
5260: 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f ERR_OK));.. /
5270: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 * Eval callback
5280: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 command */. T
5290: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
52a0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 cmdPtr);. if
52b0: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c ((code = EvalCal
52c0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 lback(interp, st
52d0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 atePtr, cmdPtr))
52e0: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 > 1) {..res = S
52f0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f SL_TLSEXT_ERR_NO
5300: 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ACK;. } else
5310: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b if (code == 1) {
5320: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
5330: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
5340: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 else {..res = S
5350: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
5360: 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 7d ERT_FATAL;. }
5370: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 . Tcl_DecrRef
5380: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
5390: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d return res;.}
53a0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
53f0: 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f 74 * Advertise Prot
5400: 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66 ocols Callback f
5410: 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f 6c or Next Protocol
5420: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e 50 Negotiation (NP
5430: 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c 6c N) in ServerHell
5440: 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 o --. *. *.calle
5450: 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 72 d when a TLS ser
5460: 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 74 ver needs a list
5470: 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 72 of supported pr
5480: 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 74 otocols for Next
5490: 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 . *.Protocol Neg
54a0: 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 otiation.. *. *
54b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
54c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
54d0: 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 72 cts:. *. * Retur
54e0: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f n codes:. *.SSL_
54f0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e TLSEXT_ERR_OK: N
5500: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 PN protocol sele
5510: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 cted. The connec
5520: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a tion continues..
5530: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 *.SSL_TLSEXT_ER
5540: 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 6f R_NOACK: NPN pro
5550: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 tocol not select
5560: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 ed. The connecti
5570: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a on continues.. *
5580: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 ------. */.#ifde
55d0: 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 63 f USE_NPN.static
55e0: 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b int.NPNCallback
55f0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c (const SSL *ssl,
5600: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
5610: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 char **out, unsi
5620: 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 6e gned int *outlen
5630: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 , void *arg) {.
5640: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
5650: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 tr = (State*)arg
5660: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
5670: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 Called");.. i
5680: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c f (ssl == NULL |
5690: 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b | arg == NULL) {
56a0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 ..return SSL_TLS
56b0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 EXT_ERR_NOACK;.
56c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
56d0: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 protocols list
56e0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
56f0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e Ptr->protos != N
5700: 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 ULL) {..*out = s
5710: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 3b tatePtr->protos;
5720: 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 74 ..*outlen = stat
5730: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e ePtr->protos_len
5740: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
5750: 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f *out = NULL;..*o
5760: 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75 utlen = 0;..retu
5770: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 rn SSL_TLSEXT_ER
5780: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 R_NOACK;. }.
5790: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c return SSL_TL
57a0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 SEXT_ERR_OK;.}.#
57b0: 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d endif.../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5800: 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 . *. * SNI Callb
5810: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 ack for Servers
5820: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d --. *. *.Perform
5830: 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e 49 server-side SNI
5840: 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 hostname select
5850: 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 76 ion after receiv
5860: 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 6f ing SNI extensio
5870: 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 48 n. *.in Client H
5880: 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 74 ello. Called aft
5890: 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 er hello callbac
58a0: 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50 k but before ALP
58b0: 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 N callback.. *.
58c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f * Results:. *.No
58d0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ne. *. * Side ef
58e0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 fects:. *.Calls
58f0: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 callback (if def
5900: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 ined). *. * Retu
5910: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c rn codes:. *.SSL
5920: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 _TLSEXT_ERR_OK:
5930: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 SNI hostname is
5940: 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f accepted. The co
5950: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 nnection continu
5960: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 es.. *.SSL_TLSEX
5970: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 T_ERR_ALERT_FATA
5980: 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 L: SNI hostname
5990: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e is not accepted.
59a0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a The connection.
59b0: 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 *. is aborte
59c0: 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 d. Default for a
59d0: 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 lert is SSL_AD_U
59e0: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 NRECOGNIZED_NAME
59f0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f .. *.SSL_TLSEXT_
5a00: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e ERR_ALERT_WARNIN
5a10: 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 G: SNI hostname
5a20: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c is not accepted,
5a30: 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 warning alert.
5a40: 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 *. sent (not
5a50: 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c 53 supported in TLS
5a60: 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 v1.3). The conne
5a70: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e ction continues.
5a80: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 . *.SSL_TLSEXT_E
5a90: 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f RR_NOACK: SNI ho
5aa0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 stname is not ac
5ab0: 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 cepted and not a
5ac0: 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 cknowledged,. *.
5ad0: 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 e.g. if SNI
5ae0: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e has not been con
5af0: 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e figured. The con
5b00: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 nection continue
5b10: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
5b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
5b60: 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 static int.SNICa
5b70: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c llback(const SSL
5b80: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 *ssl, int *aler
5b90: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a t, void *arg) {.
5ba0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
5bb0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 Ptr = (State*)ar
5bc0: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 g;. Tcl_Inter
5bd0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 p *interp.= stat
5be0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 ePtr->interp;.
5bf0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
5c00: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c r;. int code,
5c10: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 res;. const
5c20: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 char *servername
5c30: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 = NULL;.. dp
5c40: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
5c50: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d .. if (ssl ==
5c60: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 NULL || arg ==
5c70: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
5c80: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e SSL_TLSEXT_ERR_N
5c90: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 OACK;. }..
5ca0: 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 /* Only works f
5cb0: 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 or TLS 1.2 and e
5cc0: 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 arlier */. se
5cd0: 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 rvername = SSL_g
5ce0: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 et_servername(ss
5cf0: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 l, TLSEXT_NAMETY
5d00: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 PE_host_name);.
5d10: 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 if (!serverna
5d20: 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 me || servername
5d30: 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 [0] == '\0') {..
5d40: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 return SSL_TLSEX
5d50: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 T_ERR_NOACK;.
5d60: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 }.. if (stat
5d70: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 ePtr->vcmd == (T
5d80: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a cl_Obj*)NULL) {.
5d90: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 .return SSL_TLSE
5da0: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
5db0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
5dc0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 command to eval
5dd0: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 with fn, chan, a
5de0: 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61 nd server name a
5df0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 rgs */. cmdPt
5e00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 r = Tcl_Duplicat
5e10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 eObj(statePtr->v
5e20: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 cmd);. Tcl_Li
5e30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
5e40: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 nt(interp, cmdPt
5e50: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
5e60: 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b Obj("sni", -1));
5e70: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
5e80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
5e90: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 terp, cmdPtr,..
5ea0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 Tcl_NewString
5eb0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e Obj(Tcl_GetChann
5ec0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d elName(statePtr-
5ed0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 >self), -1));.
5ee0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
5ef0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
5f00: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e p, cmdPtr, Tcl_N
5f10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 ewStringObj(serv
5f20: 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a ername , -1));..
5f30: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c /* Eval call
5f40: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a back command */.
5f50: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
5f60: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 ount(cmdPtr);.
5f70: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 if ((code = Ev
5f80: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 alCallback(inter
5f90: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 p, statePtr, cmd
5fa0: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 Ptr)) > 1) {..re
5fb0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 s = SSL_TLSEXT_E
5fc0: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 RR_ALERT_WARNING
5fd0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
5fe0: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f AD_UNRECOGNIZED_
5ff0: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 NAME; /* Not sup
6000: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e ported by TLS 1.
6010: 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 3 */. } else
6020: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b if (code == 1) {
6030: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 ..res = SSL_TLSE
6040: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d XT_ERR_OK;. }
6050: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 else {..res = S
6060: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c SL_TLSEXT_ERR_AL
6070: 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 ERT_FATAL;..*ale
6080: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 rt = SSL_AD_UNRE
6090: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f COGNIZED_NAME; /
60a0: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 * Not supported
60b0: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 by TLS 1.3 */.
60c0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
60d0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
60e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
60f0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 --------------.
6140: 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f *. * ClientHello
6150: 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 Handshake Callb
6160: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 ack for Servers
6170: 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 --. *. *.Used by
6180: 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 server to exami
6190: 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 ne the server na
61a0: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 me indication (S
61b0: 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a NI) extension. *
61c0: 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 .provided by the
61d0: 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 client in order
61e0: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 to select an ap
61f0: 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 propriate certif
6200: 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 icate to. *.pres
6210: 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 ent, and make ot
6220: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f her configuratio
6230: 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 n adjustments re
6240: 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 levant to that s
6250: 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e erver. *.name an
6260: 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 d its configurat
6270: 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 ion. This includ
6280: 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 es swapping out
6290: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 the associated.
62a0: 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 *.SSL_CTX pointe
62b0: 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 r, modifying the
62c0: 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f server's list o
62d0: 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 f permitted TLS
62e0: 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 versions,. *.cha
62f0: 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 nging the server
6300: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 's cipher list i
6310: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 n response to th
6320: 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 e client's ciphe
6330: 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 r list, etc.. *.
6340: 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e Called before SN
6350: 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 I and ALPN callb
6360: 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 acks.. *. * Resu
6370: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a lts:. *.None. *.
6380: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
6390: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 . *.Calls callba
63a0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a ck (if defined).
63b0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 *. * Return cod
63c0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e es:. *.SSL_CLIEN
63d0: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 T_HELLO_RETRY: s
63e0: 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 uspend the hands
63f0: 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 hake, and the ha
6400: 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e ndshake function
6410: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d will return imm
6420: 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f ediately. *.SSL_
6430: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 CLIENT_HELLO_ERR
6440: 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 OR: failure, ter
6450: 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f minate connectio
6460: 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 n. Set alert to
6470: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 error code.. *.S
6480: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f SL_CLIENT_HELLO_
6490: 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 SUCCESS: success
64a0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
64f0: 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 atic int.HelloCa
6500: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c llback(SSL *ssl,
6510: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 int *alert, voi
6520: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 d *arg) {. St
6530: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
6540: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 (State*)arg;.
6550: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
6560: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e erp.= statePtr->
6570: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
6580: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 Obj *cmdPtr;.
6590: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a int code, res;.
65a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
65b0: 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 servername;.
65c0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
65d0: 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 har *p;. size
65e0: 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e _t len, remainin
65f0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 g;.. dprintf(
6600: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
6610: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 if (statePtr->vc
6620: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 md == (Tcl_Obj*)
6630: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
6640: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6650: 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 _SUCCESS;. }
6660: 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 else if (ssl ==
6670: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c (const SSL *)NUL
6680: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 L || arg == (voi
6690: 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 d *)NULL) {..ret
66a0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
66b0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
66c0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 }.. /* Get na
66d0: 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 mes */. if (!
66e0: 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f SSL_client_hello
66f0: 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 _get0_ext(ssl, T
6700: 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 LSEXT_TYPE_serve
6710: 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d r_name, &p, &rem
6720: 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 aining) || remai
6730: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 ning <= 2) {..*a
6740: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c lert = SSL_R_SSL
6750: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c V3_ALERT_ILLEGAL
6760: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 _PARAMETER;..ret
6770: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 urn SSL_CLIENT_H
6780: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 ELLO_ERROR;.
6790: 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 }.. /* Extrac
67a0: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 t the length of
67b0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 the supplied lis
67c0: 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 t of names. */.
67d0: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 len = (*(p++)
67e0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 << 8);. len
67f0: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 += *(p++);. i
6800: 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 f (len + 2 != re
6810: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 maining) {..*ale
6820: 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 rt = SSL_R_SSLV3
6830: 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 _ALERT_ILLEGAL_P
6840: 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 ARAMETER;..retur
6850: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c n SSL_CLIENT_HEL
6860: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a LO_ERROR;. }.
6870: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 remaining =
6880: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 len;.. /* The
6890: 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 list in practic
68a0: 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e e only has a sin
68b0: 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 gle element, so
68c0: 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 we only consider
68d0: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 the first one.
68e0: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 */. if (remai
68f0: 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b ning == 0 || *p+
6900: 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 + != TLSEXT_NAME
6910: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 TYPE_host_name)
6920: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f {..*alert = SSL_
6930: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
6940: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 TERNAL_ERROR;..r
6950: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 eturn SSL_CLIENT
6960: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 _HELLO_ERROR;.
6970: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e }. remainin
6980: 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 g--;.. /* Now
6990: 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 we can finally
69a0: 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 pull out the byt
69b0: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 e array with the
69c0: 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 actual hostname
69d0: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d . */. if (rem
69e0: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 aining <= 2) {..
69f0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 *alert = SSL_R_T
6a00: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 LSV1_ALERT_INTER
6a10: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 NAL_ERROR;..retu
6a20: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 rn SSL_CLIENT_HE
6a30: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d LLO_ERROR;. }
6a40: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b . len = (*(p+
6a50: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 +) << 8);. le
6a60: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 n += *(p++);.
6a70: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 if (len + 2 > r
6a80: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c emaining) {..*al
6a90: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 ert = SSL_R_TLSV
6aa0: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 1_ALERT_INTERNAL
6ab0: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 _ERROR;..return
6ac0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f SSL_CLIENT_HELLO
6ad0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
6ae0: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 remaining = le
6af0: 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d n;. servernam
6b00: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 e = (const char
6b10: 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 *)p;.. /* Cre
6b20: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 ate command to e
6b30: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 val with fn, cha
6b40: 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 n, and server na
6b50: 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 me args */. c
6b60: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c mdPtr = Tcl_Dupl
6b70: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 icateObj(statePt
6b80: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 r->vcmd);. Tc
6b90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
6ba0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 lement(interp, c
6bb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 mdPtr, Tcl_NewSt
6bc0: 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c ringObj("hello",
6bd0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
6be0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
6bf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 ent(interp, cmdP
6c00: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 tr,.. Tcl_New
6c10: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 StringObj(Tcl_Ge
6c20: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
6c30: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 tePtr->self), -1
6c40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 ));. Tcl_List
6c50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
6c60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c (interp, cmdPtr,
6c70: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
6c80: 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 54 j(servername, (T
6c90: 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b 0a cl_Size) len));.
6ca0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c . /* Eval cal
6cb0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f lback command */
6cc0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
6cd0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 Count(cmdPtr);.
6ce0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 if ((code = E
6cf0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 valCallback(inte
6d00: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d rp, statePtr, cm
6d10: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 dPtr)) > 1) {..r
6d20: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f es = SSL_CLIENT_
6d30: 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 HELLO_RETRY;..*a
6d40: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 lert = SSL_R_TLS
6d50: 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 V1_ALERT_USER_CA
6d60: 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 NCELLED;. } e
6d70: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 lse if (code ==
6d80: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 1) {..res = SSL_
6d90: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 CLIENT_HELLO_SUC
6da0: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 CESS;. } else
6db0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c {..res = SSL_CL
6dc0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 IENT_HELLO_ERROR
6dd0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f ;..*alert = SSL_
6de0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e R_TLSV1_ALERT_IN
6df0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 TERNAL_ERROR;.
6e00: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 }. Tcl_Decr
6e10: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 RefCount(cmdPtr)
6e20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
6e30: 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ;.}.../*********
6e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 ***********/./*
6e50: 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20 Commands
6e60: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./***********
6e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
6e80: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ec0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 ----. *. * Hands
6ed0: 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a hakeObjCmd --. *
6ee0: 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 . *.This command
6ef0: 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 is used to veri
6f00: 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 fy whether the h
6f10: 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 andshake is comp
6f20: 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a lete. *.or not..
6f30: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
6f40: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
6f50: 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 result. 1 means
6f60: 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c handshake compl
6f70: 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e ete, 0 means pen
6f80: 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 ding.. *. * Side
6f90: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
6fa0: 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 force SSL negot
6fb0: 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 iation to take p
6fc0: 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d lace.. *. *-----
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
7010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 */.static int Ha
7020: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c ndshakeObjCmd(Cl
7030: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
7040: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
7050: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
7060: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
7070: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
7080: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
7090: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 ; /* The
70a0: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 channel to set a
70b0: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 mode on. */.
70c0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
70d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 ; /* clie
70e0: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c nt state for ssl
70f0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 socket */. c
7100: 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 onst char *errSt
7110: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e r = NULL;. in
7120: 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 t ret = 1;. i
7130: 6e 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 nt err = 0;.
7140: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 (void) clientDat
7150: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 a;.. dprintf(
7160: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
7170: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b if (objc != 2) {
7180: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
7190: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
71a0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a jv, "channel");.
71b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
71c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 R;. }.. ER
71d0: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
71e0: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c .. chan = Tcl
71f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
7200: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e rp, Tcl_GetStrin
7210: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c g(objv[1]), NULL
7220: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 );. if (chan
7230: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
7240: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
7250: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7260: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 }.. /* Make s
7270: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f ure to operate o
7280: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 n the topmost ch
7290: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
72a0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 n = Tcl_GetTopCh
72b0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 annel(chan);.
72c0: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
72d0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
72e0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
72f0: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e ()) {..Tcl_Appen
7300: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
7310: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
7320: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
7330: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 Name(chan),..
7340: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 "\": not a TLS
7350: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 channel", (char
7360: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 *) NULL);..Tcl_S
7370: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
7380: 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 rp, "TLS", "HAND
7390: 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c SHAKE", "CHANNEL
73a0: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
73b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
73c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
73d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 . }. state
73e0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 Ptr = (State *)T
73f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
7400: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
7410: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
7420: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 alling Tls_WaitF
7430: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 orConnect");.
7440: 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 ret = Tls_WaitF
7450: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 orConnect(stateP
7460: 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 tr, &err, 1);.
7470: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 dprintf("Tls_W
7480: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 aitForConnect re
7490: 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 turned: %i", ret
74a0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 );.. if (ret
74b0: 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 < 0 && ((statePt
74c0: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
74d0: 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 CL_ASYNC) && (er
74e0: 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b r == EAGAIN))) {
74f0: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 ..dprintf("Async
7500: 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 set and err = E
7510: 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 AGAIN");..ret =
7520: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 0;. } else if
7530: 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f (ret < 0) {..lo
7540: 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 ng result;..errS
7550: 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 tr = statePtr->e
7560: 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 rr;..Tcl_ResetRe
7570: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 sult(interp);..T
7580: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 cl_SetErrno(err)
7590: 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 ;...if (!errStr
75a0: 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 || (*errStr == 0
75b0: 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 )) {.. errStr
75c0: 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f = Tcl_PosixErro
75d0: 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 r(interp);..}...
75e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
75f0: 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 (interp, "handsh
7600: 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 ake failed: ", e
7610: 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 rrStr, (char *)
7620: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 NULL);..if ((res
7630: 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 ult = SSL_get_ve
7640: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
7650: 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 ePtr->ssl)) != X
7660: 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 509_V_OK) {..
7670: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
7680: 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 t(interp, " due
7690: 74 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 to \"", X509_ver
76a0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 ify_cert_error_s
76b0: 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 tring(result), "
76c0: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 \"", (char *) NU
76d0: 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 LL);..}..Tcl_Set
76e0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
76f0: 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 , "TLS", "HANDSH
7700: 41 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 AKE", "FAILED",
7710: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
7720: 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e .dprintf("Return
7730: 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 ing TCL_ERROR wi
7740: 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 th handshake fai
7750: 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 led: %s", errStr
7760: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7770: 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 RROR;. } else
7780: 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 {..if (err != 0
7790: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
77a0: 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 ("Got an error w
77b0: 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 ith a completed
77c0: 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d handshake: err =
77d0: 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 %i", err);..}..
77e0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a ret = 1;. }..
77f0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
7800: 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 urning TCL_OK wi
7810: 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c th data \"%i\"",
7820: 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 ret);. Tcl_S
7830: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
7840: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 rp, Tcl_NewIntOb
7850: 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 j(ret));. ret
7860: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 urn TCL_OK;.}..s
7870: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
7880: 20 2a 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20 5b *command_opts [
7890: 5d 20 3d 20 7b 0a 20 20 20 20 22 2d 61 6c 70 6e ] = {. "-alpn
78a0: 22 2c 20 22 2d 63 61 64 69 72 22 2c 20 22 2d 63 ", "-cadir", "-c
78b0: 61 66 69 6c 65 22 2c 20 22 2d 63 65 72 74 22 2c afile", "-cert",
78c0: 20 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 22 2d "-certfile", "-
78d0: 63 69 70 68 65 72 22 2c 20 22 2d 63 69 70 68 65 cipher", "-ciphe
78e0: 72 73 22 2c 20 22 2d 63 69 70 68 65 72 73 75 69 rs", "-ciphersui
78f0: 74 65 73 22 2c 0a 20 20 20 20 22 2d 63 6f 6d 6d tes",. "-comm
7900: 61 6e 64 22 2c 20 22 2d 64 68 70 61 72 61 6d 73 and", "-dhparams
7910: 22 2c 20 22 2d 6b 65 79 22 2c 20 22 2d 6b 65 79 ", "-key", "-key
7920: 66 69 6c 65 22 2c 20 22 2d 6d 6f 64 65 6c 22 2c file", "-model",
7930: 20 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 22 2d "-password", "-
7940: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c post_handshake",
7950: 0a 20 20 20 20 22 2d 72 65 71 75 65 73 74 22 2c . "-request",
7960: 20 22 2d 72 65 71 75 69 72 65 22 2c 20 22 2d 73 "-require", "-s
7970: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 ecurity_level",
7980: 22 2d 73 65 72 76 65 72 22 2c 20 22 2d 73 65 72 "-server", "-ser
7990: 76 65 72 6e 61 6d 65 22 2c 20 22 2d 73 65 73 73 vername", "-sess
79a0: 69 6f 6e 5f 69 64 22 2c 20 22 2d 73 73 6c 32 22 ion_id", "-ssl2"
79b0: 2c 0a 20 20 20 20 22 2d 73 73 6c 33 22 2c 20 22 ,. "-ssl3", "
79c0: 2d 74 6c 73 31 22 2c 20 22 2d 74 6c 73 31 2e 31 -tls1", "-tls1.1
79d0: 22 2c 20 22 2d 74 6c 73 31 2e 32 22 2c 20 22 2d ", "-tls1.2", "-
79e0: 74 6c 73 31 2e 33 22 2c 20 22 2d 76 61 6c 69 64 tls1.3", "-valid
79f0: 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 22 2d 76 atecommand", "-v
7a00: 63 6d 64 22 2c 20 4e 55 4c 4c 7d 3b 0a 0a 65 6e cmd", NULL};..en
7a10: 75 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 um _command_opts
7a20: 20 7b 0a 20 20 20 20 5f 6f 70 74 5f 61 6c 70 6e {. _opt_alpn
7a30: 2c 20 5f 6f 70 74 5f 63 61 64 69 72 2c 20 5f 6f , _opt_cadir, _o
7a40: 70 74 5f 63 61 66 69 6c 65 2c 20 5f 6f 70 74 5f pt_cafile, _opt_
7a50: 63 65 72 74 2c 20 5f 6f 70 74 5f 63 65 72 74 66 cert, _opt_certf
7a60: 69 6c 65 2c 20 5f 6f 70 74 5f 63 69 70 68 65 72 ile, _opt_cipher
7a70: 2c 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 2c 0a , _opt_ciphers,.
7a80: 20 20 20 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 _opt_ciphers
7a90: 75 69 74 65 2c 20 5f 6f 70 74 5f 63 6d 64 2c 20 uite, _opt_cmd,
7aa0: 5f 6f 70 74 5f 64 68 70 61 72 61 6d 73 2c 20 5f _opt_dhparams, _
7ab0: 6f 70 74 5f 6b 65 79 2c 20 5f 6f 70 74 5f 6b 65 opt_key, _opt_ke
7ac0: 79 66 69 6c 65 2c 20 5f 6f 70 74 5f 6d 6f 64 65 yfile, _opt_mode
7ad0: 6c 2c 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72 64 l, _opt_password
7ae0: 2c 0a 20 20 20 20 5f 6f 70 74 5f 68 61 6e 64 73 ,. _opt_hands
7af0: 68 61 6b 65 2c 20 5f 6f 70 74 5f 72 65 71 75 65 hake, _opt_reque
7b00: 73 74 2c 20 5f 6f 70 74 5f 72 65 71 75 69 72 65 st, _opt_require
7b10: 2c 20 5f 6f 70 74 5f 73 65 63 75 72 69 74 79 5f , _opt_security_
7b20: 6c 65 76 65 6c 2c 20 5f 6f 70 74 5f 73 65 72 76 level, _opt_serv
7b30: 65 72 2c 20 5f 6f 70 74 5f 73 65 72 76 65 72 6e er, _opt_servern
7b40: 61 6d 65 2c 0a 20 20 20 20 5f 6f 70 74 5f 73 65 ame,. _opt_se
7b50: 73 73 69 6f 6e 5f 69 64 2c 20 5f 6f 70 74 5f 73 ssion_id, _opt_s
7b60: 73 6c 32 2c 20 5f 6f 70 74 5f 73 73 6c 33 2c 20 sl2, _opt_ssl3,
7b70: 5f 6f 70 74 5f 74 6c 73 31 2c 20 5f 6f 70 74 5f _opt_tls1, _opt_
7b80: 74 6c 73 31 31 2c 20 5f 6f 70 74 5f 74 6c 73 31 tls11, _opt_tls1
7b90: 32 2c 20 5f 6f 70 74 5f 74 6c 73 31 33 2c 0a 20 2, _opt_tls13,.
7ba0: 20 20 20 5f 6f 70 74 5f 76 61 6c 69 64 61 74 65 _opt_validate
7bb0: 2c 20 5f 6f 70 74 5f 76 63 6d 64 0a 7d 3b 0a 0a , _opt_vcmd.};..
7bc0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 --------. *. * I
7c10: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 mportObjCmd --.
7c20: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
7c30: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ure is invoked t
7c40: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 o process the "s
7c50: 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 sl" command. *.
7c60: 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e *.The ssl comman
7c70: 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 d pushes SSL ove
7c80: 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 r a (newly conne
7c90: 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 cted) tcp socket
7ca0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
7cb0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
7cc0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
7cd0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
7ce0: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 .May modify the
7cf0: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 behavior of an I
7d00: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a O channel.. *. *
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d50: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
7d60: 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 nt.ImportObjCmd(
7d70: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
7d80: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
7d90: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
7da0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
7db0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
7dc0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
7dd0: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e an;../* The chan
7de0: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 nel to set a mod
7df0: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 e on. */. Sta
7e00: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f te *statePtr;../
7e10: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 * client state f
7e20: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f or ssl socket */
7e30: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 . SSL_CTX *ct
7e40: 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 x..= NULL;. T
7e50: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 09 09 cl_Obj *cmdObj..
7e60: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
7e70: 4f 62 6a 20 2a 70 61 73 73 77 64 4f 62 6a 09 09 Obj *passwdObj..
7e80: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
7e90: 4f 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c Obj *vcmd..= NUL
7ea0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 L;. Tcl_DStri
7eb0: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 ng upperChannelT
7ec0: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 ranslation, uppe
7ed0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 rChannelBlocking
7ee0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e , upperChannelEn
7ef0: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 coding, upperCha
7f00: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 nnelEOFChar;.
7f10: 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63 int idx;. Tc
7f20: 6c 5f 53 69 7a 65 20 66 6e 2c 20 6c 65 6e 3b 0a l_Size fn, len;.
7f30: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 09 int flags...
7f40: 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a = TLS_TCL_INIT;.
7f50: 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 int server..
7f60: 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e .= 0;./* is conn
7f70: 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 ection incoming
7f80: 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a or outgoing? */.
7f90: 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c char *keyfil
7fa0: 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 e..= NULL;. c
7fb0: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 09 3d har *certfile..=
7fc0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 NULL;. unsig
7fd0: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 09 09 3d ned char *key..=
7fe0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 NULL;. Tcl_S
7ff0: 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 3d 20 30 ize key_len..= 0
8000: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
8010: 68 61 72 20 2a 63 65 72 74 09 09 3d 20 4e 55 4c har *cert..= NUL
8020: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 L;. Tcl_Size
8030: 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 cert_len..= 0;.
8040: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 char *ciphers
8050: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 ..= NULL;. ch
8060: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 ar *ciphersuites
8070: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 ..= NULL;. ch
8080: 61 72 20 2a 43 41 66 69 6c 65 09 09 3d 20 4e 55 ar *CAfile..= NU
8090: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 LL;. char *CA
80a0: 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 path..= NULL;.
80b0: 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 char *DHparams
80c0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 ..= NULL;. ch
80d0: 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 ar *model...= NU
80e0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 LL;. char *se
80f0: 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c rvername..= NULL
8100: 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f ;./* hostname fo
8110: 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e r Server Name In
8120: 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 dication */.
8130: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
8140: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 har *session_id
8150: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
8160: 53 69 7a 65 20 73 65 73 73 5f 6c 65 6e 09 09 3d Size sess_len..=
8170: 20 30 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 0;. Tcl_Obj
8180: 2a 61 6c 70 6e 4f 62 6a 09 09 3d 20 4e 55 4c 4c *alpnObj..= NULL
8190: 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d ;. int ssl2 =
81a0: 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 0, ssl3 = 0;.
81b0: 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 int tls1 = 1,
81c0: 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 tls1_1 = 1, tls1
81d0: 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d _2 = 1, tls1_3 =
81e0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 1;. int prot
81f0: 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d o = 0, level = -
8200: 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 1;. int verif
8210: 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d y = 0, require =
8220: 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 0, request = 1,
8230: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 post_handshake
8240: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 = 0;. (void)
8250: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
8260: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
8270: 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 ");..#if defined
8280: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 (NO_TLS1) || def
8290: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
82a0: 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d TLS1). tls1 =
82b0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 0;.#endif.#if d
82c0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 efined(NO_TLS1_1
82d0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
82e0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a NSSL_NO_TLS1_1).
82f0: 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a tls1_1 = 0;.
8300: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
8310: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c ed(NO_TLS1_2) ||
8320: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
8330: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 _NO_TLS1_2).
8340: 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 tls1_2 = 0;.#end
8350: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e if.#if defined(N
8360: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 O_TLS1_3) || def
8370: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
8380: 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 TLS1_3). tls1
8390: 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a _3 = 0;.#endif..
83a0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 if (objc < 2
83b0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
83c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
83d0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 objv, "channel
83e0: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 ?options?");..re
83f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
8400: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 }.. ERR_c
8410: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 lear_error();..
8420: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
8430: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
8440: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
8450: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a bjv[1]), NULL);.
8460: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
8470: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
8480: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
8490: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
84a0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
84b0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
84c0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
84d0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
84e0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
84f0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 el(chan);.. f
8500: 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 or (idx = 2; idx
8510: 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 < objc; idx++)
8520: 7b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e {..if (Tcl_GetIn
8530: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
8540: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f p, objv[idx], co
8550: 6d 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74 mmand_opts, "opt
8560: 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d ion", 0, &fn) !=
8570: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 TCL_OK) {..
8580: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8590: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61 ;..}.../* Valida
85a0: 74 65 20 61 72 67 20 68 61 73 20 76 61 6c 75 65 te arg has value
85b0: 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20 3e */..if (++idx >
85c0: 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20 54 = objc) {.. T
85d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
85e0: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c 75 interp, "No valu
85f0: 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22 22 e for option \""
8600: 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 , command_opts[f
8610: 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 n], "\"", (char
8620: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
8630: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8640: 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29 ..}...switch(fn)
8650: 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 61 6c {..case _opt_al
8660: 70 6e 3a 0a 09 20 20 20 20 61 6c 70 6e 4f 62 6a pn:.. alpnObj
8670: 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 = objv[idx];..
8680: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 break;..case
8690: 5f 6f 70 74 5f 63 61 64 69 72 3a 0a 09 20 20 20 _opt_cadir:..
86a0: 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 GET_OPT_STRING(
86b0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 43 41 70 61 74 objv[idx], CApat
86c0: 68 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 h, NULL);.. b
86d0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 reak;..case _opt
86e0: 5f 63 61 66 69 6c 65 3a 0a 09 20 20 20 20 47 45 _cafile:.. GE
86f0: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a T_OPT_STRING(obj
8700: 76 5b 69 64 78 5d 2c 20 43 41 66 69 6c 65 2c 20 v[idx], CAfile,
8710: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 NULL);.. brea
8720: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 65 k;..case _opt_ce
8730: 72 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 rt:.. GET_OPT
8740: 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 _BYTE_ARRAY(objv
8750: 5b 69 64 78 5d 2c 20 63 65 72 74 2c 20 26 63 65 [idx], cert, &ce
8760: 72 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 rt_len);.. br
8770: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
8780: 63 65 72 74 66 69 6c 65 3a 0a 09 20 20 20 20 47 certfile:.. G
8790: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 ET_OPT_STRING(ob
87a0: 6a 76 5b 69 64 78 5d 2c 20 63 65 72 74 66 69 6c jv[idx], certfil
87b0: 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 e, NULL);.. b
87c0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 reak;..case _opt
87d0: 5f 63 69 70 68 65 72 3a 0a 09 63 61 73 65 20 5f _cipher:..case _
87e0: 6f 70 74 5f 63 69 70 68 65 72 73 3a 0a 09 20 20 opt_ciphers:..
87f0: 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 GET_OPT_STRING
8800: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 69 70 68 (objv[idx], ciph
8810: 65 72 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ers, NULL);..
8820: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f break;..case _o
8830: 70 74 5f 63 69 70 68 65 72 73 75 69 74 65 3a 0a pt_ciphersuite:.
8840: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 . GET_OPT_STR
8850: 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 ING(objv[idx], c
8860: 69 70 68 65 72 73 75 69 74 65 73 2c 20 4e 55 4c iphersuites, NUL
8870: 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a L);.. break;.
8880: 09 63 61 73 65 20 5f 6f 70 74 5f 63 6d 64 3a 0a .case _opt_cmd:.
8890: 09 20 20 20 20 63 6d 64 4f 62 6a 20 3d 20 6f 62 . cmdObj = ob
88a0: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 jv[idx];.. br
88b0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
88c0: 64 68 70 61 72 61 6d 73 3a 0a 09 20 20 20 20 47 dhparams:.. G
88d0: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 ET_OPT_STRING(ob
88e0: 6a 76 5b 69 64 78 5d 2c 20 44 48 70 61 72 61 6d jv[idx], DHparam
88f0: 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 s, NULL);.. b
8900: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 reak;..case _opt
8910: 5f 6b 65 79 3a 0a 09 20 20 20 20 47 45 54 5f 4f _key:.. GET_O
8920: 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 PT_BYTE_ARRAY(ob
8930: 6a 76 5b 69 64 78 5d 2c 20 6b 65 79 2c 20 26 6b jv[idx], key, &k
8940: 65 79 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 ey_len);.. br
8950: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
8960: 6b 65 79 66 69 6c 65 3a 0a 09 20 20 20 20 47 45 keyfile:.. GE
8970: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a T_OPT_STRING(obj
8980: 76 5b 69 64 78 5d 2c 20 6b 65 79 66 69 6c 65 2c v[idx], keyfile,
8990: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 NULL);.. bre
89a0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6d ak;..case _opt_m
89b0: 6f 64 65 6c 3a 0a 09 20 20 20 20 47 45 54 5f 4f odel:.. GET_O
89c0: 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 PT_STRING(objv[i
89d0: 64 78 5d 2c 20 6d 6f 64 65 6c 2c 20 4e 55 4c 4c dx], model, NULL
89e0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 );.. break;..
89f0: 63 61 73 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f case _opt_passwo
8a00: 72 64 3a 0a 09 20 20 20 20 70 61 73 73 77 64 4f rd:.. passwdO
8a10: 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a bj = objv[idx];.
8a20: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
8a30: 65 20 5f 6f 70 74 5f 68 61 6e 64 73 68 61 6b 65 e _opt_handshake
8a40: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 :.. GET_OPT_B
8a50: 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 OOL(objv[idx], &
8a60: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b post_handshake);
8a70: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 .. break;..ca
8a80: 73 65 20 5f 6f 70 74 5f 72 65 71 75 65 73 74 3a se _opt_request:
8a90: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f .. GET_OPT_BO
8aa0: 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 72 OL(objv[idx], &r
8ab0: 65 71 75 65 73 74 29 3b 0a 09 20 20 20 20 62 72 equest);.. br
8ac0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
8ad0: 72 65 71 75 69 72 65 3a 0a 09 20 20 20 20 47 45 require:.. GE
8ae0: 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b T_OPT_BOOL(objv[
8af0: 69 64 78 5d 2c 20 26 72 65 71 75 69 72 65 29 3b idx], &require);
8b00: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 .. break;..ca
8b10: 73 65 20 5f 6f 70 74 5f 73 65 63 75 72 69 74 79 se _opt_security
8b20: 5f 6c 65 76 65 6c 3a 0a 09 20 20 20 20 47 45 54 _level:.. GET
8b30: 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 _OPT_INT(objv[id
8b40: 78 5d 2c 20 26 6c 65 76 65 6c 29 3b 0a 09 20 20 x], &level);..
8b50: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f break;..case _
8b60: 6f 70 74 5f 73 65 72 76 65 72 3a 0a 09 20 20 20 opt_server:..
8b70: 20 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 GET_OPT_BOOL(ob
8b80: 6a 76 5b 69 64 78 5d 2c 20 26 73 65 72 76 65 72 jv[idx], &server
8b90: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 );.. break;..
8ba0: 63 61 73 65 20 5f 6f 70 74 5f 73 65 72 76 65 72 case _opt_server
8bb0: 6e 61 6d 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f name:.. GET_O
8bc0: 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 PT_STRING(objv[i
8bd0: 64 78 5d 2c 20 73 65 72 76 65 72 6e 61 6d 65 2c dx], servername,
8be0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 NULL);.. bre
8bf0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 ak;..case _opt_s
8c00: 65 73 73 69 6f 6e 5f 69 64 3a 0a 09 20 20 20 20 ession_id:..
8c10: 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 GET_OPT_BYTE_ARR
8c20: 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 65 AY(objv[idx], se
8c30: 73 73 69 6f 6e 5f 69 64 2c 20 26 73 65 73 73 5f ssion_id, &sess_
8c40: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b len);.. break
8c50: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73 6c ;..case _opt_ssl
8c60: 32 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 2:.. GET_OPT_
8c70: 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 INT(objv[idx], &
8c80: 73 73 6c 32 29 3b 0a 09 20 20 20 20 62 72 65 61 ssl2);.. brea
8c90: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73 k;..case _opt_ss
8ca0: 6c 33 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 l3:.. GET_OPT
8cb0: 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 _INT(objv[idx],
8cc0: 26 73 73 6c 33 29 3b 0a 09 20 20 20 20 62 72 65 &ssl3);.. bre
8cd0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 ak;..case _opt_t
8ce0: 6c 73 31 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 ls1:.. GET_OP
8cf0: 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c T_INT(objv[idx],
8d00: 20 26 74 6c 73 31 29 3b 0a 09 20 20 20 20 62 72 &tls1);.. br
8d10: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
8d20: 74 6c 73 31 31 3a 0a 09 20 20 20 20 47 45 54 5f tls11:.. GET_
8d30: 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 OPT_INT(objv[idx
8d40: 5d 2c 20 26 74 6c 73 31 5f 31 29 3b 0a 09 20 20 ], &tls1_1);..
8d50: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f break;..case _
8d60: 6f 70 74 5f 74 6c 73 31 32 3a 0a 09 20 20 20 20 opt_tls12:..
8d70: 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 GET_OPT_INT(objv
8d80: 5b 69 64 78 5d 2c 20 26 74 6c 73 31 5f 32 29 3b [idx], &tls1_2);
8d90: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 .. break;..ca
8da0: 73 65 20 5f 6f 70 74 5f 74 6c 73 31 33 3a 0a 09 se _opt_tls13:..
8db0: 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 GET_OPT_INT(
8dc0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31 objv[idx], &tls1
8dd0: 5f 33 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b _3);.. break;
8de0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 76 61 6c 69 ..case _opt_vali
8df0: 64 61 74 65 3a 0a 09 63 61 73 65 20 5f 6f 70 74 date:..case _opt
8e00: 5f 76 63 6d 64 3a 0a 09 20 20 20 20 76 63 6d 64 _vcmd:.. vcmd
8e10: 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 = objv[idx];..
8e20: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 break;..}.
8e30: 20 7d 0a 0a 20 20 20 20 69 66 20 28 72 65 71 75 }.. if (requ
8e40: 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 est)..verify |=
8e50: 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e SSL_VERIFY_CLIEN
8e60: 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 T_ONCE | SSL_VER
8e70: 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 IFY_PEER;. if
8e80: 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 (request && req
8e90: 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 uire).verify |=
8ea0: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f SSL_VERIFY_FAIL_
8eb0: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b IF_NO_PEER_CERT;
8ec0: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 . if (request
8ed0: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 && post_handsha
8ee0: 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 ke).verify |= SS
8ef0: 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 L_VERIFY_POST_HA
8f00: 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 NDSHAKE;. if
8f10: 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 (verify == 0)..v
8f20: 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 erify = SSL_VERI
8f30: 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 FY_NONE;.. pr
8f40: 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 oto |= (ssl2 ? T
8f50: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 LS_PROTO_SSL2 :
8f60: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
8f70: 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f (ssl3 ? TLS_PRO
8f80: 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 TO_SSL3 : 0);.
8f90: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 proto |= (tls1
8fa0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 ? TLS_PROTO_TLS
8fb0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 1 : 0);. prot
8fc0: 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 o |= (tls1_1 ? T
8fd0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 LS_PROTO_TLS1_1
8fe0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 : 0);. proto
8ff0: 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 |= (tls1_2 ? TLS
9000: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 _PROTO_TLS1_2 :
9010: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 0);. proto |=
9020: 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 (tls1_3 ? TLS_P
9030: 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 ROTO_TLS1_3 : 0)
9040: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 ;.. /* reset
9050: 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b to NULL if blank
9060: 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 string provided
9070: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 */. if (cert
9080: 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 && !*cert)..
9090: 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 cert.
90a0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 = NULL;. if
90b0: 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 (key && !*key).
90c0: 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 . key.
90d0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
90e0: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 if (certfile &&
90f0: 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 !*certfile)
9100: 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 certfile.=
9110: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 NULL;. if (ke
9120: 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 yfile && !*keyfi
9130: 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 le)..keyfile.
9140: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 = NULL;.
9150: 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 if (ciphers &&
9160: 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 !*ciphers).
9170: 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 ciphers.
9180: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
9190: 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 f (ciphersuites
91a0: 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 && !*ciphersuite
91b0: 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 s) ciphersuites
91c0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 = NULL;. i
91d0: 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 f (CAfile && !*C
91e0: 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 Afile). C
91f0: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 Afile. =
9200: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 NULL;. if (CA
9210: 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68 path && !*CApath
9220: 29 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68 ). CApath
9230: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b . = NULL;
9240: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d . if (DHparam
9250: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 s && !*DHparams)
9260: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d . DHparam
9270: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b s = NULL;
9280: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c .. /* new SSL
9290: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 state */. st
92a0: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 atePtr..= (State
92b0: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 *) ckalloc((uns
92c0: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 igned) sizeof(St
92d0: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 ate));. memse
92e0: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 t(statePtr, 0, s
92f0: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a izeof(State));..
9300: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c statePtr->fl
9310: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 ags.= flags;.
9320: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
9330: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 p.= interp;.
9340: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 statePtr->vflags
9350: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 .= verify;. s
9360: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 tatePtr->err.= "
9370: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 ";.. /* alloc
9380: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 ate script */.
9390: 20 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 3d 20 if (cmdObj !=
93a0: 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f 69 64 29 20 NULL) {..(void)
93b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
93c0: 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 26 6c 65 mObj(cmdObj, &le
93d0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a n);..if (len) {.
93e0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 . statePtr->c
93f0: 61 6c 6c 62 61 63 6b 20 3d 20 63 6d 64 4f 62 6a allback = cmdObj
9400: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 ;.. Tcl_IncrR
9410: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
9420: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a ->callback);..}.
9430: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c }.. /* al
9440: 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 locate password
9450: 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 */. if (passw
9460: 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a dObj != NULL) {.
9470: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 .(void) Tcl_GetS
9480: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 tringFromObj(pas
9490: 73 77 64 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a 09 swdObj, &len);..
94a0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 if (len) {..
94b0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f statePtr->passwo
94c0: 72 64 20 3d 20 70 61 73 73 77 64 4f 62 6a 3b 0a rd = passwdObj;.
94d0: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
94e0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e Count(statePtr->
94f0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 password);..}.
9500: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f }.. /* allo
9510: 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f cate validate co
9520: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 mmand */. if
9530: 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 (vcmd) {..(void)
9540: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
9550: 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e omObj(vcmd, &len
9560: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 );..if (len) {..
9570: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63 statePtr->vc
9580: 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 md = vcmd;..
9590: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
95a0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 (statePtr->vcmd)
95b0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
95c0: 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c if (model != NUL
95d0: 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a L) {..int mode;.
95e0: 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 ./* Get the "mod
95f0: 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 el" context */..
9600: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
9610: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f annel(interp, mo
9620: 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 del, &mode);..if
9630: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
9640: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
9650: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
9660: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
9670: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
9680: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
9690: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 .. * Make sure t
96a0: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
96b0: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
96c0: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 .. */..chan = Tc
96d0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
96e0: 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f chan);..if (Tcl_
96f0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
9700: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e han) != Tls_Chan
9710: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 nelType()) {..
9720: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
9730: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
9740: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
9750: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
9760: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f chan),..."\": no
9770: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
9780: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
9790: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
97a0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
97b0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
97c0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
97d0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
97e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f NULL);.. Tls_
97f0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
9800: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 atePtr);.. re
9810: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9820: 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 .}..ctx = ((Stat
9830: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e e *)Tcl_GetChann
9840: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 elInstanceData(c
9850: 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 han))->ctx;.
9860: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 } else {..if ((c
9870: 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 tx = CTX_Init(st
9880: 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 atePtr, server,
9890: 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 proto, keyfile,
98a0: 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 certfile, key, c
98b0: 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c ert, (int) key_l
98c0: 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 en,.. (int) c
98d0: 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c ert_len, CApath,
98e0: 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 CAfile, ciphers
98f0: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 , ciphersuites,
9900: 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 level, DHparams)
9910: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ) == NULL) {..
9920: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 Tls_Free((char
9930: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 *) statePtr);..
9940: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
9950: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
9960: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 statePtr->ct
9970: 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a x = ctx;.. /*
9980: 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 . * We need
9990: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 to make sure tha
99a0: 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f t the channel wo
99b0: 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 rks in binary (f
99c0: 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e or the. * en
99d0: 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 cryption not to
99e0: 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a get goofed up)..
99f0: 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 * We only w
9a00: 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 ant to adjust th
9a10: 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 e buffering in p
9a20: 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 re-v2 channels,
9a30: 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 where. * eac
9a40: 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 h channel in the
9a50: 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 stack maintaine
9a60: 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 d its own buffer
9a70: 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 s.. */. T
9a80: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 cl_DStringInit(&
9a90: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e upperChannelTran
9aa0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 slation);. Tc
9ab0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 l_DStringInit(&u
9ac0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
9ad0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ing);. Tcl_DS
9ae0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 tringInit(&upper
9af0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b ChannelEOFChar);
9b00: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
9b10: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e Init(&upperChann
9b20: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 elEncoding);.
9b30: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
9b40: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
9b50: 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 an, "-eofchar",
9b60: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 &upperChannelEOF
9b70: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 Char);. Tcl_G
9b80: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 etChannelOption(
9b90: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d interp, chan, "-
9ba0: 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 encoding", &uppe
9bb0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 rChannelEncoding
9bc0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 );. Tcl_GetCh
9bd0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
9be0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
9bf0: 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 slation", &upper
9c00: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 ChannelTranslati
9c10: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 on);. Tcl_Get
9c20: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
9c30: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c terp, chan, "-bl
9c40: 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 ocking", &upperC
9c50: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b hannelBlocking);
9c60: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
9c70: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
9c80: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c , chan, "-transl
9c90: 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 ation", "binary"
9ca0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 );. Tcl_SetCh
9cb0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
9cc0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 rp, chan, "-bloc
9cd0: 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a king", "true");.
9ce0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e dprintf("Con
9cf0: 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e suming Tcl chann
9d00: 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 el %s", Tcl_GetC
9d10: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
9d20: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d );. statePtr-
9d30: 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 >self = Tcl_Stac
9d40: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
9d50: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tls_ChannelType
9d60: 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 (), (ClientData)
9d70: 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 43 4c statePtr,..(TCL
9d80: 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f _READABLE | TCL_
9d90: 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 WRITABLE), chan)
9da0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 ;. dprintf("C
9db0: 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e reated channel n
9dc0: 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 amed %s", Tcl_Ge
9dd0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 tChannelName(sta
9de0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 tePtr->self));.
9df0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
9e00: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 >self == (Tcl_Ch
9e10: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
9e20: 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 /*.. * No use of
9e30: 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 Tcl_EventuallyF
9e40: 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 ree because no p
9e50: 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 ossible Tcl_Pres
9e60: 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f erve... */..Tls_
9e70: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 Free((char *) st
9e80: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
9e90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
9ea0: 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 }.. Tcl_SetCh
9eb0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
9ec0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 rp, statePtr->se
9ed0: 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f lf, "-translatio
9ee0: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 n", Tcl_DStringV
9ef0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e alue(&upperChann
9f00: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b elTranslation));
9f10: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
9f20: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
9f30: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
9f40: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 , "-encoding", T
9f50: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
9f60: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 &upperChannelEnc
9f70: 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c oding));. Tcl
9f80: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
9f90: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
9fa0: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 tr->self, "-eofc
9fb0: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e har", Tcl_DStrin
9fc0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 gValue(&upperCha
9fd0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 nnelEOFChar));.
9fe0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
9ff0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
a000: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 statePtr->self,
a010: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c "-blocking", Tcl
a020: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 _DStringValue(&u
a030: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b pperChannelBlock
a040: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44 ing));. Tcl_D
a050: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 StringFree(&uppe
a060: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 rChannelTranslat
a070: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 ion);. Tcl_DS
a080: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 tringFree(&upper
a090: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 ChannelEncoding)
a0a0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
a0b0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e gFree(&upperChan
a0c0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 nelEOFChar);.
a0d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
a0e0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c (&upperChannelBl
a0f0: 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a ocking);.. /*
a100: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 . * SSL Init
a110: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 ialization.
a120: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
a130: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 >ssl = SSL_new(s
a140: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 tatePtr->ctx);.
a150: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 if (!statePtr
a160: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c ->ssl) {../* SSL
a170: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a library error *
a180: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 /..Tcl_AppendRes
a190: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 ult(interp, "cou
a1a0: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 ldn't construct
a1b0: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 ssl session: ",
a1c0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
a1d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
a1e0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 ;.. Tcl_SetEr
a1f0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
a200: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c "TLS", "IMPORT",
a210: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 "INIT", "FAILED
a220: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
a230: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 );..Tls_Free((ch
a240: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b ar *) statePtr);
a250: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
a260: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
a270: 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 * Set host serve
a280: 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 r name */. if
a290: 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a (servername) {.
a2a0: 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 ./* Sets the ser
a2b0: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 ver name indicat
a2c0: 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 ion (SNI) in Cli
a2d0: 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 entHello extensi
a2e0: 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 on */../* Per RF
a2f0: 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 C 6066, hostname
a300: 20 69 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f is a ASCII enco
a310: 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 ded string, thou
a320: 67 68 20 52 46 43 20 34 33 36 36 20 73 61 79 73 gh RFC 4366 says
a330: 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 UTF-8. */..if (
a340: 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f !SSL_set_tlsext_
a350: 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 host_name(stateP
a360: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e tr->ssl, servern
a370: 61 6d 65 29 20 26 26 20 72 65 71 75 69 72 65 29 ame) && require)
a380: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
a390: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
a3a0: 20 22 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73 "Set SNI extens
a3b0: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 ion failed: ", G
a3c0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
a3d0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
a3e0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
a3f0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
a400: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 TLS", "IMPORT",
a410: 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c "SNI", "FAILED",
a420: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
a430: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 .. Tls_Free((
a440: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 char *) statePtr
a450: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
a460: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
a470: 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 * Set hostname f
a480: 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 or peer certific
a490: 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 ate hostname ver
a4a0: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 ification in cli
a4b0: 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 ents... Don't
a4c0: 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 use SSL_set1_hos
a4d0: 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c t since it has l
a4e0: 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 imitations. */..
a4f0: 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f if (!SSL_add1_ho
a500: 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c st(statePtr->ssl
a510: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b , servername)) {
a520: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
a530: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
a540: 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 Set DNS hostname
a550: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f failed: ", GET_
a560: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 ERR_REASON(), (c
a570: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 har *) NULL);..
a580: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 Tcl_SetErrorC
a590: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
a5a0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f ", "IMPORT", "HO
a5b0: 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 STNAME", "FAILED
a5c0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
a5d0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 );.. Tls_Free
a5e0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
a5f0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e tr);.. return
a600: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
a610: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 }.. /* Res
a620: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a ume session id *
a630: 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f /. if (sessio
a640: 6e 5f 69 64 20 26 26 20 73 65 73 73 5f 6c 65 6e n_id && sess_len
a650: 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f <= SSL_MAX_SID_
a660: 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f CTX_LENGTH) {../
a670: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f * SSL_set_sessio
a680: 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c n() */..if (!SSL
a690: 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 _SESSION_set1_id
a6a0: 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 _context(SSL_get
a6b0: 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 _session(statePt
a6c0: 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e r->ssl), session
a6d0: 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 _id, (unsigned i
a6e0: 6e 74 29 20 73 65 73 73 5f 6c 65 6e 29 29 20 7b nt) sess_len)) {
a6f0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
a700: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
a710: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 Resume session f
a720: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
a730: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
a740: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
a750: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
a760: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c e(interp, "TLS",
a770: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 "IMPORT", "SESS
a780: 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 ION", "FAILED",
a790: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
a7a0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 . Tls_Free((c
a7b0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 har *) statePtr)
a7c0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
a7d0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
a7e0: 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 }.. /* Enable
a7f0: 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 Application-Lay
a800: 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f er Protocol Nego
a810: 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 tiation. Example
a820: 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c s are: http/1.0,
a830: 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 ..http/1.1, h2,
a840: 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 h3, ftp, imap, p
a850: 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 op3, xmpp-client
a860: 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d , xmpp-server, m
a870: 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a qtt, irc, etc. *
a880: 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 4f 62 /. if (alpnOb
a890: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a j != NULL) {../*
a8a0: 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c Convert a TCL l
a8b0: 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f ist into a proto
a8c0: 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 col-list in wire
a8d0: 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 -format */..unsi
a8e0: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f gned char *proto
a8f0: 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 s, *p;..unsigned
a900: 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 int protos_len
a910: 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 = 0;..Tcl_Size c
a920: 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 nt, i;..int j;..
a930: 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a Tcl_Obj **list;.
a940: 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 ..if (Tcl_ListOb
a950: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 jGetElements(int
a960: 65 72 70 2c 20 61 6c 70 6e 4f 62 6a 2c 20 26 63 erp, alpnObj, &c
a970: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 nt, &list) != TC
a980: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 L_OK) {.. Tls
a990: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 _Free((char *) s
a9a0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 tatePtr);.. r
a9b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
a9c0: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 ..}.../* Determi
a9d0: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 ne the memory re
a9e0: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 quired for the p
a9f0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a rotocol-list */.
aa00: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c .for (i = 0; i <
aa10: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 cnt; i++) {..
aa20: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 Tcl_GetStringF
aa30: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 romObj(list[i],
aa40: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 &len);.. if (
aa50: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 len > 255) {...T
aa60: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
aa70: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 interp, "ALPN pr
aa80: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f otocol names too
aa90: 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 long", (char *)
aaa0: 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 NULL);...Tcl_Se
aab0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
aac0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 p, "TLS", "IMPOR
aad0: 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 T", "ALPN", "FAI
aae0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e LED", (char *) N
aaf0: 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 ULL);...Tls_Free
ab00: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 ((char *) stateP
ab10: 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 tr);...return TC
ab20: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
ab30: 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 . protos_len
ab40: 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e += 1 + (int) len
ab50: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 ;..}.../* Build
ab60: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f the complete pro
ab70: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 tocol-list */..p
ab80: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 rotos = ckalloc(
ab90: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a protos_len);../*
aba0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 protocol-lists
abb0: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 consist of 8-bit
abc0: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 length-prefixed
abd0: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a , byte strings *
abe0: 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 /..for (j = 0, p
abf0: 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 = protos; j < c
ac00: 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 nt; j++) {..
ac10: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f char *str = Tcl_
ac20: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
ac30: 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b (list[j], &len);
ac40: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e .. *p++ = (un
ac50: 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e signed char) len
ac60: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c ;.. memcpy(p,
ac70: 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c str, (size_t) l
ac80: 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c en);.. p += l
ac90: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f en;..}.../* SSL_
aca0: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 set_alpn_protos
acb0: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 makes a copy of
acc0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 the protocol-lis
acd0: 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 t */../* Note: T
ace0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 76 his function rev
acf0: 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e erses the return
ad00: 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f value conventio
ad10: 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 n */..if (SSL_se
ad20: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 t_alpn_protos(st
ad30: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f atePtr->ssl, pro
ad40: 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 tos, protos_len)
ad50: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 ) {.. Tcl_App
ad60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
ad70: 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f 74 , "Set ALPN prot
ad80: 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c ocols failed: ",
ad90: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
ada0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
adb0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
adc0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
add0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 "TLS", "IMPORT"
ade0: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 , "ALPN", "FAILE
adf0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c D", (char *) NUL
ae00: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 L);.. Tls_Fre
ae10: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 e((char *) state
ae20: 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 Ptr);.. ckfre
ae30: 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 e(protos);..
ae40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
ae50: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 ;..}.../* Store
ae60: 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a protocols list *
ae70: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f /..statePtr->pro
ae80: 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 tos = protos;..s
ae90: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f tatePtr->protos_
aea0: 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e len = protos_len
aeb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
aec0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 statePtr->protos
aed0: 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 = NULL;..stateP
aee0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d tr->protos_len =
aef0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 0;. }.. /
af00: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c *. * SSL Cal
af10: 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 lbacks. */.
af20: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 SSL_set_app_d
af30: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ata(statePtr->ss
af40: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 l, (void *)state
af50: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 Ptr);./* point b
af60: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a 20 20 ack to us */..
af70: 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 SSL_set_verify
af80: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
af90: 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 verify, VerifyCa
afa0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c llback);. SSL
afb0: 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 _set_info_callba
afc0: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ck(statePtr->ssl
afd0: 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b , InfoCallback);
afe0: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 .. /* Callbac
aff0: 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 k for observing
b000: 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 protocol message
b010: 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 s */.#ifndef OPE
b020: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 NSSL_NO_SSL_TRAC
b030: 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 E. /* void SS
b040: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 L_CTX_set_msg_ca
b050: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 llback_arg(state
b060: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 Ptr->ctx, (void
b070: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 *)statePtr);.
b080: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 void SSL_CTX_se
b090: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 t_msg_callback(s
b0a0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 tatePtr->ctx, Me
b0b0: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 ssageCallback);
b0c0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d */. SSL_set_m
b0d0: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 sg_callback_arg(
b0e0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 statePtr->ssl, (
b0f0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
b100: 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 ;. SSL_set_ms
b110: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 g_callback(state
b120: 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 Ptr->ssl, Messag
b130: 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 eCallback);.#end
b140: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 if.. /* Creat
b150: 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 e Tcl_Channel BI
b160: 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 O Handler */.
b170: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f statePtr->p_bio
b180: 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 .= BIO_new_tcl(s
b190: 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 tatePtr, BIO_NOC
b1a0: 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 LOSE);. state
b1b0: 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e Ptr->bio.= BIO_n
b1c0: 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b ew(BIO_f_ssl());
b1d0: 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 .. if (server
b1e0: 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 ) {../* Server c
b1f0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c allbacks */..SSL
b200: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f _CTX_set_tlsext_
b210: 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 servername_arg(s
b220: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 tatePtr->ctx, (v
b230: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b oid *)statePtr);
b240: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c ..SSL_CTX_set_tl
b250: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f sext_servername_
b260: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 callback(statePt
b270: 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 r->ctx, SNICallb
b280: 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 ack);..SSL_CTX_s
b290: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f et_client_hello_
b2a0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
b2b0: 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c , HelloCallback,
b2c0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
b2d0: 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 r);..if (statePt
b2e0: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c r->protos != NUL
b2f0: 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 L) {.. SSL_CT
b300: 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 X_set_alpn_selec
b310: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 t_cb(statePtr->c
b320: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b tx, ALPNCallback
b330: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 , (void *)stateP
b340: 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f tr);.#ifdef USE_
b350: 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 NPN.. if (tls
b360: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 1_2 == 0 && tls1
b370: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c _3 == 0) {...SSL
b380: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 _CTX_set_next_pr
b390: 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f otos_advertised_
b3a0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 cb(statePtr->ctx
b3b0: 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 , NPNCallback, (
b3c0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 void *)statePtr)
b3d0: 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a ;.. }.#endif.
b3e0: 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 .}.../* Enable s
b3f0: 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 erver to send ce
b400: 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 72 rt request after
b410: 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 handshake (TLS
b420: 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 1.3 only) */../*
b430: 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 A write operati
b440: 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 on must take pla
b450: 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 ce for the Certi
b460: 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 74 ficate Request t
b470: 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f o be.. sent to
b480: 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 the client, thi
b490: 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 s can be done wi
b4a0: 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 th SSL_do_handsh
b4b0: 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 ake(). */..if (r
b4c0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 equest && post_h
b4d0: 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 andshake && tls1
b4e0: 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 _3) {.. SSL_v
b4f0: 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 erify_client_pos
b500: 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 t_handshake(stat
b510: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a ePtr->ssl);..}..
b520: 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 ./* set automati
b530: 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f c curve selectio
b540: 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 n */..SSL_set_ec
b550: 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 dh_auto(statePtr
b560: 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 ->ssl, 1);.../*
b570: 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 Set server mode
b580: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c */..statePtr->fl
b590: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 ags |= TLS_TCL_S
b5a0: 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f ERVER;..SSL_set_
b5b0: 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 accept_state(sta
b5c0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 tePtr->ssl);.
b5d0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c } else {../* Cl
b5e0: 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a ient callbacks *
b5f0: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e /.#ifdef USE_NPN
b600: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e ..if (statePtr->
b610: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 protos != NULL &
b620: 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 & tls1_2 == 0 &&
b630: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a tls1_3 == 0) {.
b640: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
b650: 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 _next_proto_sele
b660: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e ct_cb(statePtr->
b670: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 ctx, ALPNCallbac
b680: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 k, (void *)state
b690: 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a Ptr);..}.#endif.
b6a0: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 ../* Session cac
b6b0: 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 hing */..SSL_CTX
b6c0: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 _set_session_cac
b6d0: 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 he_mode(statePtr
b6e0: 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f ->ctx, SSL_SESS_
b6f0: 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 CACHE_CLIENT | S
b700: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f SL_SESS_CACHE_NO
b710: 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 _INTERNAL_STORE)
b720: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f ;..SSL_CTX_sess_
b730: 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 set_new_cb(state
b740: 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f Ptr->ctx, Sessio
b750: 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a nCallback);.../*
b760: 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e Enable post han
b770: 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 dshake Authentic
b780: 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e ation extension.
b790: 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e TLS 1.3 only, n
b7a0: 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 ot http/2. */..i
b7b0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f f (request && po
b7c0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a st_handshake) {.
b7d0: 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 . SSL_set_pos
b7e0: 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 t_handshake_auth
b7f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 (statePtr->ssl,
b800: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 1);..}.../* Set
b810: 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 client mode */..
b820: 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f SSL_set_connect_
b830: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e state(statePtr->
b840: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ssl);. }.
b850: 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 SSL_set_bio(stat
b860: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 ePtr->ssl, state
b870: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 Ptr->p_bio, stat
b880: 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 ePtr->p_bio);.
b890: 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 BIO_set_ssl(st
b8a0: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 atePtr->bio, sta
b8b0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f tePtr->ssl, BIO_
b8c0: 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f NOCLOSE);.. /
b8d0: 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 *. * End of
b8e0: 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f SSL Init. */
b8f0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
b900: 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c turning %s", Tcl
b910: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
b920: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 statePtr->self))
b930: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 ;. Tcl_SetRes
b940: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 ult(interp, (cha
b950: 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e r *) Tcl_GetChan
b960: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 nelName(statePtr
b970: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c ->self), TCL_VOL
b980: 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 ATILE);.. ret
b990: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
b9a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
b9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b9e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 --------. *. * U
b9f0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d nimportObjCmd --
ba00: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
ba10: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
ba20: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 to remove the t
ba30: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 opmost channel f
ba40: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 ilter.. *. * Res
ba50: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
ba60: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
ba70: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
ba80: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 ts:. *.May modif
ba90: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f y the behavior o
baa0: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e f an IO channel.
bab0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
bac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
baf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
bb00: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 atic int.Unimpor
bb10: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
bb20: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
bb30: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
bb40: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
bb50: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
bb60: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 []) {. Tcl_Ch
bb70: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 annel chan;../*
bb80: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 The channel to s
bb90: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f et a mode on. */
bba0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
bbb0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 ntData;.. dpr
bbc0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
bbd0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
bbe0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
bbf0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
bc00: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
bc10: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
bc20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
bc30: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
bc40: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c tChannel(interp,
bc50: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f Tcl_GetString(o
bc60: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a bjv[1]), NULL);.
bc70: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
bc80: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
bc90: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
bca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
bcb0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
bcc0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
bcd0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
bce0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
bcf0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
bd00: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 el(chan);.. i
bd10: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
bd20: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
bd30: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
bd40: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
bd50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
bd60: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
bd70: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
bd80: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a me(chan),..."\":
bd90: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e not a TLS chann
bda0: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 el", (char *) NU
bdb0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 LL);.. Tcl_Se
bdc0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
bdd0: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 p, "TLS", "UNIMP
bde0: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ORT", "CHANNEL",
bdf0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
be00: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
be10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
be20: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
be30: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c l_UnstackChannel
be40: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d (interp, chan) =
be50: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 = TCL_ERROR) {..
be60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
be70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 ;. }.. ret
be80: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
be90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
bea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
beb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bed0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
bee0: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 TX_Init -- const
bef0: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 ruct a SSL_CTX i
bf00: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 nstance. *. * Re
bf10: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 sults:. *.A vali
bf20: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e d SSL_CTX instan
bf30: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 ce or NULL.. *.
bf40: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
bf50: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 *.constructs SS
bf60: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a L context (CTX).
bf70: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
bf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bf90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bfb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
bfc0: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 tic SSL_CTX *.CT
bfd0: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 X_Init(State *st
bfe0: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 atePtr, int isSe
bff0: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c rver, int proto,
c000: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 char *keyfile,
c010: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a char *certfile,.
c020: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
c030: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 r *key, unsigned
c040: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 char *cert, int
c050: 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 key_len, int ce
c060: 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 rt_len, char *CA
c070: 70 61 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a path,. char *
c080: 43 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 CAfile, char *ci
c090: 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 phers, char *cip
c0a0: 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c hersuites, int l
c0b0: 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 evel, char *DHpa
c0c0: 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f rams) {. Tcl_
c0d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d Interp *interp =
c0e0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 statePtr->inter
c0f0: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a p;. SSL_CTX *
c100: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
c110: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a Tcl_DString ds;.
c120: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c int off = 0,
c130: 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 abort = 0;.
c140: 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 int load_private
c150: 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 _key;. const
c160: 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 SSL_METHOD *meth
c170: 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 od;.. dprintf
c180: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
c190: 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 if (!proto) {..
c1a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
c1b0: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c (interp, "no val
c1c0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 id protocol sele
c1d0: 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 cted", (char *)
c1e0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
c1f0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
c200: 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f /* create SSL co
c210: 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 ntext */.#if OPE
c220: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
c230: 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 BER >= 0x1010000
c240: 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 0L || defined(NO
c250: 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL2) || define
c260: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
c270: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 2). if (ENABL
c280: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 ED(proto, TLS_PR
c290: 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 OTO_SSL2)) {..Tc
c2a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
c2b0: 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f nterp, "SSL2 pro
c2c0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
c2d0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ted", (char *) N
c2e0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
c2f0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 LL;. }.#endif
c300: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f .#if defined(NO_
c310: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
c320: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
c330: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 ). if (ENABLE
c340: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
c350: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c TO_SSL3)) {..Tcl
c360: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
c370: 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 terp, "SSL3 prot
c380: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
c390: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ed", (char *) NU
c3a0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
c3b0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a L;. }.#endif.
c3c0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 #if defined(NO_T
c3d0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 LS1) || defined(
c3e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 OPENSSL_NO_TLS1)
c3f0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 . if (ENABLED
c400: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 (proto, TLS_PROT
c410: 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f O_TLS1)) {..Tcl_
c420: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
c430: 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 erp, "TLS 1.0 pr
c440: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
c450: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
c460: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
c470: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
c480: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
c490: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 _TLS1_1) || defi
c4a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c4b0: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 LS1_1). if (E
c4c0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
c4d0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 S_PROTO_TLS1_1))
c4e0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
c4f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
c500: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.1 protocol n
c510: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
c520: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
c530: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
c540: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
c550: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 fined(NO_TLS1_2)
c560: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
c570: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 SSL_NO_TLS1_2).
c580: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 if (ENABLED(p
c590: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f roto, TLS_PROTO_
c5a0: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f TLS1_2)) {..Tcl_
c5b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
c5c0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 erp, "TLS 1.2 pr
c5d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
c5e0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 rted", (char *)
c5f0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
c600: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ULL;. }.#endi
c610: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f f.#if defined(NO
c620: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 _TLS1_3) || defi
c630: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
c640: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 LS1_3). if (E
c650: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c NABLED(proto, TL
c660: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 S_PROTO_TLS1_3))
c670: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
c680: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c sult(interp, "TL
c690: 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e S 1.3 protocol n
c6a0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 ot supported", (
c6b0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
c6c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
c6d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 }.#endif. if
c6e0: 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a (proto == 0) {.
c6f0: 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e ./* Use full ran
c700: 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 ge */..SSL_CTX_s
c710: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 et_min_proto_ver
c720: 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 sion(ctx, 0);..S
c730: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 SL_CTX_set_max_p
c740: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
c750: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 , 0);. }..
c760: 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 switch (proto)
c770: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 {.#if OPENSSL_VE
c780: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
c790: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 x10100000L && !d
c7a0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 efined(NO_SSL2)
c7b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
c7c0: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 SSL_NO_SSL2).
c7d0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f case TLS_PROTO_
c7e0: 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 SSL2:..method =
c7f0: 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 isServer ? SSLv2
c800: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 _server_method()
c810: 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f : SSLv2_client_
c820: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b method();..break
c830: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
c840: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 fined(NO_SSL3) &
c850: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
c860: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 SL_NO_SSL3) && !
c870: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
c880: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a NO_SSL3_METHOD).
c890: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f case TLS_PRO
c8a0: 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 TO_SSL3:..method
c8b0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 = isServer ? SS
c8c0: 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f Lv3_server_metho
c8d0: 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 d() : SSLv3_clie
c8e0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 nt_method();..br
c8f0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 eak;.#endif.#if
c900: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 !defined(NO_TLS1
c910: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
c920: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 ENSSL_NO_TLS1) &
c930: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
c940: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f SL_NO_TLS1_METHO
c950: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f D). case TLS_
c960: 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 PROTO_TLS1:..met
c970: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f hod = isServer ?
c980: 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 TLSv1_server_me
c990: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 thod() : TLSv1_c
c9a0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a lient_method();.
c9b0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 .break;.#endif.#
c9c0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 if !defined(NO_T
c9d0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e LS1_1) && !defin
c9e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
c9f0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 S1_1) && !define
ca00: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
ca10: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 1_1_METHOD).
ca20: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 case TLS_PROTO_T
ca30: 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d LS1_1:..method =
ca40: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 isServer ? TLSv
ca50: 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 1_1_server_metho
ca60: 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c d() : TLSv1_1_cl
ca70: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 ient_method();..
ca80: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 break;.#endif.#i
ca90: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c f !defined(NO_TL
caa0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 S1_2) && !define
cab0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
cac0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_2) && !defined
cad0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
cae0: 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 _2_METHOD). c
caf0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c ase TLS_PROTO_TL
cb00: 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 S1_2:..method =
cb10: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 isServer ? TLSv1
cb20: 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 _2_server_method
cb30: 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 () : TLSv1_2_cli
cb40: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 ent_method();..b
cb50: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 reak;.#endif.#if
cb60: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 !defined(NO_TLS
cb70: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 1_3) && !defined
cb80: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
cb90: 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 _3). case TLS
cba0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 _PROTO_TLS1_3:..
cbb0: 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 /* Use the gener
cbc0: 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f ic method and co
cbd0: 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 nstraint range a
cbe0: 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 fter context is
cbf0: 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 created */..meth
cc00: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 od = isServer ?
cc10: 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f TLS_server_metho
cc20: 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 d() : TLS_client
cc30: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 _method();..brea
cc40: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 k;.#endif. de
cc50: 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 fault:../* Negot
cc60: 69 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 iate highest ava
cc70: 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 ilable SSL/TLS v
cc80: 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f ersion */..metho
cc90: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 d = isServer ? T
cca0: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 LS_server_method
ccb0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f () : TLS_client_
ccc0: 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 method();.#if OP
ccd0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
cce0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 MBER < 0x1010000
ccf0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 0L && !defined(N
cd00: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 O_SSL2) && !defi
cd10: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 ned(OPENSSL_NO_S
cd20: 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e SL2)..off |= (EN
cd30: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 ABLED(proto, TLS
cd40: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f _PROTO_SSL2) ?
cd50: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 0 : SSL_OP_NO_S
cd60: 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 SLv2);.#endif.#i
cd70: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 f !defined(NO_SS
cd80: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 L3) && !defined(
cd90: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 OPENSSL_NO_SSL3)
cda0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
cdb0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
cdc0: 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a TO_SSL3) ? 0 :
cdd0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 SSL_OP_NO_SSLv3
cde0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
cdf0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 efined(NO_TLS1)
ce00: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
ce10: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 SSL_NO_TLS1)..of
ce20: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
ce30: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
ce40: 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c LS1) ? 0 : SSL
ce50: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 _OP_NO_TLSv1);.#
ce60: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
ce70: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 ed(NO_TLS1_1) &&
ce80: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
ce90: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 L_NO_TLS1_1)..of
cea0: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 f |= (ENABLED(pr
ceb0: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 oto, TLS_PROTO_T
cec0: 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c LS1_1) ? 0 : SSL
ced0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b _OP_NO_TLSv1_1);
cee0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
cef0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
cf00: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
cf10: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 SSL_NO_TLS1_2)..
cf20: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 off |= (ENABLED(
cf30: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f proto, TLS_PROTO
cf40: 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 _TLS1_2) ? 0 : S
cf50: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 SL_OP_NO_TLSv1_2
cf60: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
cf70: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
cf80: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 ) && !defined(OP
cf90: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
cfa0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 ..off |= (ENABLE
cfb0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f D(proto, TLS_PRO
cfc0: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a TO_TLS1_3) ? 0 :
cfd0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 SSL_OP_NO_TLSv1
cfe0: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 _3);.#endif..bre
cff0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 ak;. }.. E
d000: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
d010: 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c ;.. ctx = SSL
d020: 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 _CTX_new(method)
d030: 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 ;. if (!ctx)
d040: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a {..return NULL;.
d050: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 }.. if (g
d060: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 etenv(SSLKEYLOGF
d070: 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 ILE)) {..SSL_CTX
d080: 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c _set_keylog_call
d090: 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 back(ctx, KeyLog
d0a0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d Callback);. }
d0b0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e ..#if !defined(N
d0c0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 O_TLS1_3) && !de
d0d0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
d0e0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 _TLS1_3). if
d0f0: 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 (proto == TLS_PR
d100: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 OTO_TLS1_3) {..S
d110: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 SL_CTX_set_min_p
d120: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 roto_version(ctx
d130: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e , TLS1_3_VERSION
d140: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f );..SSL_CTX_set_
d150: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f max_proto_versio
d160: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 n(ctx, TLS1_3_VE
d170: 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 RSION);. }.#e
d180: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 ndif.. /* For
d190: 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 ce cipher select
d1a0: 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 ion order by ser
d1b0: 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 ver */. if (!
d1c0: 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c isServer) {..SSL
d1d0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 _CTX_set_options
d1e0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 (ctx, SSL_OP_CIP
d1f0: 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 HER_SERVER_PREFE
d200: 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 RENCE);. }..#
d210: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
d220: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
d230: 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 100000L. Open
d240: 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f SSL_add_all_algo
d250: 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 rithms(); /* Loa
d260: 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 69 d ciphers and di
d270: 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a gests */.#endif.
d280: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
d290: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 _app_data(ctx, (
d2a0: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f void*)interp);./
d2b0: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 * remember the i
d2c0: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 nterpreter */.
d2d0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 SSL_CTX_set_op
d2e0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f tions(ctx, SSL_O
d2f0: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 P_ALL);./* all S
d300: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e SL bug workaroun
d310: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 ds */. SSL_CT
d320: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 X_set_options(ct
d330: 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d x, SSL_OP_NO_COM
d340: 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 PRESSION);./* di
d350: 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f sable compressio
d360: 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72 n even if suppor
d370: 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 ted */. SSL_C
d380: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 TX_set_options(c
d390: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 tx, off);../* di
d3a0: 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 sable protocol v
d3b0: 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f ersions */.#if O
d3c0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e PENSSL_VERSION_N
d3d0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 UMBER < 0x101010
d3e0: 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 00L. SSL_CTX_
d3f0: 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 set_mode(ctx, SS
d400: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 L_MODE_AUTO_RETR
d410: 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 Y);./* handle ne
d420: 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 w handshakes in
d430: 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 background. On b
d440: 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 y default in Ope
d450: 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 nSSL 1.1.1. */.#
d460: 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 endif. SSL_CT
d470: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 X_sess_set_cache
d480: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b _size(ctx, 128);
d490: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 .. /* Set use
d4a0: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 r defined cipher
d4b0: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 s, cipher suites
d4c0: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c , and security l
d4d0: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 evel */. if (
d4e0: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c (ciphers != NULL
d4f0: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 ) && !SSL_CTX_se
d500: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 t_cipher_list(ct
d510: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 x, ciphers)) {..
d520: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
d530: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 (interp, "Set ci
d540: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f phers failed: No
d550: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c valid ciphers",
d560: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
d570: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
d580: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c tx);..return NUL
d590: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 L;. }. if
d5a0: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21 ((ciphersuites !
d5b0: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f = NULL) && !SSL_
d5c0: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 CTX_set_ciphersu
d5d0: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 ites(ctx, cipher
d5e0: 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f suites)) {..Tcl_
d5f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d600: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 erp, "Set cipher
d610: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 suites failed:
d620: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 No valid ciphers
d630: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
d640: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 );..SSL_CTX_free
d650: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e (ctx);..return N
d660: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
d670: 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 /* Set security
d680: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 level */. if
d690: 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c (level > -1 && l
d6a0: 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 evel < 6) {../*
d6b0: 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 SSL_set_security
d6c0: 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 _level */..SSL_C
d6d0: 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f TX_set_security_
d6e0: 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c level(ctx, level
d6f0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
d700: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 set some callba
d710: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 cks */. SSL_C
d720: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 TX_set_default_p
d730: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 asswd_cb(ctx, Pa
d740: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b sswordCallback);
d750: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 . SSL_CTX_set
d760: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f _default_passwd_
d770: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c cb_userdata(ctx,
d780: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 (void *)statePt
d790: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 r);.. /* read
d7a0: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 a Diffie-Hellma
d7b0: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c n parameters fil
d7c0: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 e, or use the bu
d7d0: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 20 20 ilt-in one */.
d7e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
d7f0: 74 28 26 64 73 29 3b 0a 23 69 66 64 65 66 20 4f t(&ds);.#ifdef O
d800: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 PENSSL_NO_DH.
d810: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d if (DHparams !=
d820: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
d830: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
d840: 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 p, "DH parameter
d850: 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 support not ava
d860: 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a ilable", (char *
d870: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 ) NULL);..SSL_CT
d880: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
d890: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
d8a0: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 .#else. {..DH
d8b0: 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 * dh;..if (DHpar
d8c0: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ams != NULL) {..
d8d0: 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 0a 09 BIO *bio;...
d8e0: 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 bio = BIO_ne
d8f0: 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 w_file(F2N(DHpar
d900: 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b ams, &ds), "r");
d910: 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 .. if (!bio)
d920: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 {...Tcl_DStringF
d930: 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f ree(&ds);...Tcl_
d940: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
d950: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 erp, "Could not
d960: 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 find DH paramete
d970: 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 rs file", (char
d980: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f *) NULL);...SSL_
d990: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 CTX_free(ctx);..
d9a0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 .return NULL;..
d9b0: 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 }... dh =
d9c0: 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 PEM_read_bio_DHp
d9d0: 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c arams(bio, NULL,
d9e0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 NULL, NULL);..
d9f0: 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 BIO_free(bio)
da00: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ;.. Tcl_DStri
da10: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 ngFree(&ds);..
da20: 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 if (!dh) {...T
da30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
da40: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e interp, "Could n
da50: 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d ot read DH param
da60: 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 eters from file"
da70: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
da80: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
da90: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
daa0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 NULL;.. }..
dab0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d SSL_CTX_set_tm
dac0: 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 p_dh(ctx, dh);..
dad0: 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b DH_free(dh);
dae0: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ...} else {..
daf0: 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f /* Use well kno
db00: 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 wn DH parameters
db10: 20 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74 that have built
db20: 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f -in support in O
db30: 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 penSSL */.. i
db40: 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f f (!SSL_CTX_set_
db50: 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29 dh_auto(ctx, 1))
db60: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
db70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 esult(interp, "C
db80: 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 ould not enable
db90: 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 set DH auto: ",
dba0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
dbb0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
dbc0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 ;...SSL_CTX_free
dbd0: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 (ctx);...return
dbe0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a NULL;.. }..}.
dbf0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 }.#endif..
dc00: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 /* set our cer
dc10: 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 tificate */.
dc20: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 load_private_key
dc30: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 = 0;. if (ce
dc40: 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 rtfile != NULL)
dc50: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f {..load_private_
dc60: 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53 key = 1;...if (S
dc70: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
dc80: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c ficate_file(ctx,
dc90: 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 F2N(certfile, &
dca0: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 ds), SSL_FILETYP
dcb0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 E_PEM) <= 0) {..
dcc0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
dcd0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 ree(&ds);.. T
dce0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
dcf0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 interp, "unable
dd00: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 to set certifica
dd10: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 te file ", certf
dd20: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 ile, ": ",...GET
dd30: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
dd40: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
dd50: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 SSL_CTX_free
dd60: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 (ctx);.. retu
dd70: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c rn NULL;..}..Tcl
dd80: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
dd90: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 );.. } else i
dda0: 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 f (cert != NULL)
ddb0: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 {..load_private
ddc0: 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 _key = 1;..if (S
ddd0: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 SL_CTX_use_certi
dde0: 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c ficate_ASN1(ctx,
ddf0: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 cert_len, cert)
de00: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 <= 0) {.. Tc
de10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
de20: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 nterp, "unable t
de30: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 o set certificat
de40: 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f e: ",...GET_ERR_
de50: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
de60: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 *) NULL);.. S
de70: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 SL_CTX_free(ctx)
de80: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
de90: 4c 4c 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c LL;..}.. } el
dea0: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d se {..certfile =
deb0: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 (char*)X509_get
dec0: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 _default_cert_fi
ded0: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f le();...if (SSL_
dee0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 CTX_use_certific
def0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 ate_file(ctx, ce
df00: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 rtfile, SSL_FILE
df10: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 TYPE_PEM) <= 0)
df20: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c {.#if 0.. Tcl
df30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
df40: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f terp, "unable to
df50: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 use default cer
df60: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c tificate file ",
df70: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c certfile, ": ",
df80: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ...GET_ERR_REASO
df90: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 N(), (char *) NU
dfa0: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 LL);.. SSL_CT
dfb0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 X_free(ctx);..
dfc0: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 return NULL;.#
dfd0: 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a endif..}. }..
dfe0: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 /* set our p
dff0: 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 rivate key */.
e000: 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 if (load_priva
e010: 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b te_key) {..if (k
e020: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 eyfile == NULL &
e030: 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b & key == NULL) {
e040: 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 .. keyfile =
e050: 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 certfile;..}...i
e060: 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 f (keyfile != NU
e070: 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 LL) {.. /* ge
e080: 74 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 t the private ke
e090: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
e0a0: 68 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 h this certifica
e0b0: 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b te */.. if (k
e0c0: 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 eyfile == NULL)
e0d0: 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 {...keyfile = ce
e0e0: 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a rtfile;.. }..
e0f0: 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 . if (SSL_CTX
e100: 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f _use_PrivateKey_
e110: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 file(ctx, F2N(ke
e120: 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c yfile, &ds), SSL
e130: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c _FILETYPE_PEM) <
e140: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 = 0) {...Tcl_DSt
e150: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
e160: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 ./* flush the pa
e170: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d ssphrase which m
e180: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 ight be left in
e190: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 the result */...
e1a0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
e1b0: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f terp, NULL, TCL_
e1c0: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 STATIC);...Tcl_A
e1d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
e1e0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 rp, "unable to s
e1f0: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 et public key fi
e200: 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 le ", keyfile, "
e210: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 ",... GET_ER
e220: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
e230: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 r *) NULL);...SS
e240: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b L_CTX_free(ctx);
e250: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ...return NULL;.
e260: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f . }.. Tcl_
e270: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
e280: 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b ;...} else if (k
e290: 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ey != NULL) {..
e2a0: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 if (SSL_CTX_u
e2b0: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 se_PrivateKey_AS
e2c0: 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c N1(EVP_PKEY_RSA,
e2d0: 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 ctx, key,key_le
e2e0: 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 n) <= 0) {.../*
e2f0: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 flush the passph
e300: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 rase which might
e310: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 be left in the
e320: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f result */...Tcl_
e330: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
e340: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 , NULL, TCL_STAT
e350: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e IC);...Tcl_Appen
e360: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
e370: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 "unable to set p
e380: 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 ublic key: ", GE
e390: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
e3a0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
e3b0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 ..SSL_CTX_free(c
e3c0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 tx);...return NU
e3d0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f LL;.. }..}../
e3e0: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 * Now we know th
e3f0: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 at a key and cer
e400: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 t have been set
e410: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 against.. * the
e420: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 SSL context */..
e430: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 if (!SSL_CTX_che
e440: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 ck_private_key(c
e450: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f tx)) {.. Tcl_
e460: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
e470: 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 erp, "private ke
e480: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 y does not match
e490: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 the certificate
e4a0: 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 public key",...
e4b0: 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e . (char *) N
e4c0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ULL);.. SSL_C
e4d0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 TX_free(ctx);..
e4e0: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
e4f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
e500: 20 53 65 74 20 74 6f 20 75 73 65 20 64 65 66 61 Set to use defa
e510: 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 ult location and
e520: 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74 69 66 file for Certif
e530: 69 63 61 74 65 20 41 75 74 68 6f 72 69 74 79 20 icate Authority
e540: 28 43 41 29 20 63 65 72 74 69 66 69 63 61 74 65 (CA) certificate
e550: 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 76 65 s. The. * ve
e560: 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 rify path and st
e570: 6f 72 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 ore can be overr
e580: 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c idden by the SSL
e590: 5f 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 _CERT_DIR env va
e5a0: 72 2e 20 54 68 65 20 76 65 72 69 66 79 20 66 69 r. The verify fi
e5b0: 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a 20 62 65 le can. * be
e5c0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 overridden by t
e5d0: 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 he SSL_CERT_FILE
e5e0: 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 20 20 20 env var. */.
e5f0: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 if (!SSL_CTX_se
e600: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 t_default_verify
e610: 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 09 _paths(ctx)) {..
e620: 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a abort++;. }..
e630: 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 73 /* Overrides
e640: 20 66 6f 72 20 74 68 65 20 43 41 20 76 65 72 69 for the CA veri
e650: 66 79 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 fy path and file
e660: 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66 20 4f 50 */. {.#if OP
e670: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
e680: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
e690: 30 4c 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 0L..if (CApath !
e6a0: 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66 69 6c 65 = NULL || CAfile
e6b0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 != NULL) {..
e6c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 Tcl_DString ds1
e6d0: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ;.. Tcl_DStri
e6e0: 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 0a 09 ngInit(&ds1);...
e6f0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 if (!SSL_CTX
e700: 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 _load_verify_loc
e710: 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 ations(ctx, F2N(
e720: 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 CAfile, &ds), F2
e730: 4e 28 43 41 70 61 74 68 2c 20 26 64 73 31 29 29 N(CApath, &ds1))
e740: 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 ) {...abort++;..
e750: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
e760: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
e770: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
e780: 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 gFree(&ds1);...
e790: 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f /* Set list o
e7a0: 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f f CAs to send to
e7b0: 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 client when req
e7c0: 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 uesting a client
e7d0: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a certificate */.
e7e0: 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f . /* https://
e7f0: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f sourceforge.net/
e800: 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a p/tls/bugs/57/ *
e810: 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f /.. /* XXX:TO
e820: 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 DO: Let the user
e830: 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 supply values h
e840: 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 ere instead of s
e850: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 omething that ex
e860: 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 ists on the file
e870: 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20 20 53 system */.. S
e880: 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d TACK_OF(X509_NAM
e890: 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 E) *certNames =
e8a0: 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f SSL_load_client_
e8b0: 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 CA_file(F2N(CAfi
e8c0: 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 le, &ds));..
e8d0: 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d if (certNames !=
e8e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 NULL) {...SSL_C
e8f0: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 TX_set_client_CA
e900: 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e _list(ctx, certN
e910: 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 ames);.. }..
e920: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
e930: 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c ee(&ds);..}..#el
e940: 73 65 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 se..if (CApath !
e950: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 = NULL) {.. i
e960: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 f (!SSL_CTX_load
e970: 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74 78 2c _verify_dir(ctx,
e980: 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73 F2N(CApath, &ds
e990: 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b ))) {...abort++;
e9a0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
e9b0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
e9c0: 29 3b 0a 09 7d 0a 09 69 66 20 28 43 41 66 69 6c );..}..if (CAfil
e9d0: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 e != NULL) {..
e9e0: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c if (!SSL_CTX_l
e9f0: 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 oad_verify_file(
ea00: 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c ctx, F2N(CAfile,
ea10: 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 &ds))) {...abor
ea20: 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 t++;.. }..
ea30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
ea40: 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 (&ds);... /*
ea50: 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 Set list of CAs
ea60: 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e to send to clien
ea70: 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e t when requestin
ea80: 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 g a client certi
ea90: 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 53 ficate */.. S
eaa0: 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d TACK_OF(X509_NAM
eab0: 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 E) *certNames =
eac0: 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f SSL_load_client_
ead0: 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 CA_file(F2N(CAfi
eae0: 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 le, &ds));..
eaf0: 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d if (certNames !=
eb00: 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 NULL) {...SSL_C
eb10: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 TX_set_client_CA
eb20: 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e _list(ctx, certN
eb30: 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 ames);.. }..
eb40: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
eb50: 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 ee(&ds);..}.#end
eb60: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 if. }.. re
eb70: 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a turn ctx;.}.../*
eb80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
eb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ebb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ebc0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 ------. *. * Sta
ebd0: 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 tusObjCmd -- ret
ebe0: 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 urn certificate
ebf0: 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 for connected pe
ec00: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
ec10: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
ec20: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
ec30: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
ec40: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
ec50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ec60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ec70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ec80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ec90: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
eca0: 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 t.StatusObjCmd(C
ecb0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
ecc0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
ecd0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
ece0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
ecf0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
ed00: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
ed10: 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 ;. X509 *peer
ed20: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f ;. Tcl_Obj *o
ed30: 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 bjPtr;. Tcl_C
ed40: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
ed50: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 char *channelNa
ed60: 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 me, *ciphers;.
ed70: 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 int mode;.
ed80: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
ed90: 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 har *proto;.
eda0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e unsigned int len
edb0: 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 ;. int nid, r
edc0: 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 es;. (void) c
edd0: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 lientData;..
ede0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
edf0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 );.. if (objc
ee00: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 < 2 || objc > 3
ee10: 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 || (objc == 3 &
ee20: 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 & !strcmp(Tcl_Ge
ee30: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
ee40: 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a , "-local"))) {.
ee50: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
ee60: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
ee70: 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 v, "?-local? cha
ee80: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 nnel");..return
ee90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
eea0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 .. /* Get cha
eeb0: 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 nnel Id */. c
eec0: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c hannelName = Tcl
eed0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
eee0: 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a (objc == 2 ? 1 :
eef0: 20 32 29 5d 29 3b 0a 20 20 20 20 63 68 61 6e 20 2)]);. chan
ef00: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c = Tcl_GetChannel
ef10: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c (interp, channel
ef20: 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 Name, &mode);.
ef30: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 if (chan == (T
ef40: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
ef50: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
ef60: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
ef70: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 /* Make sure t
ef80: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 o operate on the
ef90: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c topmost channel
efa0: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 */. chan = T
efb0: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c cl_GetTopChannel
efc0: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 (chan);. if (
efd0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
efe0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f pe(chan) != Tls_
eff0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b ChannelType()) {
f000: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
f010: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 lt(interp, "bad
f020: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c channel \"", Tcl
f030: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
f040: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f chan),..."\": no
f050: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 t a TLS channel"
f060: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
f070: 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 ;..Tcl_SetErrorC
f080: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 ode(interp, "TLS
f090: 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 ", "STATUS", "CH
f0a0: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 ANNEL", "INVALID
f0b0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
f0c0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
f0d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
f0e0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
f0f0: 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e e *) Tcl_GetChan
f100: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
f110: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 chan);.. /* G
f120: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 et certificate f
f130: 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 or peer or self
f140: 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 */. if (objc
f150: 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 == 2) {..peer =
f160: 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 SSL_get_peer_cer
f170: 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 tificate(statePt
f180: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 r->ssl);. } e
f190: 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 lse {..peer = SS
f1a0: 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 L_get_certificat
f1b0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 e(statePtr->ssl)
f1c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
f1d0: 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69 Get X509 certifi
f1e0: 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 cate info */.
f1f0: 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 if (peer) {..ob
f200: 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 jPtr = Tls_NewX5
f210: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 09Obj(interp, pe
f220: 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d er);..if (objc =
f230: 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 = 2) {.. X509
f240: 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 _free(peer);..
f250: 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 peer = NULL;..
f260: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
f270: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
f280: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
f290: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
f2a0: 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 Peer name */.
f2b0: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 LAPPEND_STR(int
f2c0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 erp, objPtr, "pe
f2d0: 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 ername", SSL_get
f2e0: 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 0_peername(state
f2f0: 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a Ptr->ssl), -1);.
f300: 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 LAPPEND_INT(
f310: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f320: 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 "sbits", SSL_get
f330: 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 _cipher_bits(sta
f340: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c tePtr->ssl, NULL
f350: 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 ));.. ciphers
f360: 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 = (char*)SSL_ge
f370: 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 t_cipher(statePt
f380: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 r->ssl);. LAP
f390: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
f3a0: 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 objPtr, "cipher
f3b0: 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b ", ciphers, -1);
f3c0: 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 .. /* Verify
f3d0: 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 the X509 certifi
f3e0: 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 cate presented b
f3f0: 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 y the peer */.
f400: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e LAPPEND_STR(in
f410: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 terp, objPtr, "v
f420: 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 erifyResult",..X
f430: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
f440: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c error_string(SSL
f450: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
f460: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
f470: 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a )), -1);.. /*
f480: 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a Verify mode */.
f490: 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 mode = SSL_g
f4a0: 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 et_verify_mode(s
f4b0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 tatePtr->ssl);.
f4c0: 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 if (mode && S
f4d0: 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 SL_VERIFY_NONE)
f4e0: 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 {..LAPPEND_STR(i
f4f0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
f500: 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f verifyMode", "no
f510: 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 ne", -1);. }
f520: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 else {..Tcl_Obj
f530: 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 *listObjPtr = Tc
f540: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
f550: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 NULL);..if (mode
f560: 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 && SSL_VERIFY_P
f570: 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f EER) {.. Tcl_
f580: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f590: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 ment(interp, lis
f5a0: 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 tObjPtr, Tcl_New
f5b0: 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 StringObj("peer"
f5c0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 , -1));..}..if (
f5d0: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 mode && SSL_VERI
f5e0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 FY_FAIL_IF_NO_PE
f5f0: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 ER_CERT) {..
f600: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f610: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f620: 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
f630: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 _NewStringObj("f
f640: 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 ail if no peer c
f650: 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 ert", -1));..}..
f660: 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f if (mode && SSL_
f670: 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e VERIFY_CLIENT_ON
f680: 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c CE) {.. Tcl_L
f690: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
f6a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 ent(interp, list
f6b0: 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ObjPtr, Tcl_NewS
f6c0: 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 tringObj("client
f6d0: 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d once", -1));..}
f6e0: 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 ..if (mode && SS
f6f0: 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 L_VERIFY_POST_HA
f700: 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 NDSHAKE) {..
f710: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
f720: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
f730: 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c listObjPtr, Tcl
f740: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 _NewStringObj("p
f750: 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 ost handshake",
f760: 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e -1));..}..LAPPEN
f770: 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 D_OBJ(interp, ob
f780: 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 jPtr, "verifyMod
f790: 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a e", listObjPtr).
f7a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 }.. /* Ve
f7b0: 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 rify mode depth
f7c0: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 */. LAPPEND_I
f7d0: 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 NT(interp, objPt
f7e0: 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 22 r, "verifyDepth"
f7f0: 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 , SSL_get_verify
f800: 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72 2d _depth(statePtr-
f810: 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 >ssl));.. /*
f820: 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 Report the selec
f830: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 ted protocol as
f840: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 a result of the
f850: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 negotiation */.
f860: 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e SSL_get0_alpn
f870: 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 _selected(stateP
f880: 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c tr->ssl, &proto,
f890: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 &len);. LAPP
f8a0: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
f8b0: 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 objPtr, "alpn",
f8c0: 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 (char *)proto, (
f8d0: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a Tcl_Size) len);.
f8e0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
f8f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
f900: 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f "protocol", SSL_
f910: 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 get_version(stat
f920: 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b ePtr->ssl), -1);
f930: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 .. /* Valid f
f940: 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 or non-RSA signa
f950: 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 ture and TLS 1.3
f960: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
f970: 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 == 2) {..res =
f980: 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 SSL_get_peer_sig
f990: 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 nature_nid(state
f9a0: 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
f9b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
f9c0: 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 es = SSL_get_sig
f9d0: 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 nature_nid(state
f9e0: 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b Ptr->ssl, &nid);
f9f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 . }. if (!
fa00: 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a res) {nid = 0;}.
fa10: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 LAPPEND_STR(
fa20: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
fa30: 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c "signatureHashAl
fa40: 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 gorithm", OBJ_ni
fa50: 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a d2ln(nid), -1);.
fa60: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
fa70: 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 2) {..res = SSL
fa80: 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 _get_peer_signat
fa90: 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 ure_type_nid(sta
faa0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 tePtr->ssl, &nid
fab0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
fac0: 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 .res = SSL_get_s
fad0: 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 ignature_type_ni
fae0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c d(statePtr->ssl,
faf0: 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 &nid);. }.
fb00: 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 if (!res) {nid
fb10: 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 = 0;}. LAPPE
fb20: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
fb30: 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 bjPtr, "signatur
fb40: 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 eType", OBJ_nid2
fb50: 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 ln(nid), -1);..
fb60: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
fb70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ult(interp, objP
fb80: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
fb90: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
fba0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
fbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fbe0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 ----. *. * Conne
fbf0: 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 ctionInfoObjCmd
fc00: 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 -- return connec
fc10: 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f tion info from O
fc20: 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 penSSL.. *. * Re
fc30: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 sults:. *.A list
fc40: 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 of connection i
fc50: 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nfo. *. *------
fc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
fca0: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f /..static int Co
fcb0: 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 nnectionInfoObjC
fcc0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
fcd0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
fce0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
fcf0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
fd00: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
fd10: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
fd20: 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 chan;../* The c
fd30: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 hannel to set a
fd40: 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 mode on */. S
fd50: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 tate *statePtr;.
fd60: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 ./* client state
fd70: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 for ssl socket
fd80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
fd90: 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 objPtr, *listPtr
fda0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 ;. const SSL
fdb0: 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 *ssl;. const
fdc0: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 SSL_CIPHER *ciph
fdd0: 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 er;. const SS
fde0: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 L_SESSION *sessi
fdf0: 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 on;. const EV
fe00: 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 P_MD *md;. (v
fe10: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b oid) clientData;
fe20: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
fe30: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
fe40: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
fe50: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
fe60: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 el");..return TC
fe70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
fe80: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 chan = Tcl_G
fe90: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 etChannel(interp
fea0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 , Tcl_GetString(
feb0: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b objv[1]), NULL);
fec0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
fed0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
fee0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
fef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
ff00: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
ff10: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
ff20: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
ff30: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
ff40: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
ff50: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 nel(chan);. i
ff60: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 f (Tcl_GetChanne
ff70: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 lType(chan) != T
ff80: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 ls_ChannelType()
ff90: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
ffa0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 esult(interp, "b
ffb0: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 ad channel \"",
ffc0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
ffd0: 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 me(chan),.. "
ffe0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 \": not a TLS ch
fff0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 annel", (char *)
10000 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 NULL);..Tcl_Set
10010 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
10020 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 , "TLS", "CONNEC
10030 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 TION", "CHANNEL"
10040 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 , "INVALID", (ch
10050 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
10060 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
10070 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 }.. objPt
10080 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f r = Tcl_NewListO
10090 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 bj(0, NULL);..
100a0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 /* Connection
100b0 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 info */. stat
100c0 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
100d0 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
100e0 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 stanceData(chan)
100f0 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 ;. ssl = stat
10100 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 ePtr->ssl;. i
10110 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 f (ssl != NULL)
10120 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e {../* connection
10130 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 state */..LAPPE
10140 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
10150 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 bjPtr, "state",
10160 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 SSL_state_string
10170 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b _long(ssl), -1);
10180 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 .../* Get SNI re
10190 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e quested server n
101a0 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f ame */..LAPPEND_
101b0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 STR(interp, objP
101c0 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 tr, "servername"
101d0 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 , SSL_get_server
101e0 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 name(ssl, TLSEXT
101f0 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e _NAMETYPE_host_n
10200 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 ame), -1);.../*
10210 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a Get protocol */.
10220 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 .LAPPEND_STR(int
10230 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 erp, objPtr, "pr
10240 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 otocol", SSL_get
10250 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d _version(ssl), -
10260 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 1);.../* Renegot
10270 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a iation allowed *
10280 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 /..LAPPEND_BOOL(
10290 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
102a0 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 "renegotiation_a
102b0 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 llowed", SSL_get
102c0 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 _secure_renegoti
102d0 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 ation_support((S
102e0 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f SL *) ssl));.../
102f0 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c * Get security l
10300 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 evel */..LAPPEND
10310 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a _INT(interp, obj
10320 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c Ptr, "security_l
10330 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 evel", SSL_get_s
10340 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 ecurity_level(ss
10350 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f l));.../* Sessio
10360 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 n info */..LAPPE
10370 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 ND_BOOL(interp,
10380 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e objPtr, "session
10390 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 _reused", SSL_se
103a0 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c ssion_reused(ssl
103b0 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 ));.../* Is serv
103c0 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 er info */..LAPP
103d0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
103e0 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 objPtr, "is_ser
103f0 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 ver", SSL_is_ser
10400 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 ver(ssl));.../*
10410 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 Is DTLS */..LAPP
10420 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c END_BOOL(interp,
10430 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c objPtr, "is_dtl
10440 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 s", SSL_is_dtls(
10450 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 ssl));. }..
10460 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f /* Cipher info
10470 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d */. cipher =
10480 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 SSL_get_current
10490 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 _cipher(ssl);.
104a0 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 if (cipher !=
104b0 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 NULL) {..char bu
104c0 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b f[BUFSIZ] = {0};
104d0 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f ..int bits, alg_
104e0 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 bits;.../* Ciphe
104f0 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 r name */..LAPPE
10500 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f ND_STR(interp, o
10510 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c bjPtr, "cipher",
10520 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
10530 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 name(cipher), -1
10540 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 );.../* RFC name
10550 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c of cipher */..L
10560 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 APPEND_STR(inter
10570 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e p, objPtr, "stan
10580 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f dard_name", SSL_
10590 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f CIPHER_standard_
105a0 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 name(cipher), -1
105b0 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 );.../* OpenSSL
105c0 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a name of cipher *
105d0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 /..LAPPEND_STR(i
105e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
105f0 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f openssl_name", O
10600 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 PENSSL_cipher_na
10610 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 me(SSL_CIPHER_st
10620 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 andard_name(ciph
10630 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 er)), -1);.../*
10640 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 number of secret
10650 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 bits used for c
10660 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d ipher */..bits =
10670 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f SSL_CIPHER_get_
10680 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c bits(cipher, &al
10690 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e g_bits);..LAPPEN
106a0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 D_INT(interp, ob
106b0 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 jPtr, "secret_bi
106c0 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 ts", bits);..LAP
106d0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c PEND_INT(interp,
106e0 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 objPtr, "algori
106f0 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 thm_bits", alg_b
10700 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 its);../* alg_bi
10710 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 ts is actual key
10720 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 secret bits. If
10730 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 use bits and se
10740 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 cret (algorithm)
10750 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 bits differ,..
10760 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 the rest of th
10770 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65 64 e bits are fixed
10780 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 , i.e. for limit
10790 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 ed export cipher
107a0 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f s (bits < 56) */
107b0 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 .../* Indicates
107c0 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 which SSL/TLS pr
107d0 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 otocol version f
107e0 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 irst defined the
107f0 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 cipher */..LAPP
10800 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 END_STR(interp,
10810 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 objPtr, "min_ver
10820 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 sion", SSL_CIPHE
10830 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 R_get_version(ci
10840 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a pher), -1);.../*
10850 20 43 69 70 68 65 72 20 4e 49 44 2c 20 64 69 67 Cipher NID, dig
10860 65 73 74 20 4e 49 44 20 28 6e 6f 6e 65 20 66 6f est NID (none fo
10870 72 20 41 45 41 44 20 63 69 70 68 65 72 20 73 75 r AEAD cipher su
10880 69 74 65 73 29 2c 20 4b 65 79 20 45 78 63 68 61 ites), Key Excha
10890 6e 67 65 20 4e 49 44 2c 20 61 6e 64 20 61 75 74 nge NID, and aut
108a0 68 65 6e 74 69 63 61 74 69 6f 6e 20 4e 49 44 20 hentication NID
108b0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 */..LAPPEND_STR(
108c0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 interp, objPtr,
108d0 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 "cipherNID", (ch
108e0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 ar *)OBJ_nid2ln(
108f0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 SSL_CIPHER_get_c
10900 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 ipher_nid(cipher
10910 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e )), -1);..LAPPEN
10920 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 D_STR(interp, ob
10930 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 jPtr, "digestNID
10940 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e ", (char *)OBJ_n
10950 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 id2ln(SSL_CIPHER
10960 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 _get_digest_nid(
10970 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 cipher)), -1);..
10980 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
10990 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 rp, objPtr, "key
109a0 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 ExchangeNID", (c
109b0 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e har *)OBJ_nid2ln
109c0 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f (SSL_CIPHER_get_
109d0 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c kx_nid(cipher)),
109e0 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
109f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
10a00 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 r, "authenticati
10a10 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 onNID", (char *)
10a20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 OBJ_nid2ln(SSL_C
10a30 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e IPHER_get_auth_n
10a40 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 id(cipher)), -1)
10a50 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 ;.../* message a
10a60 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f uthentication co
10a70 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 de - Cipher is A
10a80 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 EAD (e.g. GCM or
10a90 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 ChaCha20/Poly13
10aa0 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 05) or not */../
10ab0 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 * Authenticated
10ac0 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 Encryption with
10ad0 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 associated data
10ae0 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a (AEAD) check */.
10af0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e .LAPPEND_BOOL(in
10b00 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
10b10 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 ipher_is_aead",
10b20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 SSL_CIPHER_is_ae
10b30 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f ad(cipher));.../
10b40 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 * Get OpenSSL-sp
10b50 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 ecific ID, not I
10b60 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 ANA ID */..LAPPE
10b70 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f ND_INT(interp, o
10b80 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 bjPtr, "cipher_i
10b90 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 d", (int) SSL_CI
10ba0 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 PHER_get_id(ciph
10bb0 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 er));.../* Two-b
10bc0 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 yte ID used in t
10bd0 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 he TLS protocol
10be0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 of the given cip
10bf0 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f her */..LAPPEND_
10c00 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 INT(interp, objP
10c10 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 tr, "protocol_id
10c20 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 ", (int) SSL_CIP
10c30 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c HER_get_protocol
10c40 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 _id(cipher));...
10c50 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 /* Textual descr
10c60 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 iption of the ci
10c70 70 68 65 72 2e 20 49 6e 63 6c 75 64 65 73 3a 20 pher. Includes:
10c80 63 69 70 68 65 72 20 6e 61 6d 65 2c 20 70 72 6f cipher name, pro
10c90 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 2c 20 6b tocol version, k
10ca0 65 79 0a 09 20 20 20 65 78 63 68 61 6e 67 65 2c ey.. exchange,
10cb0 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 2c authentication,
10cc0 20 73 79 6d 6d 65 74 72 69 63 20 65 6e 63 72 79 symmetric encry
10cd0 70 74 69 6f 6e 20 6d 65 74 68 6f 64 2c 20 6d 65 ption method, me
10ce0 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 ssage authentica
10cf0 74 69 6f 6e 20 63 6f 64 65 20 2a 2f 0a 09 69 66 tion code */..if
10d00 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 (SSL_CIPHER_des
10d10 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c cription(cipher,
10d20 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 buf, sizeof(buf
10d30 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 )) != NULL) {..
10d40 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 LAPPEND_STR(i
10d50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10d60 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 description", bu
10d70 66 2c 20 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 f, -1);..}.../*
10d80 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69 Digest used duri
10d90 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 ng the SSL/TLS h
10da0 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 andshake when us
10db0 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 ing the cipher.
10dc0 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 */..md = SSL_CIP
10dd0 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b HER_get_handshak
10de0 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29 e_digest(cipher)
10df0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 ;..LAPPEND_STR(i
10e00 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 nterp, objPtr, "
10e10 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 handshake_digest
10e20 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d ", (char *)EVP_M
10e30 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b D_name(md), -1);
10e40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
10e50 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 ession info */.
10e60 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c session = SSL
10e70 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c _get_session(ssl
10e80 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 );. if (sessi
10e90 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 on != NULL) {..c
10ea0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
10eb0 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a ar *ticket;..siz
10ec0 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 e_t len2;..unsig
10ed0 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 ned int ulen;..c
10ee0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
10ef0 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 ar *session_id,
10f00 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 *proto;..unsigne
10f10 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 d char buffer[SS
10f20 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 L_MAX_MASTER_KEY
10f30 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 _LENGTH];.../* R
10f40 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 eport the select
10f50 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 ed protocol as a
10f60 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 result of the A
10f70 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 LPN negotiation
10f80 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f */..SSL_SESSION_
10f90 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 get0_alpn_select
10fa0 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f ed(session, &pro
10fb0 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 to, &len2);..LAP
10fc0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
10fd0 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c objPtr, "alpn",
10fe0 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c (char *) proto,
10ff0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 (Tcl_Size) len2
11000 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 );.../* Report t
11010 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 he selected prot
11020 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 ocol as a result
11030 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f of the NPN nego
11040 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 tiation */.#ifde
11050 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 f USE_NPN..SSL_g
11060 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e et0_next_proto_n
11070 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 egotiated(ssl, &
11080 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 proto, &ulen);..
11090 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 LAPPEND_STR(inte
110a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e rp, objPtr, "npn
110b0 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 ", (char *) prot
110c0 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c o, (Tcl_Size) ul
110d0 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a en);.#endif.../*
110e0 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 Resumable sessi
110f0 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 on */..LAPPEND_B
11100 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 OOL(interp, objP
11110 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c tr, "resumable",
11120 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f SSL_SESSION_is_
11130 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f resumable(sessio
11140 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f n));.../* Sessio
11150 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 n start time (se
11160 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 conds since epoc
11170 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c h) */..LAPPEND_L
11180 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 ONG(interp, objP
11190 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 tr, "start_time"
111a0 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 , SSL_SESSION_ge
111b0 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 t_time(session))
111c0 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 ;.../* Timeout v
111d0 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 alue - SSL_CTX_g
111e0 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 et_timeout (in s
111f0 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 econds) */..LAPP
11200 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
11210 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 objPtr, "timeou
11220 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f t", SSL_SESSION_
11230 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 get_timeout(sess
11240 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 ion));.../* Sess
11250 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 ion id - TLSv1.2
11260 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 and below only
11270 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d */..session_id =
11280 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 SSL_SESSION_get
11290 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c _id(session, &ul
112a0 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 en);..LAPPEND_BA
112b0 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a RRAY(interp, obj
112c0 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 Ptr, "session_id
112d0 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 ", session_id, (
112e0 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b Tcl_Size) ulen);
112f0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f .../* Session co
11300 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f ntext */..sessio
11310 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 n_id = SSL_SESSI
11320 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 ON_get0_id_conte
11330 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 xt(session, &ule
11340 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 n);..LAPPEND_BAR
11350 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 RAY(interp, objP
11360 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e tr, "session_con
11370 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 text", session_i
11380 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c d, (Tcl_Size) ul
11390 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f en);.../* Sessio
113a0 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e n ticket - clien
113b0 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 t only */..SSL_S
113c0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b ESSION_get0_tick
113d0 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 et(session, &tic
113e0 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 ket, &len2);..LA
113f0 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 PPEND_BARRAY(int
11400 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 erp, objPtr, "se
11410 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 ssion_ticket", t
11420 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 icket, (Tcl_Size
11430 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 ) len2);.../* Se
11440 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 ssion ticket lif
11450 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 etime hint (in s
11460 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 econds) */..LAPP
11470 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c END_LONG(interp,
11480 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 objPtr, "lifeti
11490 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e me", SSL_SESSION
114a0 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 _get_ticket_life
114b0 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f time_hint(sessio
114c0 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 n));.../* Ticket
114d0 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 app data */.#if
114e0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
114f0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 _NUMBER < 0x3000
11500 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 0000L..SSL_SESSI
11510 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 ON_get0_ticket_a
11520 70 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 ppdata((SSL_SESS
11530 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 ION *) session,
11540 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b &ticket, &len2);
11550 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 ..LAPPEND_BARRAY
11560 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11570 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 "ticket_app_dat
11580 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c a", ticket, (Tcl
11590 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 _Size) len2);.#e
115a0 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 ndif.../* Get ma
115b0 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e ster key */..len
115c0 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 2 = SSL_SESSION_
115d0 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 get_master_key(s
115e0 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 ession, buffer,
115f0 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b SSL_MAX_MASTER_K
11600 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 EY_LENGTH);..LAP
11610 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 PEND_BARRAY(inte
11620 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 rp, objPtr, "mas
11630 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 ter_key", buffer
11640 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e , (Tcl_Size) len
11650 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 2);.../* Compres
11660 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 sion id */..unsi
11670 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 gned int id = SS
11680 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f L_SESSION_get_co
11690 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f mpress_id(sessio
116a0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 n);..LAPPEND_STR
116b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
116c0 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 "compression_id
116d0 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c ", id == 1 ? "zl
116e0 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 ib" : "none", -1
116f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
11700 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 Compression inf
11710 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c o */. if (ssl
11720 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 != NULL) {.#ifd
11730 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 ef HAVE_SSL_COMP
11740 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 RESSION..const C
11750 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 OMP_METHOD *comp
11760 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d , *expn;..comp =
11770 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 SSL_get_current
11780 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c _compression(ssl
11790 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 );..expn = SSL_g
117a0 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e et_current_expan
117b0 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 sion(ssl);...LAP
117c0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c PEND_STR(interp,
117d0 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 objPtr, "compre
117e0 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 ssion", comp ? S
117f0 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 SL_COMP_get_name
11800 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c (comp) : "none",
11810 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 -1);..LAPPEND_S
11820 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 TR(interp, objPt
11830 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 r, "expansion",
11840 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f expn ? SSL_COMP_
11850 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a get_name(expn) :
11860 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 "none", -1);.#e
11870 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 lse..LAPPEND_STR
11880 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
11890 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 "compression",
118a0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 "none", -1);..LA
118b0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
118c0 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e , objPtr, "expan
118d0 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d sion", "none", -
118e0 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 1);.#endif. }
118f0 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 .. /* Server
11900 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c info */. {..l
11910 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 ong mode = SSL_C
11920 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 TX_get_session_c
11930 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 ache_mode(stateP
11940 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 tr->ctx);..char
11950 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 *msg;...if (mode
11960 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 & SSL_SESS_CACH
11970 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 E_OFF) {.. ms
11980 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c g = "off";..} el
11990 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 se if (mode & SS
119a0 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 L_SESS_CACHE_CLI
119b0 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 ENT) {.. msg
119c0 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 = "client";..} e
119d0 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 lse if (mode & S
119e0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 SL_SESS_CACHE_SE
119f0 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 RVER) {.. msg
11a00 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 = "server";..}
11a10 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 else if (mode &
11a20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 SSL_SESS_CACHE_B
11a30 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 OTH) {.. msg
11a40 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 = "both";..} els
11a50 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 e {.. msg = "
11a60 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 unknown";..}..LA
11a70 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 PPEND_STR(interp
11a80 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 , objPtr, "sessi
11a90 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 on_cache_mode",
11aa0 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a msg, -1);. }.
11ab0 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 . /* CA List
11ac0 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 */. /* IF not
11ad0 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 a server, same
11ae0 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 as SSL_get0_peer
11af0 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 _CA_list. If ser
11b00 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f ver same as SSL_
11b10 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 CTX_get_client_C
11b20 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 A_list */. li
11b30 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c stPtr = Tcl_NewL
11b40 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b istObj(0, NULL);
11b50 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 . STACK_OF(X5
11b60 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 09_NAME) *ca_lis
11b70 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c t;. if ((ca_l
11b80 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c ist = SSL_get_cl
11b90 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c ient_CA_list(ssl
11ba0 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 )) != NULL) {..c
11bb0 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 har buffer[BUFSI
11bc0 5a 5d 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69 Z];...for (int i
11bd0 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 = 0; i < sk_X50
11be0 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 9_NAME_num(ca_li
11bf0 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 st); i++) {..
11c00 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 X509_NAME *name
11c10 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f = sk_X509_NAME_
11c20 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 value(ca_list, i
11c30 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 );.. if (name
11c40 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f ) {...X509_NAME_
11c50 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 oneline(name, bu
11c60 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 ffer, BUFSIZ);..
11c70 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 .Tcl_ListObjAppe
11c80 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
11c90 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e , listPtr, Tcl_N
11ca0 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 ewStringObj(buff
11cb0 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d er, -1));.. }
11cc0 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 ..}. }. LA
11cd0 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 PPEND_OBJ(interp
11ce0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 , objPtr, "caLis
11cf0 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 t", listPtr);.
11d00 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e LAPPEND_INT(in
11d10 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 terp, objPtr, "c
11d20 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f aListCount", sk_
11d30 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 X509_NAME_num(ca
11d40 5f 6c 69 73 74 29 29 3b 0a 0a 0a 20 20 20 20 54 _list));... T
11d50 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
11d60 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
11d70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
11d80 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
11d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11dd0 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d . *. * MiscObjCm
11de0 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e d -- misc comman
11df0 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 ds. *. * Results
11e00 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
11e10 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
11e20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
11e30 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
11e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e80 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
11e90 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 .MiscObjCmd(Clie
11ea0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
11eb0 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
11ec0 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
11ed0 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
11ee0 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 objv[]) {. st
11ef0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
11f00 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b *commands [] = {
11f10 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 "req", "strreq"
11f20 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e , NULL };. en
11f30 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 um command { C_R
11f40 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f EQ, C_STRREQ, C_
11f50 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c DUMMY };. Tcl
11f60 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 _Size cmd;. i
11f70 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 nt isStr;. ch
11f80 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d ar buffer[16384]
11f90 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 ;. (void) cli
11fa0 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 entData;.. dp
11fb0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
11fc0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c .. if (objc <
11fd0 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
11fe0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
11ff0 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 1, objv, "subcom
12000 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 mand ?args?");..
12010 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
12020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
12030 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d Tcl_GetIndexFrom
12040 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
12050 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 [1], commands, "
12060 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d command", 0, &cm
12070 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a d) != TCL_OK) {.
12080 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
12090 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 R;. }.. ER
120a0 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
120b0 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 .. isStr = (c
120c0 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b md == C_STRREQ);
120d0 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e . switch ((en
120e0 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 um command) cmd)
120f0 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a {..case C_REQ:.
12100 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 .case C_STRREQ:
12110 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 {.. EVP_PKEY
12120 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 *pkey=NULL;..
12130 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c X509 *cert=NULL
12140 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 ;.. X509_NAME
12150 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 *name=NULL;..
12160 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 Tcl_Obj **list
12170 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 v;.. Tcl_Size
12180 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 listc;.. int
12190 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f i;... BIO *o
121a0 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 ut=NULL;... c
121b0 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 har *k_C="",*k_S
121c0 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f T="",*k_L="",*k_
121d0 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b O="",*k_OU="",*k
121e0 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d _CN="",*k_Email=
121f0 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b "";.. char *k
12200 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 eyout,*pemout,*s
12210 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 tr;.. int key
12220 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 size,serial=0,da
12230 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 ys=365;..#if OPE
12240 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
12250 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 BER < 0x30000000
12260 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 L.. BIGNUM *b
12270 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 ne = NULL;..
12280 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b RSA *rsa = NULL;
12290 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f .#else.. EVP_
122a0 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 PKEY_CTX *ctx =
122b0 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 NULL;.#endif...
122c0 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 if ((objc<5)
122d0 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 || (objc>6)) {..
122e0 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
122f0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a s(interp, 2, obj
12300 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 v, "keysize keyf
12310 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e ile certfile ?in
12320 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 fo?");...return
12330 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
12340 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f }... if (Tcl_
12350 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e GetIntFromObj(in
12360 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 terp, objv[2], &
12370 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f keysize) != TCL_
12380 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 OK) {...return T
12390 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
123a0 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c .. keyout=Tcl
123b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b _GetString(objv[
123c0 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3]);.. pemout
123d0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f =Tcl_GetString(o
123e0 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 bjv[4]);.. if
123f0 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c (isStr) {...Tcl
12400 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b _SetVar(interp,k
12410 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 eyout,"",0);...T
12420 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 cl_SetVar(interp
12430 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 ,pemout,"",0);..
12440 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 }... if (
12450 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 objc>=6) {...if
12460 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 (Tcl_ListObjGetE
12470 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 lements(interp,
12480 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c objv[5], &listc,
12490 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f &listv) != TCL_
124a0 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 OK) {... retu
124b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
124c0 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 }....if ((listc%
124d0 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 2) != 0) {...
124e0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 Tcl_SetResult(i
124f0 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 nterp,"Informati
12500 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 on list must hav
12510 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 e even number of
12520 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c arguments",NULL
12530 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 );... return
12540 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 TCL_ERROR;...}..
12550 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 .for (i=0; i<lis
12560 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 tc; i+=2) {...
12570 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 str=Tcl_GetStr
12580 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 ing(listv[i]);..
12590 09 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 . if (strcmp(
125a0 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 str,"days")==0)
125b0 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 {....if (Tcl_Get
125c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 IntFromObj(inter
125d0 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 p,listv[i+1],&da
125e0 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 ys)!=TCL_OK)....
125f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
12600 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c RROR;... } el
12610 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 se if (strcmp(st
12620 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 r,"serial")==0)
12630 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 {....if (Tcl_Get
12640 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 IntFromObj(inter
12650 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 p,listv[i+1],&se
12660 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 rial)!=TCL_OK)..
12670 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
12680 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 _ERROR;... }
12690 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 else if (strcmp(
126a0 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 str,"C")==0) {..
126b0 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 ..k_C=Tcl_GetStr
126c0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b ing(listv[i+1]);
126d0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
126e0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 (strcmp(str,"ST
126f0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 ")==0) {....k_ST
12700 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c =Tcl_GetString(l
12710 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 istv[i+1]);...
12720 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
12730 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 cmp(str,"L")==0)
12740 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 {....k_L=Tcl_Ge
12750 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
12760 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
12770 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 e if (strcmp(str
12780 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b ,"O")==0) {....k
12790 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 _O=Tcl_GetString
127a0 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 (listv[i+1]);...
127b0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 } else if (s
127c0 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d trcmp(str,"OU")=
127d0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 =0) {....k_OU=Tc
127e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 l_GetString(list
127f0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d v[i+1]);... }
12800 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
12810 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b (str,"CN")==0) {
12820 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 ....k_CN=Tcl_Get
12830 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 String(listv[i+1
12840 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ]);... } else
12850 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c if (strcmp(str,
12860 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 "Email")==0) {..
12870 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 ..k_Email=Tcl_Ge
12880 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b tString(listv[i+
12890 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 1]);... } els
128a0 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 e {....Tcl_SetRe
128b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b sult(interp,"Unk
128c0 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c nown parameter",
128d0 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e NULL);....return
128e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 TCL_ERROR;...
128f0 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a }...}.. }..
12900 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
12910 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 ION_NUMBER < 0x3
12920 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 0000000L.. bn
12930 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 e = BN_new();..
12940 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 rsa = RSA_new
12950 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 ();.. pkey =
12960 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a EVP_PKEY_new();.
12970 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 . if (bne ==
12980 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e NULL || rsa == N
12990 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e ULL || pkey == N
129a0 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 ULL || !BN_set_w
129b0 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 ord(bne,RSA_F4)
129c0 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 ||...!RSA_genera
129d0 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b te_key_ex(rsa, k
129e0 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c eysize, bne, NUL
129f0 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f L) || !EVP_PKEY_
12a00 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c assign_RSA(pkey,
12a10 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 rsa)) {...EVP_P
12a20 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a KEY_free(pkey);.
12a30 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 ../* RSA_free(rs
12a40 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 a); freed by EVP
12a50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 _PKEY_free */...
12a60 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
12a70 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 lse.. pkey =
12a80 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 EVP_RSA_gen((uns
12a90 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 igned int) keysi
12aa0 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 ze);.. ctx =
12ab0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 EVP_PKEY_CTX_new
12ac0 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 (pkey,NULL);..
12ad0 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 if (pkey == NU
12ae0 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c LL || ctx == NUL
12af0 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b L || !EVP_PKEY_k
12b00 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 eygen_init(ctx)
12b10 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 ||...!EVP_PKEY_C
12b20 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 TX_set_rsa_keyge
12b30 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 n_bits(ctx, keys
12b40 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 ize) || !EVP_PKE
12b50 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 Y_keygen(ctx, &p
12b60 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b key)) {...EVP_PK
12b70 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 EY_free(pkey);..
12b80 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 .EVP_PKEY_CTX_fr
12b90 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a ee(ctx);.#endif.
12ba0 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
12bb0 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 interp,"Error ge
12bc0 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 nerating private
12bd0 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 key",NULL);...r
12be0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
12bf0 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
12c00 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 .if (isStr) {...
12c10 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 out=BIO_new(
12c20 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 BIO_s_mem());...
12c30 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 PEM_write_bi
12c40 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 o_PrivateKey(out
12c50 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c ,pkey,NULL,NULL,
12c60 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 0,NULL,NULL);...
12c70 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f i=BIO_read(o
12c80 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 ut,buffer,sizeof
12c90 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 (buffer)-1);...
12ca0 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a i=(i<0) ? 0 :
12cb0 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 i;... buffer
12cc0 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 [i]='\0';...
12cd0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 Tcl_SetVar(inter
12ce0 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c p,keyout,buffer,
12cf0 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 0);... BIO_fl
12d00 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 ush(out);...
12d10 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 BIO_free(out);..
12d20 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 .} else {...
12d30 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f out=BIO_new(BIO_
12d40 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 s_file());...
12d50 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e BIO_write_filen
12d60 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b ame(out,keyout);
12d70 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 ... PEM_write
12d80 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 _bio_PrivateKey(
12d90 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 out,pkey,NULL,NU
12da0 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b LL,0,NULL,NULL);
12db0 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 ... /* PEM_wr
12dc0 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 ite_bio_RSAPriva
12dd0 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 teKey(out, rsa,
12de0 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e NULL, NULL, 0, N
12df0 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 ULL, NULL); */..
12e00 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c . BIO_free_al
12e10 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 l(out);.. .}....
12e20 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e if ((cert=X509_n
12e30 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 ew())==NULL) {..
12e40 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 . Tcl_SetResu
12e50 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 lt(interp,"Error
12e60 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 generating cert
12e70 69 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 ificate request"
12e80 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 ,NULL);... EV
12e90 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 P_PKEY_free(pkey
12ea0 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 );.#if OPENSSL_V
12eb0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 ERSION_NUMBER <
12ec0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 0x30000000L...
12ed0 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a BN_free(bne);.
12ee0 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 #endif... ret
12ef0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
12f00 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 .}....X509_set_v
12f10 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a ersion(cert,2);.
12f20 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 ..ASN1_INTEGER_s
12f30 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 et(X509_get_seri
12f40 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 alNumber(cert),s
12f50 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 erial);...X509_g
12f60 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
12f70 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 etm_notBefore(ce
12f80 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 rt),0);...X509_g
12f90 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 mtime_adj(X509_g
12fa0 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 etm_notAfter(cer
12fb0 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 t),(long)60*60*2
12fc0 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 4*days);...X509_
12fd0 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c set_pubkey(cert,
12fe0 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 pkey);....name=X
12ff0 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 509_get_subject_
13000 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 name(cert);....X
13010 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 509_NAME_add_ent
13020 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 ry_by_txt(name,"
13030 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 C", MBSTRING_ASC
13040 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 , (const unsigne
13050 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d d char *) k_C, -
13060 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
13070 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
13080 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 _by_txt(name,"ST
13090 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c ", MBSTRING_ASC,
130a0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
130b0 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d char *) k_ST, -
130c0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 1, -1, 0);...X50
130d0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 9_NAME_add_entry
130e0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 _by_txt(name,"L"
130f0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
13100 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
13110 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c char *) k_L, -1,
13120 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f -1, 0);...X509_
13130 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 NAME_add_entry_b
13140 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 y_txt(name,"O",
13150 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 MBSTRING_ASC, (c
13160 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
13170 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d ar *) k_O, -1, -
13180 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
13190 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
131a0 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d txt(name,"OU", M
131b0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
131c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
131d0 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d r *) k_OU, -1, -
131e0 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
131f0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
13200 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d txt(name,"CN", M
13210 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f BSTRING_ASC, (co
13220 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
13230 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d r *) k_CN, -1, -
13240 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 1, 0);...X509_NA
13250 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f ME_add_entry_by_
13260 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 txt(name,"Email"
13270 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 , MBSTRING_ASC,
13280 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
13290 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c char *) k_Email,
132a0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 -1, -1, 0);....
132b0 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 X509_set_subject
132c0 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 _name(cert,name)
132d0 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 ;....if (!X509_s
132e0 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 ign(cert,pkey,EV
132f0 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 P_sha256())) {..
13300 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 . X509_free(c
13310 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f ert);... EVP_
13320 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b PKEY_free(pkey);
13330 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 .#if OPENSSL_VER
13340 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 SION_NUMBER < 0x
13350 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 30000000L...
13360 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 BN_free(bne);.#e
13370 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 ndif... Tcl_S
13380 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c etResult(interp,
13390 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 "Error signing c
133a0 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c ertificate",NULL
133b0 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 );... return
133c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a TCL_ERROR;...}..
133d0 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 ..if (isStr) {..
133e0 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
133f0 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 (BIO_s_mem());..
13400 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 . PEM_write_b
13410 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 io_X509(out,cert
13420 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 );... i=BIO_r
13430 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 ead(out,buffer,s
13440 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 izeof(buffer)-1)
13450 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 ;... i=(i<0)
13460 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 ? 0 : i;... b
13470 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 uffer[i]='\0';..
13480 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 . Tcl_SetVar(
13490 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 interp,pemout,bu
134a0 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 ffer,0);... B
134b0 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 IO_flush(out);..
134c0 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 . BIO_free(ou
134d0 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t);...} else {..
134e0 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 . out=BIO_new
134f0 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a (BIO_s_file());.
13500 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f .. BIO_write_
13510 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d filename(out,pem
13520 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f out);... PEM_
13530 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f write_bio_X509(o
13540 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 ut,cert);...
13550 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 BIO_free_all(out
13560 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 );...}....X509_f
13570 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 ree(cert);...EVP
13580 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 _PKEY_free(pkey)
13590 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 ;.#if OPENSSL_VE
135a0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 RSION_NUMBER < 0
135b0 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f x30000000L...BN_
135c0 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 free(bne);.#endi
135d0 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 f.. }..}..bre
135e0 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
135f0 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 ..break;. }.
13600 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
13610 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ;.}.../*********
13620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 ***********/./*
13630 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 Init
13640 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a */./***********
13650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
13660 2a 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 2d 2d 2d ----------------
13690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
136a0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 ----. *. * Tls_F
136b0 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 ree --. *. *.Thi
136c0 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 s procedure clea
136d0 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c ns up when a SSL
136e0 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 socket based ch
136f0 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 annel. *.is clos
13700 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 ed and its refer
13710 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 ence count falls
13720 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 below 1. *. * R
13730 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a esults:. *.none.
13740 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
13750 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c ts:. *.Frees all
13760 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a the state. *. *
13770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
137a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
137b0 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 ---. */.void.Tls
137c0 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 _Free(char *bloc
137d0 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 kPtr) {. Stat
137e0 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
137f0 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b tate *)blockPtr;
13800 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
13810 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c alled");.. Tl
13820 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 s_Clean(statePtr
13830 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c );. ckfree(bl
13840 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a ockPtr);.}.../*.
13850 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
13860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13890 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
138a0 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 Clean --. *. *.T
138b0 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c his procedure cl
138c0 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 eans up when a S
138d0 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 SL socket based
138e0 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c channel. *.is cl
138f0 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 osed and its ref
13900 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c erence count fal
13910 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 ls below 1. Thi
13920 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 s should. *.be c
13930 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 alled synchronou
13940 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 sly by the Close
13950 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 Proc, not in the
13960 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 . *.EventuallyFr
13970 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a ee callback.. *.
13980 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e * Results:. *.n
13990 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 one. *. * Side e
139a0 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 ffects:. *.Frees
139b0 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 all the state.
139c0 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
139f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a00 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 -------. */.void
13a10 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 Tls_Clean(State
13a20 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 *statePtr) {.
13a30 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
13a40 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 d");.. /*.
13a50 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 * we're assumi
13a60 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 ng here that we'
13a70 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 re single-thread
13a80 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 ed. */. i
13a90 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d f (statePtr->tim
13aa0 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 er != (Tcl_Timer
13ab0 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 Token) NULL) {..
13ac0 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 Tcl_DeleteTimerH
13ad0 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d andler(statePtr-
13ae0 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 >timer);..stateP
13af0 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c tr->timer = NULL
13b00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
13b10 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f (statePtr->proto
13b20 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 s) {..ckfree(sta
13b30 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a tePtr->protos);.
13b40 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f .statePtr->proto
13b50 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a s = NULL;. }.
13b60 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
13b70 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 ->bio) {../* Thi
13b80 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f s will call SSL_
13b90 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 shutdown. Bug 14
13ba0 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 14045 */..dprint
13bb0 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 f("BIO_free_all(
13bc0 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e %p)", statePtr->
13bd0 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f bio);..BIO_free_
13be0 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 all(statePtr->bi
13bf0 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 o);..statePtr->b
13c00 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d io = NULL;. }
13c10 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
13c20 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e r->ssl) {..dprin
13c30 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 tf("SSL_free(%p)
13c40 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ", statePtr->ssl
13c50 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 );..SSL_free(sta
13c60 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 tePtr->ssl);..st
13c70 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 atePtr->ssl = NU
13c80 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 LL;. }. if
13c90 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 (statePtr->ctx)
13ca0 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 {..SSL_CTX_free
13cb0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b (statePtr->ctx);
13cc0 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 ..statePtr->ctx
13cd0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 = NULL;. }.
13ce0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
13cf0 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c callback) {..Tcl
13d00 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 _DecrRefCount(st
13d10 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b atePtr->callback
13d20 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 );..statePtr->ca
13d30 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 llback = NULL;.
13d40 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
13d50 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 tePtr->password)
13d60 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
13d70 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 ount(statePtr->p
13d80 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 assword);..state
13d90 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 Ptr->password =
13da0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
13db0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 if (statePtr->vc
13dc0 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 md) {..Tcl_DecrR
13dd0 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 efCount(statePtr
13de0 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 ->vcmd);..stateP
13df0 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b tr->vcmd = NULL;
13e00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
13e10 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 ntf("Returning")
13e20 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
13e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e70 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e -. *. * Build In
13e80 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a fo Command --. *
13e90 0a 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 . *.Create comma
13ea0 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69 nd to return bui
13eb0 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b ld info for pack
13ec0 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c age.. *. * Resul
13ed0 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
13ee0 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a d Tcl result. *.
13ef0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
13f00 0a 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c . *.Created buil
13f10 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a d-info command..
13f20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
13f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
13f70 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 .#ifndef STRINGI
13f80 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 FY.# define STR
13f90 49 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 INGIFY(x) STRING
13fa0 49 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e IFY1(x).# defin
13fb0 65 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 e STRINGIFY1(x)
13fc0 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 #x.#endif..int.B
13fd0 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 uildInfoCommand(
13fe0 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 Tcl_Interp* inte
13ff0 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d rp) {. Tcl_Cm
14000 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 dInfo info;..
14010 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d if (Tcl_GetComm
14020 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 andInfo(interp,
14030 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e "::tcl::build-in
14040 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 fo", &info)) {..
14050 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
14060 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a mand(interp, "::
14070 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 tls::build-info"
14080 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 , info.objProc,
14090 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b (void *)(...PACK
140a0 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 AGE_VERSION "+"
140b0 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 STRINGIFY(TLS_VE
140c0 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 RSION_UUID).#if
140d0 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f defined(__clang_
140e0 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f _) && defined(__
140f0 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 clang_major__)..
14100 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 .. ".clang-"
14110 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e STRINGIFY(__clan
14120 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f g_major__).#if _
14130 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c _clang_minor__ <
14140 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 10.... "0".#
14150 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 endif.... STR
14160 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d INGIFY(__clang_m
14170 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 inor__).#endif.#
14180 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c if defined(__cpl
14190 75 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 usplus) && !defi
141a0 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 ned(__OBJC__)...
141b0 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 . ".cplusplus
141c0 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 ".#endif.#ifndef
141d0 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 NDEBUG.... "
141e0 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 .debug".#endif.#
141f0 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c if !defined(__cl
14200 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e ang__) && !defin
14210 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 ed(__INTEL_COMPI
14220 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 LER) && defined(
14230 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 __GNUC__)....
14240 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 ".gcc-" STRINGI
14250 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 FY(__GNUC__).#if
14260 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 __GNUC_MINOR__
14270 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a < 10.... "0".
14280 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 #endif.... ST
14290 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d RINGIFY(__GNUC_M
142a0 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 INOR__).#endif.#
142b0 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f ifdef __INTEL_CO
142c0 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e MPILER.... ".
142d0 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 icc-" STRINGIFY(
142e0 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 __INTEL_COMPILER
142f0 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
14300 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 TCL_MEM_DEBUG...
14310 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 . ".memdebug"
14320 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
14330 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 ned(_MSC_VER)...
14340 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 . ".msvc-" ST
14350 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 RINGIFY(_MSC_VER
14360 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
14370 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 USE_NMAKE....
14380 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 ".nmake".#endif
14390 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 .#ifndef TCL_CFG
143a0 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 _OPTIMIZED....
143b0 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 ".no-optimize"
143c0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
143d0 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 _OBJC__.... "
143e0 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 .objective-c".#i
143f0 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 f defined(__cplu
14400 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 splus).... "p
14410 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a lusplus".#endif.
14420 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 #endif.#ifdef TC
14430 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 L_CFG_PROFILED..
14440 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 .. ".profile"
14450 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 .#endif.#ifdef P
14460 55 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 URIFY.... ".p
14470 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 urify".#endif.#i
14480 66 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c fdef STATIC_BUIL
14490 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 D.... ".stati
144a0 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e c".#endif...), N
144b0 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ULL);. }.
144c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
144d0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
14520 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a * Tls_Init --. *
14530 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 . *.This is a pa
14540 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 ckage initializa
14550 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 tion procedure,
14560 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a which is called.
14570 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 *.by Tcl when t
14580 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 his package is t
14590 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e o be added to an
145a0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a interpreter.. *
145b0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 . * Results: Ss
145c0 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 l configured and
145d0 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 loaded. *. * Si
145e0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 de effects:. *.
145f0 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 create the ssl c
14600 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 ommand, initiali
14610 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 ze ssl context.
14620 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
14630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14660 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 -------. */..#if
14670 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 TCL_MAJOR_VERSI
14680 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d ON > 8.#define M
14690 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 IN_VERSION "9.0"
146a0 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d .#else.#define M
146b0 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 IN_VERSION "8.5"
146c0 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 .#endif..static
146d0 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 const char tlsTc
146e0 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 lInitScript[] =
146f0 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e {.#include "tls.
14700 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 tcl.h"..0x00.
14710 20 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 };..DLLEXPORT i
14720 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f nt Tls_Init(Tcl_
14730 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 Interp *interp)
14740 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
14750 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 Called");..#ifde
14760 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a f USE_TCL_STUBS.
14770 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 if (Tcl_Init
14780 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 Stubs(interp, MI
14790 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d N_VERSION, 0) ==
147a0 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
147b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
147c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 }.#endif. if
147d0 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 (Tcl_PkgRequire(
147e0 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d interp, "Tcl", M
147f0 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d IN_VERSION, 0) =
14800 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
14810 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
14820 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c }.. if (TlsL
14830 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c ibInit(0) != TCL
14840 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _OK) {..Tcl_Appe
14850 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
14860 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 "could not init
14870 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 ialize SSL libra
14880 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 ry", (char *) NU
14890 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
148a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
148b0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
148c0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
148d0 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 "::tls::connecti
148e0 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 on", ConnectionI
148f0 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 nfoObjCmd, (Clie
14900 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
14910 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
14920 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
14930 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
14940 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
14950 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 ls::handshake",
14960 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c HandshakeObjCmd,
14970 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
14980 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
14990 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
149a0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
149b0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
149c0 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 , "::tls::import
149d0 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c ", ImportObjCmd,
149e0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
149f0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
14a00 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
14a10 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
14a20 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
14a30 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c , "::tls::misc",
14a40 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c MiscObjCmd, (Cl
14a50 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
14a60 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
14a70 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
14a80 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
14a90 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
14aa0 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c :tls::unimport",
14ab0 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c UnimportObjCmd,
14ac0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
14ad0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
14ae0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
14af0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
14b00 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
14b10 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75 73 , "::tls::status
14b20 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c ", StatusObjCmd,
14b30 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
14b40 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
14b50 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
14b60 0a 0a 20 20 20 20 42 75 69 6c 64 49 6e 66 6f 43 .. BuildInfoC
14b70 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29 3b 0a ommand(interp);.
14b80 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74 43 6f Tls_DigestCo
14b90 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a mmands(interp);.
14ba0 20 20 20 20 54 6c 73 5f 45 6e 63 72 79 70 74 43 Tls_EncryptC
14bb0 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b ommands(interp);
14bc0 0a 20 20 20 20 54 6c 73 5f 49 6e 66 6f 43 6f 6d . Tls_InfoCom
14bd0 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 mands(interp);.
14be0 20 20 20 54 6c 73 5f 4b 44 46 43 6f 6d 6d 61 6e Tls_KDFComman
14bf0 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 ds(interp);.
14c00 54 6c 73 5f 52 61 6e 64 43 6f 6d 6d 61 6e 64 73 Tls_RandCommands
14c10 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 (interp);.. i
14c20 66 20 28 69 6e 74 65 72 70 20 26 26 20 54 63 6c f (interp && Tcl
14c30 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c _Eval(interp, tl
14c40 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 20 sTclInitScript)
14c50 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
14c60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
14c70 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 }.. retur
14c80 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 n Tcl_PkgProvide
14c90 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 (interp, PACKAGE
14ca0 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 _NAME, PACKAGE_V
14cb0 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 ERSION);.}../*.
14cc0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
14cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14cf0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 -------*. *. *.T
14d00 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 ls_SafeInit --.
14d10 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *.-----------
14d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14d40 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 -----*. *.Standa
14d50 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 rd procedure req
14d60 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e uired by 'load'.
14d70 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 . *.Initializes
14d80 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 this extension f
14d90 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 or a safe interp
14da0 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d reter.. *.------
14db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
14de0 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a *.Side effects:.
14df0 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 *..As of 'Tls_I
14e00 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c nit'. *. *.Resul
14e10 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 t:. *..A standar
14e20 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 d Tcl error code
14e30 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
14e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
14e70 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 */.DLLEXPORT int
14e80 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 Tls_SafeInit(Tc
14e90 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
14ea0 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ) {. dprintf(
14eb0 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 "Called");. r
14ec0 65 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 eturn Tls_Init(i
14ed0 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a nterp);.}../*. *
14ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f10 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c ------*. *. *.Tl
14f20 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 sLibInit --. *.
14f30 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.--------------
14f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14f60 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a --*. *.Initializ
14f70 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f es SSL library o
14f80 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 nce per applicat
14f90 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d ion. *.---------
14fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14fc0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 -------*. *. *.S
14fd0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
14fe0 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c .initializes SSL
14ff0 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 library. *. *.R
15000 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a esult:. *..none.
15010 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
15020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f -----------*. */
15050 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c .static int TlsL
15060 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 ibInit(int unini
15070 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 tialize) {. s
15080 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 tatic int initia
15090 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 lized = 0;. i
150a0 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f nt status = TCL_
150b0 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 OK;.#if defined(
150c0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
150d0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
150e0 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a THREADS). siz
150f0 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 e_t num_locks;.#
15100 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 endif.. if (u
15110 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 ninitialize) {..
15120 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 if (!initialized
15130 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
15140 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 ("Asked to unini
15150 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 tialize, but we
15160 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 are not initiali
15170 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 zed");... ret
15180 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a urn TCL_OK;..}..
15190 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 .dprintf("Asked
151a0 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 to uninitialize"
151b0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 );..#if defined(
151c0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
151d0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
151e0 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 THREADS)..Tcl_Mu
151f0 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 texLock(&init_mx
15200 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 );...if (locks)
15210 7b 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b {.. free(lock
15220 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d s);.. locks =
15230 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b NULL;.. lock
15240 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 sCount = 0;..}.#
15250 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a endif..initializ
15260 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 ed = 0;..#if def
15270 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 ined(OPENSSL_THR
15280 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 EADS) && defined
15290 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 (TCL_THREADS)..T
152a0 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
152b0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 init_mx);.#endif
152c0 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b ...return TCL_OK
152d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
152e0 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a (initialized) {.
152f0 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 .dprintf("Called
15300 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 , but using cach
15310 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 ed value");..ret
15320 75 72 6e 20 73 74 61 74 75 73 3b 0a 20 20 20 20 urn status;.
15330 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }.. dprintf("
15340 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 Called");..#if d
15350 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 efined(OPENSSL_T
15360 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e HREADS) && defin
15370 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a ed(TCL_THREADS).
15380 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 Tcl_MutexLoc
15390 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e k(&init_mx);.#en
153a0 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 dif. initiali
153b0 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 zed = 1;..#if de
153c0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 fined(OPENSSL_TH
153d0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 READS) && define
153e0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 d(TCL_THREADS).
153f0 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 num_locks = 1
15400 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 ;. locksCount
15410 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 = (int) num_loc
15420 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 ks;. locks =
15430 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c malloc(sizeof(*l
15440 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b ocks) * num_lock
15450 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c s);. memset(l
15460 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 ocks, 0, sizeof(
15470 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f *locks) * num_lo
15480 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 cks);.#endif..
15490 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 /* Initialize
154a0 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 BOTH libcrypto a
154b0 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 nd libssl. */.
154c0 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 OPENSSL_init_s
154d0 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f sl(OPENSSL_INIT_
154e0 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 LOAD_SSL_STRINGS
154f0 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f | OPENSSL_INIT_
15500 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 LOAD_CRYPTO_STRI
15510 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 NGS..| OPENSSL_I
15520 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 NIT_ADD_ALL_CIPH
15530 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e ERS | OPENSSL_IN
15540 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 IT_ADD_ALL_DIGES
15550 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 TS, NULL);..
15560 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c BIO_new_tcl(NULL
15570 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 , 0);..#if 0.
15580 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 /*. * XXX:T
15590 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 ODO: Remove this
155a0 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 code and replac
155b0 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 e it with a chec
155c0 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f k. * for eno
155d0 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 ugh entropy and
155e0 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 do not try to cr
155f0 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 eate our own.
15600 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 * terrible ent
15610 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ropy. */.
15620 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 /*. * Seed
15630 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 the random numbe
15640 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 r generator in t
15650 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a he SSL library,.
15660 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 * using the
15670 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 do/while constr
15680 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 uct because of t
15690 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 he bug note in t
156a0 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 he. * OpenSS
156b0 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f L FAQ at http://
156c0 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f www.openssl.org/
156d0 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c support/faq.html
156e0 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 #USER1. *.
156f0 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 * The crux of
15700 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 the problem is
15710 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 that Solaris 7 d
15720 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 oes not have a.
15730 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f * /dev/rando
15740 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f m or /dev/urando
15750 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 m device so it c
15760 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f annot gather eno
15770 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f ugh. * entro
15780 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 py from the RAND
15790 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 _seed() when TLS
157a0 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 initializes and
157b0 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 refuses. *
157c0 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 to go further. E
157d0 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 arlier versions
157e0 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 of OpenSSL carri
157f0 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 ed on regardless
15800 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 .. */. sr
15810 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e and((unsigned in
15820 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 t) time((time_t
15830 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 *) NULL));. d
15840 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b o {..for (i = 0;
15850 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a i < 16; i++) {.
15860 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d . rnd_seed[i]
15870 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 = 1 + (char) (2
15880 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 55.0 * rand()/(R
15890 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 AND_MAX+1.0));..
158a0 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 }..RAND_seed(rnd
158b0 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e _seed, sizeof(rn
158c0 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 d_seed));. }
158d0 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 while (RAND_stat
158e0 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 us() != 1);.#end
158f0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 if..#if defined(
15900 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 OPENSSL_THREADS)
15910 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f && defined(TCL_
15920 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c THREADS). Tcl
15930 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e _MutexUnlock(&in
15940 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a it_mx);.#endif..
15950 20 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 75 return statu
15960 73 3b 0a 7d 0a s;.}.