0000: 2f 2a 0a 20 2a 20 49 6e 66 6f 72 6d 61 74 69 6f /*. * Informatio
0010: 6e 20 43 6f 6d 6d 61 6e 64 73 20 4d 6f 64 75 6c n Commands Modul
0020: 65 0a 20 2a 0a 20 2a 20 50 72 6f 76 69 64 65 73 e. *. * Provides
0030: 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 72 commands that r
0040: 65 74 75 72 6e 20 69 6e 66 6f 20 72 65 6c 61 74 eturn info relat
0050: 65 64 20 74 6f 20 74 68 65 20 4f 70 65 6e 53 53 ed to the OpenSS
0060: 4c 20 63 6f 6e 66 69 67 20 61 6e 64 20 64 61 74 L config and dat
0070: 61 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 a.. *. * Copyrig
0080: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61 ht (C) 2023 Bria
0090: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a 2f n O'Hagan. *. */
00a0: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 ..#include "tlsI
00b0: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 nt.h".#include "
00c0: 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63 6c tclOpts.h".#incl
00d0: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 ude <openssl/cry
00e0: 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 pto.h>.#include
00f0: 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a <openssl/ssl.h>.
0100: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 #include <openss
0110: 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e 0a 0a l/safestack.h>..
0120: 2f 2a 0a 20 2a 20 56 61 6c 69 64 20 53 53 4c 20 /*. * Valid SSL
0130: 61 6e 64 20 54 4c 53 20 50 72 6f 74 6f 63 6f 6c and TLS Protocol
0140: 20 56 65 72 73 69 6f 6e 73 0a 20 2a 2f 0a 73 74 Versions. */.st
0150: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
0160: 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b *protocols[] = {
0170: 0a 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 .."ssl2", "ssl3"
0180: 2c 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e , "tls1", "tls1.
0190: 31 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 1", "tls1.2", "t
01a0: 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a ls1.3", NULL.};.
01b0: 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a enum protocol {.
01c0: 20 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c TLS_SSL2, TL
01d0: 53 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 S_SSL3, TLS_TLS1
01e0: 2c 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c , TLS_TLS1_1, TL
01f0: 53 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c S_TLS1_2, TLS_TL
0200: 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d S1_3, TLS_NONE.}
0210: 3b 0a 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ;.../*. *-------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
0260: 20 2a 20 4e 61 6d 65 73 43 61 6c 6c 62 61 63 6b * NamesCallback
0270: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 62 61 --. *. *.Callba
0280: 63 6b 20 74 6f 20 61 64 64 20 61 6c 67 6f 72 69 ck to add algori
0290: 74 68 6d 20 6f 72 20 6d 65 74 68 6f 64 20 6e 61 thm or method na
02a0: 6d 65 73 20 74 6f 20 61 20 54 43 4c 20 6c 69 73 mes to a TCL lis
02b0: 74 20 6f 62 6a 65 63 74 2e 0a 20 2a 0a 20 2a 20 t object.. *. *
02c0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 70 70 65 Results:. *.Appe
02d0: 6e 64 20 6e 61 6d 65 20 74 6f 20 54 43 4c 20 6c nd name to TCL l
02e0: 69 73 74 20 6f 62 6a 65 63 74 2e 0a 20 2a 0a 20 ist object.. *.
02f0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0300: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0350: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4e 61 6d 65 73 -. */.void Names
0360: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 4f Callback(const O
0370: 42 4a 5f 4e 41 4d 45 20 2a 6f 62 6a 2c 20 76 6f BJ_NAME *obj, vo
0380: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 54 id *arg) {. T
0390: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d cl_Obj *objPtr =
03a0: 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 61 72 67 (Tcl_Obj *) arg
03b0: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 ;.. /* Fields
03c0: 3a 20 28 69 6e 74 29 20 74 79 70 65 20 61 6e 64 : (int) type and
03d0: 20 61 6c 69 61 73 2c 20 28 63 6f 6e 73 74 20 63 alias, (const c
03e0: 68 61 72 2a 29 20 6e 61 6d 65 20 61 6e 64 20 64 har*) name and d
03f0: 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 31 ata */. if (1
0400: 20 7c 7c 20 21 6f 62 6a 2d 3e 61 6c 69 61 73 29 || !obj->alias)
0410: 20 7b 0a 09 2f 2a 20 46 69 6c 74 65 72 20 6f 75 {../* Filter ou
0420: 74 20 73 69 67 6e 65 64 20 64 69 67 65 73 74 73 t signed digests
0430: 20 28 61 2e 6b 2e 61 20 73 69 67 6e 61 74 75 72 (a.k.a signatur
0440: 65 20 61 6c 67 6f 72 69 74 68 6d 73 29 20 2a 2f e algorithms) */
0450: 0a 09 69 66 20 28 73 74 72 73 74 72 28 6f 62 6a ..if (strstr(obj
0460: 2d 3e 6e 61 6d 65 2c 20 22 72 73 61 22 29 20 3d ->name, "rsa") =
0470: 3d 20 4e 55 4c 4c 20 26 26 20 73 74 72 73 74 72 = NULL && strstr
0480: 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 20 22 52 53 41 (obj->name, "RSA
0490: 22 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ") == NULL) {..
04a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
04b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c pendElement(NULL
04c0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
04d0: 77 53 74 72 69 6e 67 4f 62 6a 28 6f 62 6a 2d 3e wStringObj(obj->
04e0: 6e 61 6d 65 2c 2d 31 29 29 3b 0a 09 7d 0a 20 20 name,-1));..}.
04f0: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d }.}.../*. *---
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0540: 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 . *. * CiphersOb
0550: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
0560: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
0570: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
0580: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 ss the "tls::cip
0590: 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a hers" command. *
05a0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 .to list availab
05b0: 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 le ciphers, base
05c0: 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 d upon protocol
05d0: 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 selected.. *. *
05e0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
05f0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
0600: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 t list.. *. * Si
0610: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 de effects:. *.c
0620: 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 onstructs and de
0630: 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 stroys SSL conte
0640: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d xt (CTX). *. *--
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0690: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
06a0: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 CiphersObjCmd(C
06b0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
06c0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
06d0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
06e0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
06f0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
0700: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 SSL_CTX *ctx =
0710: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 NULL;. SSL *s
0720: 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 sl = NULL;. S
0730: 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 TACK_OF(SSL_CIPH
0740: 45 52 29 20 2a 73 6b 20 3d 20 4e 55 4c 4c 3b 0a ER) *sk = NULL;.
0750: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 int index, v
0760: 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f erbose = 0, use_
0770: 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 0a supported = 0;..
0780: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
0790: 6c 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e led");..#if OPEN
07a0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 SSL_VERSION_NUMB
07b0: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c ER < 0x10100000L
07c0: 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 . OpenSSL_add
07d0: 5f 61 6c 6c 5f 63 69 70 68 65 72 73 28 29 3b 20 _all_ciphers();
07e0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 /* Make sure the
07f0: 79 27 72 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 23 y're loaded */.#
0800: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6c endif.. /* Cl
0810: 65 61 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 ear errors */.
0820: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c Tcl_ResetResul
0830: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 t(interp);. E
0840: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
0850: 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 ;.. /* Valida
0860: 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a te arg count */.
0870: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3e 20 34 if (objc > 4
0880: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
0890: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
08a0: 20 6f 62 6a 76 2c 20 22 3f 70 72 6f 74 6f 63 6f objv, "?protoco
08b0: 6c 3f 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 l? ?verbose? ?su
08c0: 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 pported?");..ret
08d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
08e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 73 }.. /* Lis
08f0: 74 20 61 6c 6c 20 63 69 70 68 65 72 73 20 2a 2f t all ciphers */
0900: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
0910: 20 31 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 1) {..Tcl_Obj *
0920: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 objPtr = Tcl_New
0930: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 ListObj(0, NULL)
0940: 3b 0a 0a 09 4f 42 4a 5f 4e 41 4d 45 5f 64 6f 5f ;...OBJ_NAME_do_
0950: 61 6c 6c 28 4f 42 4a 5f 4e 41 4d 45 5f 54 59 50 all(OBJ_NAME_TYP
0960: 45 5f 43 49 50 48 45 52 5f 4d 45 54 48 2c 20 4e E_CIPHER_METH, N
0970: 61 6d 65 73 43 61 6c 6c 62 61 63 6b 2c 20 28 76 amesCallback, (v
0980: 6f 69 64 20 2a 29 20 6f 62 6a 50 74 72 29 3b 0a oid *) objPtr);.
0990: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
09a0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
09b0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f );..return TCL_O
09c0: 4b 3b 0a 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f K;.. }.. /
09d0: 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 20 2a 2f * Get options */
09e0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
09f0: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 IndexFromObj(int
0a00: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 erp, objv[1], pr
0a10: 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 otocols, "protoc
0a20: 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 ol", 0, &index)
0a30: 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c 0a 09 28 6f != TCL_OK ||..(o
0a40: 62 6a 63 20 3e 20 32 20 26 26 20 54 63 6c 5f 47 bjc > 2 && Tcl_G
0a50: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a etBooleanFromObj
0a60: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d (interp, objv[2]
0a70: 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 , &verbose) != T
0a80: 43 4c 5f 4f 4b 29 20 7c 7c 0a 09 28 6f 62 6a 63 CL_OK) ||..(objc
0a90: 20 3e 20 33 20 26 26 20 54 63 6c 5f 47 65 74 42 > 3 && Tcl_GetB
0aa0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e ooleanFromObj(in
0ab0: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 terp, objv[3], &
0ac0: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 use_supported) !
0ad0: 3d 20 54 43 4c 5f 4f 4b 29 29 20 7b 0a 09 72 65 = TCL_OK)) {..re
0ae0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
0af0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 }.. switc
0b00: 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f h ((enum protoco
0b10: 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 l)index) {..case
0b20: 20 54 4c 53 5f 53 53 4c 32 3a 0a 09 20 20 20 20 TLS_SSL2:..
0b30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
0b40: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f (interp, protoco
0b50: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 ls[index], ": pr
0b60: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f otocol not suppo
0b70: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 rted", NULL);..
0b80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
0b90: 52 4f 52 3b 0a 09 63 61 73 65 20 54 4c 53 5f 53 ROR;..case TLS_S
0ba0: 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 SL3:.#if defined
0bb0: 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 (NO_SSL3) || def
0bc0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
0bd0: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 SSL3) || defined
0be0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 (OPENSSL_NO_SSL3
0bf0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 _METHOD).. Tc
0c00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
0c10: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 nterp, protocols
0c20: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 [index], ": prot
0c30: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 ocol not support
0c40: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ed", NULL);..
0c50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
0c60: 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 R;.#else.
0c70: 20 20 20 20 20 6d 69 6e 5f 76 65 72 73 69 6f 6e min_version
0c80: 20 3d 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3b = SSL3_VERSION;
0c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 78 . max
0ca0: 5f 76 65 72 73 69 6f 6e 20 3d 20 53 53 4c 33 5f _version = SSL3_
0cb0: 56 45 52 53 49 4f 4e 3b 0a 09 20 20 20 20 62 72 VERSION;.. br
0cc0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 eak;.#endif..cas
0cd0: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 e TLS_TLS1:.#if
0ce0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 defined(NO_TLS1)
0cf0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e || defined(OPEN
0d00: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 SSL_NO_TLS1) ||
0d10: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
0d20: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a NO_TLS1_METHOD).
0d30: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
0d40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
0d50: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
0d60: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
0d70: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
0d80: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
0d90: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e 5f min_
0db0: 76 65 72 73 69 6f 6e 20 3d 20 54 4c 53 31 5f 56 version = TLS1_V
0dc0: 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 ERSION;.
0dd0: 20 20 20 20 6d 61 78 5f 76 65 72 73 69 6f 6e 20 max_version
0de0: 3d 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3b 0a = TLS1_VERSION;.
0df0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 . break;.#end
0e00: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 if..case TLS_TLS
0e10: 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 1_1:.#if defined
0e20: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 (NO_TLS1_1) || d
0e30: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e efined(OPENSSL_N
0e40: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 O_TLS1_1) || def
0e50: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f ined(OPENSSL_NO_
0e60: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 TLS1_1_METHOD)..
0e70: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
0e80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f sult(interp, pro
0e90: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 tocols[index], "
0ea0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 : protocol not s
0eb0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 upported", NULL)
0ec0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
0ed0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 L_ERROR;.#else.
0ee0: 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e 5f 76 min_v
0ef0: 65 72 73 69 6f 6e 20 3d 20 54 4c 53 31 5f 31 5f ersion = TLS1_1_
0f00: 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 VERSION;.
0f10: 20 20 20 20 20 6d 61 78 5f 76 65 72 73 69 6f 6e max_version
0f20: 20 3d 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f = TLS1_1_VERSIO
0f30: 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 N;.. break;.#
0f40: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
0f50: 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 TLS1_2:.#if defi
0f60: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c ned(NO_TLS1_2) |
0f70: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
0f80: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 L_NO_TLS1_2) ||
0f90: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
0fa0: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 NO_TLS1_2_METHOD
0fb0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
0fc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
0fd0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
0fe0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
0ff0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
1000: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
1010: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
1020: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69 e. mi
1030: 6e 5f 76 65 72 73 69 6f 6e 20 3d 20 54 4c 53 31 n_version = TLS1
1040: 5f 32 5f 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 _2_VERSION;.
1050: 20 20 20 20 20 20 20 20 6d 61 78 5f 76 65 72 73 max_vers
1060: 69 6f 6e 20 3d 20 54 4c 53 31 5f 32 5f 56 45 52 ion = TLS1_2_VER
1070: 53 49 4f 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b SION;.. break
1080: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 ;.#endif..case T
1090: 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 LS_TLS1_3:.#if d
10a0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 efined(NO_TLS1_3
10b0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 ) || defined(OPE
10c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a NSSL_NO_TLS1_3).
10d0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
10e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 esult(interp, pr
10f0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 otocols[index],
1100: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 ": protocol not
1110: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c supported", NULL
1120: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
1130: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a CL_ERROR;.#else.
1140: 20 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e 5f min_
1150: 76 65 72 73 69 6f 6e 20 3d 20 54 4c 53 31 5f 33 version = TLS1_3
1160: 5f 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 _VERSION;.
1170: 20 20 20 20 20 20 6d 61 78 5f 76 65 72 73 69 6f max_versio
1180: 6e 20 3d 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 n = TLS1_3_VERSI
1190: 4f 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a ON;.. break;.
11a0: 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a #endif..default:
11b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e . min
11c0: 5f 76 65 72 73 69 6f 6e 20 3d 20 53 53 4c 33 5f _version = SSL3_
11d0: 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 VERSION;.
11e0: 20 20 20 20 20 6d 61 78 5f 76 65 72 73 69 6f 6e max_version
11f0: 20 3d 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f = TLS1_3_VERSIO
1200: 4e 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 N;.. break;.
1210: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
1220: 61 74 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 ate context */.
1230: 20 20 20 69 66 20 28 28 63 74 78 20 3d 20 53 53 if ((ctx = SS
1240: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 5f 73 65 L_CTX_new(TLS_se
1250: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 29 29 20 rver_method()))
1260: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
1270: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
1280: 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e erp, REASON(), N
1290: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
12a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
12b0: 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f /* Set proto
12c0: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a col versions */.
12d0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f if (SSL_CTX_
12e0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 set_min_proto_ve
12f0: 72 73 69 6f 6e 28 63 74 78 2c 20 6d 69 6e 5f 76 rsion(ctx, min_v
1300: 65 72 73 69 6f 6e 29 20 3d 3d 20 30 20 7c 7c 0a ersion) == 0 ||.
1310: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 .SSL_CTX_set_max
1320: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 _proto_version(c
1330: 74 78 2c 20 6d 61 78 5f 76 65 72 73 69 6f 6e 29 tx, max_version)
1340: 20 3d 3d 20 30 29 20 7b 0a 09 53 53 4c 5f 43 54 == 0) {..SSL_CT
1350: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 X_free(ctx);..re
1360: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
1370: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
1380: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 eate SSL context
1390: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 73 6c */. if ((ssl
13a0: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 29 = SSL_new(ctx))
13b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
13c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
13d0: 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 terp, REASON(),
13e0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f NULL);..SSL_CTX_
13f0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 free(ctx);..retu
1400: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
1410: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 }.. /* Use
1420: 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 list and order a
1430: 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 s would be sent
1440: 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f in a ClientHello
1450: 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c or all availabl
1460: 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 e ciphers */.
1470: 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 if (use_support
1480: 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f ed) {..sk = SSL_
1490: 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 get1_supported_c
14a0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 iphers(ssl);.
14b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 } else {..sk =
14c0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 SSL_get_ciphers(
14d0: 73 73 6c 29 3b 0a 09 2f 2a 73 6b 20 3d 20 53 53 ssl);../*sk = SS
14e0: 4c 5f 43 54 58 5f 67 65 74 5f 63 69 70 68 65 72 L_CTX_get_cipher
14f0: 73 28 63 74 78 29 3b 2a 2f 0a 20 20 20 20 7d 0a s(ctx);*/. }.
1500: 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e . if (sk != N
1510: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 ULL) {..Tcl_Obj
1520: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a *objPtr = NULL;.
1530: 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 ..if (!verbose)
1540: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 63 70 3b {.. char *cp;
1550: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 .. objPtr = T
1560: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
1570: 20 4e 55 4c 4c 29 3b 0a 0a 09 20 20 20 20 66 6f NULL);... fo
1580: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 r (int i = 0; i
1590: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f < sk_SSL_CIPHER_
15a0: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a num(sk); i++) {.
15b0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 ..const SSL_CIPH
15c0: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 ER *c = sk_SSL_C
15d0: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 IPHER_value(sk,
15e0: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e i);...if (c == N
15f0: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a ULL) continue;..
1600: 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 ../* cipher name
1610: 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 or (NONE) */...
1620: 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f cp = SSL_CIPHER_
1630: 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 get_name(c);...i
1640: 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 f (cp == NULL) b
1650: 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 reak;...Tcl_List
1660: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
1670: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
1680: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
1690: 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 j(cp, -1));..
16a0: 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }...} else {..
16b0: 20 20 20 63 68 61 72 20 62 75 66 5b 42 55 46 53 char buf[BUFS
16c0: 49 5a 5d 3b 0a 09 20 20 20 20 6f 62 6a 50 74 72 IZ];.. objPtr
16d0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 = Tcl_NewString
16e0: 4f 62 6a 28 22 22 2c 30 29 3b 0a 0a 09 20 20 20 Obj("",0);...
16f0: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b for (int i = 0;
1700: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 i < sk_SSL_CIPH
1710: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 ER_num(sk); i++)
1720: 20 7b 0a 09 09 2f 2a 20 75 69 6e 74 33 32 5f 74 {.../* uint32_t
1730: 20 69 64 3b 2a 2f 0a 09 09 63 6f 6e 73 74 20 53 id;*/...const S
1740: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 SL_CIPHER *c = s
1750: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c k_SSL_CIPHER_val
1760: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 ue(sk, i);...if
1770: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 (c == NULL) cont
1780: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 47 65 74 20 inue;..../* Get
1790: 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 OpenSSL-specific
17a0: 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 ID, not IANA ID
17b0: 20 2a 2f 0a 09 09 2f 2a 69 64 20 3d 20 53 53 4c */.../*id = SSL
17c0: 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 _CIPHER_get_id(c
17d0: 29 3b 2a 2f 0a 0a 09 09 2f 2a 20 54 4c 53 20 70 );*/..../* TLS p
17e0: 72 6f 74 6f 63 6f 6c 20 74 77 6f 2d 62 79 74 65 rotocol two-byte
17f0: 20 69 64 20 2a 2f 0a 09 09 2f 2a 69 64 20 3d 20 id */.../*id =
1800: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 SSL_CIPHER_get_p
1810: 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 29 3b 2a 2f rotocol_id(c);*/
1820: 0a 0a 09 09 2f 2a 20 53 74 61 6e 64 61 72 64 20 ..../* Standard
1830: 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 RFC name of ciph
1840: 65 72 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a er or (NONE) */.
1850: 09 09 2f 2a 63 6f 6e 73 74 20 63 68 61 72 20 2a ../*const char *
1860: 6e 6d 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f nm = SSL_CIPHER_
1870: 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 29 standard_name(c)
1880: 3b 0a 09 09 69 66 20 28 6e 6d 20 3d 3d 20 4e 55 ;...if (nm == NU
1890: 4c 4c 29 20 7b 6e 6d 20 3d 20 22 55 4e 4b 4e 4f LL) {nm = "UNKNO
18a0: 57 4e 22 3b 7d 2a 2f 0a 0a 09 09 2f 2a 20 74 65 WN";}*/..../* te
18b0: 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f xtual descriptio
18c0: 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 n of the cipher
18d0: 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 */...if (SSL_CIP
18e0: 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 HER_description(
18f0: 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 c, buf, sizeof(b
1900: 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a uf)) != NULL) {.
1910: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
1920: 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 ToObj(objPtr, bu
1930: 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 74 f, (Tcl_Size) st
1940: 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 rlen(buf));...}
1950: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c else {... Tcl
1960: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a _AppendToObj(obj
1970: 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 Ptr, "UNKNOWN\n"
1980: 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d , 8);...}.. }
1990: 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 6e 20 75 ..}.../* Clean u
19a0: 70 20 2a 2f 0a 09 69 66 20 28 75 73 65 5f 73 75 p */..if (use_su
19b0: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 pported) {..
19c0: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 sk_SSL_CIPHER_fr
19d0: 65 65 28 73 6b 29 3b 0a 09 7d 0a 09 54 63 6c 5f ee(sk);..}..Tcl_
19e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
19f0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 erp, objPtr);.
1a00: 20 20 7d 0a 0a 20 20 20 20 53 53 4c 5f 66 72 65 }.. SSL_fre
1a10: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f e(ssl);. SSL_
1a20: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 CTX_free(ctx);.
1a30: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
1a40: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 ;..clientData =
1a50: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a clientData;.}...
1a60: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
1ab0: 69 67 65 73 74 73 4f 62 6a 43 6d 64 20 2d 2d 0a igestsObjCmd --.
1ac0: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 61 20 6c *. *.Return a l
1ad0: 69 73 74 20 6f 66 20 61 6c 6c 20 76 61 6c 69 64 ist of all valid
1ae0: 20 68 61 73 68 20 61 6c 67 6f 72 69 74 68 6d 73 hash algorithms
1af0: 20 6f 72 20 6d 65 73 73 61 67 65 20 64 69 67 65 or message dige
1b00: 73 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c sts.. *. * Resul
1b10: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
1b20: 64 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 d Tcl list.. *.
1b30: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
1b40: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
1b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b90: 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 -. */.int Digest
1ba0: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 sObjCmd(ClientDa
1bb0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
1bc0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
1bd0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
1be0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
1bf0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
1c00: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 j *objPtr;..
1c10: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
1c20: 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f );..#if OPENSSL_
1c30: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c VERSION_NUMBER <
1c40: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 0x10100000L.
1c50: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c OpenSSL_add_all
1c60: 5f 64 69 67 65 73 74 73 28 29 3b 20 2f 2a 20 4d _digests(); /* M
1c70: 61 6b 65 20 73 75 72 65 20 74 68 65 79 27 72 65 ake sure they're
1c80: 20 6c 6f 61 64 65 64 20 2a 2f 0a 23 65 6e 64 69 loaded */.#endi
1c90: 66 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 f.. /* Valida
1ca0: 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a te arg count */.
1cb0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
1cc0: 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 1) {..Tcl_WrongN
1cd0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
1ce0: 2c 20 6f 62 6a 76 2c 20 4e 55 4c 4c 29 3b 0a 09 , objv, NULL);..
1cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
1d00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
1d10: 4c 69 73 74 20 61 6c 6c 20 64 69 67 65 73 74 73 List all digests
1d20: 20 2a 2f 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d */. objPtr =
1d30: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 Tcl_NewListObj(
1d40: 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 4f 42 0, NULL);. OB
1d50: 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c 28 4f 42 J_NAME_do_all(OB
1d60: 4a 5f 4e 41 4d 45 5f 54 59 50 45 5f 4d 44 5f 4d J_NAME_TYPE_MD_M
1d70: 45 54 48 2c 20 4e 61 6d 65 73 43 61 6c 6c 62 61 ETH, NamesCallba
1d80: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 20 6f 62 6a ck, (void *) obj
1d90: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 Ptr);. Tcl_Se
1da0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
1db0: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
1dc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
1dd0: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
1de0: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a entData;.}.../*.
1df0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e30: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 61 63 73 -----. *. * Macs
1e40: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
1e50: 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 Return a list of
1e60: 20 61 6c 6c 20 76 61 6c 69 64 20 6d 65 73 73 61 all valid messa
1e70: 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f ge authenticatio
1e80: 6e 20 63 6f 64 65 73 20 28 4d 41 43 29 2e 0a 20 n codes (MAC)..
1e90: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
1ea0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
1eb0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 list.. *. * Side
1ec0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
1ed0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
1f20: 69 6e 74 20 4d 61 63 73 4f 62 6a 43 6d 64 28 43 int MacsObjCmd(C
1f30: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
1f40: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
1f50: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
1f60: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
1f70: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
1f80: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 Tcl_Obj *objPtr
1f90: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1fa0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f Called");.. /
1fb0: 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 * Validate arg c
1fc0: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 ount */. if (
1fd0: 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 objc != 1) {..Tc
1fe0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
1ff0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
2000: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
2010: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
2020: 0a 20 20 20 20 2f 2a 20 4c 69 73 74 20 61 6c 6c . /* List all
2030: 20 4d 41 43 73 20 2a 2f 0a 20 20 20 20 6f 62 6a MACs */. obj
2040: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
2050: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 tObj(0, NULL);.
2060: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
2070: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
2080: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
2090: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6d NewStringObj("cm
20a0: 61 63 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 ac", -1));. T
20b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
20c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
20d0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
20e0: 74 72 69 6e 67 4f 62 6a 28 22 68 6d 61 63 22 2c tringObj("hmac",
20f0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 -1));. Tcl_S
2100: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
2110: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 rp, objPtr);.
2120: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
2130: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
2140: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a ientData;.}.../*
2150: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2190: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f ------. *. * Pro
21a0: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 0a tocolsObjCmd --.
21b0: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 61 20 6c *. *.Return a l
21c0: 69 73 74 20 6f 66 20 74 68 65 20 61 76 61 69 6c ist of the avail
21d0: 61 62 6c 65 20 6f 72 20 73 75 70 70 6f 72 74 65 able or supporte
21e0: 64 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 d SSL/TLS protoc
21f0: 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ols.. *. * Resul
2200: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
2210: 64 20 54 63 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 d Tcl list.. *.
2220: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2230: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.none. *. *---
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2280: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
2290: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 ProtocolsObjCmd(
22a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
22b0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
22c0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
22d0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
22e0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
22f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 Tcl_Obj *objPt
2300: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
2310: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
2320: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 /* Validate arg
2330: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 count */. if
2340: 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 (objc != 1) {..T
2350: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
2360: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
2370: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
2380: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
2390: 0a 0a 20 20 20 20 2f 2a 20 4c 69 73 74 20 61 6c .. /* List al
23a0: 6c 20 4d 41 43 73 20 2a 2f 0a 20 20 20 20 6f 62 l MACs */. ob
23b0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 jPtr = Tcl_NewLi
23c0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
23d0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
23e0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
23f0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 0100000L && !def
2400: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 ined(NO_SSL2) &&
2410: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
2420: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 L_NO_SSL2). T
2430: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 cl_ListObjAppend
2440: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 Element(interp,
2450: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 objPtr, Tcl_NewS
2460: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f tringObj(protoco
2470: 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 ls[TLS_SSL2], -1
2480: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 ));.#endif.#if !
2490: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 defined(NO_SSL3)
24a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
24b0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 NSSL_NO_SSL3) &&
24c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
24d0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 L_NO_SSL3_METHOD
24e0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 ). Tcl_ListOb
24f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 jAppendElement(i
2500: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 nterp, objPtr, T
2510: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
2520: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 protocols[TLS_SS
2530: 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 L3], -1));.#endi
2540: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e f.#if !defined(N
2550: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 O_TLS1) && !defi
2560: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
2570: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 LS1) && !defined
2580: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 (OPENSSL_NO_TLS1
2590: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c _METHOD). Tcl
25a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
25b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 ement(interp, ob
25c0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 jPtr, Tcl_NewStr
25d0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 ingObj(protocols
25e0: 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 [TLS_TLS1], -1))
25f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
2600: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 fined(NO_TLS1_1)
2610: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 && !defined(OPE
2620: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 NSSL_NO_TLS1_1)
2630: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
2640: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 SSL_NO_TLS1_1_ME
2650: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 THOD). Tcl_Li
2660: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
2670: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 nt(interp, objPt
2680: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 r, Tcl_NewString
2690: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c Obj(protocols[TL
26a0: 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b S_TLS1_1], -1));
26b0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
26c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 ined(NO_TLS1_2)
26d0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
26e0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 SSL_NO_TLS1_2) &
26f0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
2700: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 SL_NO_TLS1_2_MET
2710: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 HOD). Tcl_Lis
2720: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2730: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
2740: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2750: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
2760: 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a _TLS1_2], -1));.
2770: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
2780: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 ned(NO_TLS1_3) &
2790: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
27a0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 SL_NO_TLS1_3).
27b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
27c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
27d0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
27e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 ewStringObj(prot
27f0: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 ocols[TLS_TLS1_3
2800: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a ], -1));.#endif.
2810: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
2820: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
2830: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
2840: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
2850: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
2860: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
28b0: 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a *. * VersionObj
28c0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 Cmd --. *. *.Ret
28d0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 77 69 74 urn a string wit
28e0: 68 20 74 68 65 20 4f 70 65 6e 53 53 4c 20 76 65 h the OpenSSL ve
28f0: 72 73 69 6f 6e 20 69 6e 66 6f 2e 0a 20 2a 0a 20 rsion info.. *.
2900: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
2910: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
2920: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
2930: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
2940: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
2990: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f tatic int.Versio
29a0: 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 nObjCmd(ClientDa
29b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
29c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
29d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
29e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
29f0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
2a00: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 j *objPtr;..
2a10: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
2a20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 );.. /* Valid
2a30: 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f ate arg count */
2a40: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
2a50: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 1) {..Tcl_Wrong
2a60: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
2a70: 31 2c 20 6f 62 6a 76 2c 20 4e 55 4c 4c 29 3b 0a 1, objv, NULL);.
2a80: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
2a90: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 R;. }.. ob
2aa0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 jPtr = Tcl_NewSt
2ab0: 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f ringObj(OPENSSL_
2ac0: 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 VERSION_TEXT, -1
2ad0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 );. Tcl_SetOb
2ae0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
2af0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 objPtr);. ret
2b00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 urn TCL_OK;..cli
2b10: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
2b20: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Data;.}.../*. *-
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b70: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 66 --. *. * Tls_Inf
2b80: 6f 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a oCommands --. *.
2b90: 20 2a 09 43 72 65 61 74 65 20 69 6e 66 6f 20 63 *.Create info c
2ba0: 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 ommands. *. * Re
2bb0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b turns:. *.TCL_OK
2bc0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a or TCL_ERROR. *
2bd0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
2be0: 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d :. *.Creates com
2bf0: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mands. *. *-----
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2c40: 2a 2f 0a 69 6e 74 20 54 6c 73 5f 49 6e 66 6f 43 */.int Tls_InfoC
2c50: 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65 ommands(Tcl_Inte
2c60: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
2c70: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
2c80: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
2c90: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 tls::ciphers", C
2ca0: 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 iphersObjCmd, (C
2cb0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
2cc0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
2cd0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
2ce0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
2cf0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
2d00: 3a 3a 64 69 67 65 73 74 73 22 2c 20 44 69 67 65 ::digests", Dige
2d10: 73 74 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 stsObjCmd, (Clie
2d20: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
2d30: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
2d40: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
2d50: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
2d60: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d (interp, "tls::m
2d70: 61 63 73 22 2c 20 4d 61 63 73 4f 62 6a 43 6d 64 acs", MacsObjCmd
2d80: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
2d90: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
2da0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
2db0: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
2dc0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
2dd0: 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 "tls::protocols"
2de0: 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d , ProtocolsObjCm
2df0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
2e00: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
2e10: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
2e20: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
2e30: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
2e40: 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c "tls::version",
2e50: 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 VersionObjCmd,
2e60: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
2e70: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
2e80: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
2e90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
2ea0: 7d 0a }.