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 20 20 20 20 69 66 20 28 31 20 7c 7c 20 21 ;. if (1 || !
03c0: 6f 62 6a 2d 3e 61 6c 69 61 73 29 20 7b 0a 09 2f obj->alias) {../
03d0: 2a 20 46 69 6c 74 65 72 20 6f 75 74 20 73 69 67 * Filter out sig
03e0: 6e 65 64 20 64 69 67 65 73 74 73 20 28 61 2e 6b ned digests (a.k
03f0: 2e 61 20 73 69 67 6e 61 74 75 72 65 20 61 6c 67 .a signature alg
0400: 6f 72 69 74 68 6d 73 29 20 2a 2f 0a 09 69 66 20 orithms) */..if
0410: 28 73 74 72 73 74 72 28 6f 62 6a 2d 3e 6e 61 6d (strstr(obj->nam
0420: 65 2c 20 22 72 73 61 22 29 20 3d 3d 20 4e 55 4c e, "rsa") == NUL
0430: 4c 20 26 26 20 73 74 72 73 74 72 28 6f 62 6a 2d L && strstr(obj-
0440: 3e 6e 61 6d 65 2c 20 22 52 53 41 22 29 20 3d 3d >name, "RSA") ==
0450: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 NULL) {.. Tc
0460: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
0470: 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a lement(NULL, obj
0480: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
0490: 6e 67 4f 62 6a 28 6f 62 6a 2d 3e 6e 61 6d 65 2c ngObj(obj->name,
04a0: 2d 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d -1));..}. }.}
04b0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
0500: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 * CiphersObjCmd
0510: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
0520: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
0530: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
0540: 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 e "tls::ciphers"
0550: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c command. *.to l
0560: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 ist available ci
0570: 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f phers, based upo
0580: 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 n protocol selec
0590: 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ted.. *. * Resul
05a0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
05b0: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 d Tcl result lis
05c0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
05d0: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 fects:. *.constr
05e0: 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79 ucts and destroy
05f0: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 s SSL context (C
0600: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d TX). *. *-------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
0650: 0a 73 74 61 74 69 63 20 69 6e 74 20 43 69 70 68 .static int Ciph
0660: 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 ersObjCmd(Client
0670: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
0680: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
0690: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
06a0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
06b0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f jv[]) {. Tcl_
06c0: 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 Obj *objPtr = NU
06d0: 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 LL;. SSL_CTX
06e0: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
06f0: 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c SSL *ssl = NULL
0700: 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 ;. STACK_OF(S
0710: 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a SL_CIPHER) *sk;.
0720: 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 char *cp, bu
0730: 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 f[BUFSIZ];. i
0740: 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 nt index, verbos
0750: 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f e = 0, use_suppo
0760: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f rted = 0;. co
0770: 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a nst SSL_METHOD *
0780: 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 method;.. dpr
0790: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
07a0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c . if ((objc <
07b0: 20 31 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 1) || (objc > 4
07c0: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e )) {..Tcl_WrongN
07d0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
07e0: 2c 20 6f 62 6a 76 2c 20 22 3f 70 72 6f 74 6f 63 , objv, "?protoc
07f0: 6f 6c 3f 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 ol? ?verbose? ?s
0800: 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 upported?");..re
0810: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
0820: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 62 }. if (ob
0830: 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 2f 2a 20 4c jc == 1) {../* L
0840: 69 73 74 20 61 6c 6c 20 63 69 70 68 65 72 73 20 ist all ciphers
0850: 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a */..Tcl_Obj *obj
0860: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 Ptr = Tcl_NewLis
0870: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a tObj(0, NULL);..
0880: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
0890: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
08a0: 30 31 30 30 30 30 30 4c 0a 09 4f 70 65 6e 53 53 0100000L..OpenSS
08b0: 4c 5f 61 64 64 5f 61 6c 6c 5f 63 69 70 68 65 72 L_add_all_cipher
08c0: 73 28 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 s(); /* Make sur
08d0: 65 20 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64 e they're loaded
08e0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 09 4f 42 4a */.#endif...OBJ
08f0: 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c 28 4f 42 4a _NAME_do_all(OBJ
0900: 5f 4e 41 4d 45 5f 54 59 50 45 5f 43 49 50 48 45 _NAME_TYPE_CIPHE
0910: 52 5f 4d 45 54 48 2c 20 4e 61 6d 65 73 43 61 6c R_METH, NamesCal
0920: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 20 lback, (void *)
0930: 6f 62 6a 50 74 72 29 3b 0a 09 54 63 6c 5f 52 65 objPtr);..Tcl_Re
0940: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
0950: 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 );..Tcl_SetObjRe
0960: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
0970: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 Ptr);..return TC
0980: 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 L_OK;.. } els
0990: 65 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 e if (Tcl_GetInd
09a0: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
09b0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f , objv[1], proto
09c0: 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 cols, "protocol"
09d0: 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 , 0, &index) !=
09e0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
09f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
0a00: 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 }. if ((objc
0a10: 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 > 2) && Tcl_Get
0a20: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 BooleanFromObj(i
0a30: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 nterp, objv[2],
0a40: 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c &verbose) != TCL
0a50: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
0a60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
0a70: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 if ((objc >
0a80: 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 3) && Tcl_GetBoo
0a90: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 leanFromObj(inte
0aa0: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 rp, objv[3], &us
0ab0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 e_supported) !=
0ac0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
0ad0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
0ae0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 }.. ERR_clea
0af0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 r_error();..
0b00: 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 switch ((enum pr
0b10: 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a otocol)index) {.
0b20: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a .case TLS_SSL2:.
0b30: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
0b40: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 ION_NUMBER >= 0x
0b50: 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 10100000L || def
0b60: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c ined(NO_SSL2) ||
0b70: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c defined(OPENSSL
0b80: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 _NO_SSL2).. T
0b90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
0ba0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
0bb0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
0bc0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
0bd0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
0be0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
0bf0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
0c00: 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 ethod = SSLv2_me
0c10: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
0c20: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
0c30: 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 SSL3:.#if define
0c40: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 d(NO_SSL3) || de
0c50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
0c60: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 _SSL3) || define
0c70: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c d(OPENSSL_NO_SSL
0c80: 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 3_METHOD).. T
0c90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
0ca0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
0cb0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
0cc0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
0cd0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
0ce0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
0cf0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
0d00: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 ethod = SSLv3_me
0d10: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
0d20: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
0d30: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 TLS1:.#if define
0d40: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 d(NO_TLS1) || de
0d50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f fined(OPENSSL_NO
0d60: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 _TLS1) || define
0d70: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
0d80: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 1_METHOD).. T
0d90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
0da0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c interp, protocol
0db0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f s[index], ": pro
0dc0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 tocol not suppor
0dd0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 ted", NULL);..
0de0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
0df0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d OR;.#else.. m
0e00: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 ethod = TLSv1_me
0e10: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 thod(); break;.#
0e20: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f endif..case TLS_
0e30: 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 TLS1_1:.#if defi
0e40: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c ned(NO_TLS1_1) |
0e50: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 | defined(OPENSS
0e60: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 L_NO_TLS1_1) ||
0e70: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f defined(OPENSSL_
0e80: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 NO_TLS1_1_METHOD
0e90: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ).. Tcl_Appen
0ea0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
0eb0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d protocols[index]
0ec0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f , ": protocol no
0ed0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 t supported", NU
0ee0: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
0ef0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 TCL_ERROR;.#els
0f00: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 e.. method =
0f10: 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 TLSv1_1_method()
0f20: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ; break;.#endif.
0f30: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 .case TLS_TLS1_2
0f40: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f :.#if defined(NO
0f50: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 _TLS1_2) || defi
0f60: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 ned(OPENSSL_NO_T
0f70: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 LS1_2) || define
0f80: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 d(OPENSSL_NO_TLS
0f90: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 1_2_METHOD)..
0fa0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
0fb0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 t(interp, protoc
0fc0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 ols[index], ": p
0fd0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 rotocol not supp
0fe0: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 orted", NULL);..
0ff0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
1000: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 RROR;.#else..
1010: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f method = TLSv1_
1020: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 2_method(); brea
1030: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 k;.#endif..case
1040: 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 TLS_TLS1_3:.#if
1050: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f defined(NO_TLS1_
1060: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 3) || defined(OP
1070: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 ENSSL_NO_TLS1_3)
1080: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
1090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 Result(interp, p
10a0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c rotocols[index],
10b0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 ": protocol not
10c0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c supported", NUL
10d0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
10e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 TCL_ERROR;.#else
10f0: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 .. method = T
1100: 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 LS_method();..
1110: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 SSL_CTX_set_mi
1120: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 n_proto_version(
1130: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 ctx, TLS1_3_VERS
1140: 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 ION);.. SSL_C
1150: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f TX_set_max_proto
1160: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c _version(ctx, TL
1170: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 S1_3_VERSION);..
1180: 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 break;.#endi
1190: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 f..default:..
11a0: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 method = TLS_me
11b0: 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62 72 65 thod();.. bre
11c0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 ak;. }.. c
11d0: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 tx = SSL_CTX_new
11e0: 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 (method);. if
11f0: 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b (ctx == NULL) {
1200: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
1210: 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53 4f lt(interp, REASO
1220: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 N(), NULL);..ret
1230: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
1240: 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 }.. ssl =
1250: 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 SSL_new(ctx);.
1260: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c if (ssl == NUL
1270: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
1280: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 Result(interp, R
1290: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
12a0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 .SSL_CTX_free(ct
12b0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f x);..return TCL_
12c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
12d0: 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e /* Use list an
12e0: 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 d order as would
12f0: 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c be sent in a Cl
1300: 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c ientHello or all
1310: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 available ciphe
1320: 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 rs */. if (us
1330: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 e_supported) {..
1340: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 sk = SSL_get1_su
1350: 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 pported_ciphers(
1360: 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ssl);. } else
1370: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 {..sk = SSL_get
1380: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 _ciphers(ssl);.
1390: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b }.. if (sk
13a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 != NULL) {..if
13b0: 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 (!verbose) {..
13c0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e objPtr = Tcl_N
13d0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c ewListObj(0, NUL
13e0: 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e L);.. for (in
13f0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f t i = 0; i < sk_
1400: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 SSL_CIPHER_num(s
1410: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e k); i++) {...con
1420: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 st SSL_CIPHER *c
1430: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 = sk_SSL_CIPHER
1440: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 _value(sk, i);..
1450: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 .if (c == NULL)
1460: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 continue;..../*
1470: 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 cipher name or (
1480: 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 NONE) */...cp =
1490: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e SSL_CIPHER_get_n
14a0: 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 ame(c);...if (cp
14b0: 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b == NULL) break;
14c0: 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ...Tcl_ListObjAp
14d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 pendElement(inte
14e0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f rp, objPtr, Tcl_
14f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c NewStringObj(cp,
1500: 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 -1));.. }...
1510: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 } else {.. ob
1520: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 jPtr = Tcl_NewSt
1530: 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 ringObj("",0);..
1540: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d for (int i =
1550: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 0; i < sk_SSL_C
1560: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 IPHER_num(sk); i
1570: 2b 2b 29 20 7b 0a 09 09 2f 2a 20 75 69 6e 74 33 ++) {.../* uint3
1580: 32 5f 74 20 69 64 3b 2a 2f 0a 09 09 63 6f 6e 73 2_t id;*/...cons
1590: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 t SSL_CIPHER *c
15a0: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f = sk_SSL_CIPHER_
15b0: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 value(sk, i);...
15c0: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 if (c == NULL) c
15d0: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 47 ontinue;..../* G
15e0: 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 et OpenSSL-speci
15f0: 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 fic ID, not IANA
1600: 20 49 44 20 2a 2f 0a 09 09 2f 2a 69 64 20 3d 20 ID */.../*id =
1610: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 SSL_CIPHER_get_i
1620: 64 28 63 29 3b 2a 2f 0a 0a 09 09 2f 2a 20 54 4c d(c);*/..../* TL
1630: 53 20 70 72 6f 74 6f 63 6f 6c 20 74 77 6f 2d 62 S protocol two-b
1640: 79 74 65 20 69 64 20 2a 2f 0a 09 09 2f 2a 69 64 yte id */.../*id
1650: 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 = SSL_CIPHER_ge
1660: 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 29 t_protocol_id(c)
1670: 3b 2a 2f 0a 0a 09 09 2f 2a 20 53 74 61 6e 64 61 ;*/..../* Standa
1680: 72 64 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 rd RFC name of c
1690: 69 70 68 65 72 20 6f 72 20 28 4e 4f 4e 45 29 20 ipher or (NONE)
16a0: 2a 2f 0a 09 09 2f 2a 63 6f 6e 73 74 20 63 68 61 */.../*const cha
16b0: 72 20 2a 6e 6d 20 3d 20 53 53 4c 5f 43 49 50 48 r *nm = SSL_CIPH
16c0: 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 ER_standard_name
16d0: 28 63 29 3b 0a 09 09 69 66 20 28 6e 6d 20 3d 3d (c);...if (nm ==
16e0: 20 4e 55 4c 4c 29 20 7b 6e 6d 20 3d 20 22 55 4e NULL) {nm = "UN
16f0: 4b 4e 4f 57 4e 22 3b 7d 2a 2f 0a 0a 09 09 2f 2a KNOWN";}*/..../*
1700: 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 textual descrip
1710: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 tion of the ciph
1720: 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f er */...if (SSL_
1730: 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 CIPHER_descripti
1740: 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f on(c, buf, sizeo
1750: 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 f(buf)) != NULL)
1760: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 {... Tcl_App
1770: 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c endToObj(objPtr,
1780: 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 buf, (Tcl_Size)
1790: 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 strlen(buf));..
17a0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 .} else {...
17b0: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 Tcl_AppendToObj(
17c0: 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e objPtr, "UNKNOWN
17d0: 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 \n", 8);...}..
17e0: 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f }..}..if (use_
17f0: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 supported) {..
1800: 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f sk_SSL_CIPHER_
1810: 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 free(sk);..}.
1820: 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 }. SSL_free(
1830: 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 ssl);. SSL_CT
1840: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 X_free(ctx);..
1850: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
1860: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 lt(interp, objPt
1870: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
1880: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 CL_OK;..clientDa
1890: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
18a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
18f0: 0a 20 2a 20 44 69 67 65 73 74 73 4f 62 6a 43 6d . * DigestsObjCm
1900: 64 20 2d 2d 20 0a 20 2a 0a 20 2a 09 52 65 74 75 d -- . *. *.Retu
1910: 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c rn a list of all
1920: 20 76 61 6c 69 64 20 68 61 73 68 20 61 6c 67 6f valid hash algo
1930: 72 69 74 68 6d 73 20 6f 72 20 6d 65 73 73 61 67 rithms or messag
1940: 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a e digests.. *. *
1950: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
1960: 74 61 6e 64 61 72 64 20 54 63 6c 20 6c 69 73 74 tandard Tcl list
1970: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
1980: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
1990: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 -------. */.int
19e0: 44 69 67 65 73 74 73 4f 62 6a 43 6d 64 28 43 6c DigestsObjCmd(Cl
19f0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
1a00: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
1a10: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
1a20: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
1a30: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
1a40: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 Tcl_Obj *objPtr
1a50: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a = Tcl_NewListObj
1a60: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 0a (0, NULL);. .
1a70: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
1a80: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 ION_NUMBER < 0x1
1a90: 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 0100000L. Ope
1aa0: 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 64 69 67 nSSL_add_all_dig
1ab0: 65 73 74 73 28 29 3b 20 2f 2a 20 4d 61 6b 65 20 ests(); /* Make
1ac0: 73 75 72 65 20 74 68 65 79 27 72 65 20 6c 6f 61 sure they're loa
1ad0: 64 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 ded */.#endif..
1ae0: 20 20 20 4f 42 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 OBJ_NAME_do_a
1af0: 6c 6c 28 4f 42 4a 5f 4e 41 4d 45 5f 54 59 50 45 ll(OBJ_NAME_TYPE
1b00: 5f 4d 44 5f 4d 45 54 48 2c 20 4e 61 6d 65 73 43 _MD_METH, NamesC
1b10: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a allback, (void *
1b20: 29 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 54 ) objPtr);. T
1b30: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
1b40: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b interp, objPtr);
1b50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
1b60: 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 OK;..clientData
1b70: 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f = clientData;..o
1b80: 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a bjc = objc;..obj
1b90: 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a v = objv;.}.../*
1ba0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1be0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 61 63 ------. *. * Mac
1bf0: 73 4f 62 6a 43 6d 64 20 2d 2d 20 0a 20 2a 0a 20 sObjCmd -- . *.
1c00: 2a 09 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 *.Return a list
1c10: 6f 66 20 61 6c 6c 20 76 61 6c 69 64 20 6d 65 73 of all valid mes
1c20: 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 sage authenticat
1c30: 69 6f 6e 20 63 6f 64 65 73 20 28 4d 41 43 29 2e ion codes (MAC).
1c40: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
1c50: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
1c60: 6c 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 l list.. *. * Si
1c70: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
1c80: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1cd0: 2f 0a 69 6e 74 20 4d 61 63 73 4f 62 6a 43 6d 64 /.int MacsObjCmd
1ce0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
1cf0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
1d00: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
1d10: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
1d20: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
1d30: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
1d40: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
1d50: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 Obj(0, NULL);.
1d60: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 Tcl_ListObjApp
1d70: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 endElement(inter
1d80: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e p, objPtr, Tcl_N
1d90: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6d 61 ewStringObj("cma
1da0: 63 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 c", -1));. Tc
1db0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
1dc0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
1dd0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
1de0: 72 69 6e 67 4f 62 6a 28 22 68 6d 61 63 22 2c 20 ringObj("hmac",
1df0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 -1));. Tcl_Se
1e00: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
1e10: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 p, objPtr);.
1e20: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
1e30: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 clientData = cli
1e40: 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d entData;..objc =
1e50: 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f objc;..objv = o
1e60: 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d bjv;.}.../*. *--
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1eb0: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c -. *. * Protocol
1ec0: 73 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a sObjCmd --. *. *
1ed0: 09 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f .Return a list o
1ee0: 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 f the available
1ef0: 6f 72 20 73 75 70 70 6f 72 74 65 64 20 53 53 4c or supported SSL
1f00: 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a /TLS protocols..
1f10: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
1f20: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
1f30: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 list.. *. * Sid
1f40: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f e effects:. *.no
1f50: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
1fa0: 73 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f static int.Proto
1fb0: 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e colsObjCmd(Clien
1fc0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
1fd0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
1fe0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
1ff0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
2000: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c bjv[]) {. Tcl
2010: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 _Obj *objPtr;..
2020: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
2030: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f ed");.. if (o
2040: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c bjc != 1) {..Tcl
2050: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
2060: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 4e terp, 1, objv, N
2070: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
2080: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
2090: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 ERR_clear_er
20a0: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 ror();.. objP
20b0: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 tr = Tcl_NewList
20c0: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 Obj(0, NULL);..#
20d0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 if OPENSSL_VERSI
20e0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 ON_NUMBER < 0x10
20f0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 100000L && !defi
2100: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 ned(NO_SSL2) &&
2110: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
2120: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 _NO_SSL2). Tc
2130: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
2140: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f lement(interp, o
2150: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 bjPtr, Tcl_NewSt
2160: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c ringObj(protocol
2170: 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 s[TLS_SSL2], -1)
2180: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 );.#endif.#if !d
2190: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 efined(NO_SSL3)
21a0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
21b0: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 SSL_NO_SSL3) &&
21c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c !defined(OPENSSL
21d0: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 _NO_SSL3_METHOD)
21e0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
21f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e AppendElement(in
2200: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 terp, objPtr, Tc
2210: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 l_NewStringObj(p
2220: 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c rotocols[TLS_SSL
2230: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 3], -1));.#endif
2240: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f .#if !defined(NO
2250: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e _TLS1) && !defin
2260: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c ed(OPENSSL_NO_TL
2270: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 S1) && !defined(
2280: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f OPENSSL_NO_TLS1_
2290: 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f METHOD). Tcl_
22a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
22b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a ment(interp, obj
22c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 Ptr, Tcl_NewStri
22d0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b ngObj(protocols[
22e0: 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b TLS_TLS1], -1));
22f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 .#endif.#if !def
2300: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 ined(NO_TLS1_1)
2310: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e && !defined(OPEN
2320: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 SSL_NO_TLS1_1) &
2330: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
2340: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 SL_NO_TLS1_1_MET
2350: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 HOD). Tcl_Lis
2360: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
2370: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
2380: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
2390: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 bj(protocols[TLS
23a0: 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a _TLS1_1], -1));.
23b0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
23c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 ned(NO_TLS1_2) &
23d0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 & !defined(OPENS
23e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 SL_NO_TLS1_2) &&
23f0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
2400: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 L_NO_TLS1_2_METH
2410: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 OD). Tcl_List
2420: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
2430: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c (interp, objPtr,
2440: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2450: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f j(protocols[TLS_
2460: 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 TLS1_2], -1));.#
2470: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e endif.#if !defin
2480: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 ed(NO_TLS1_3) &&
2490: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 !defined(OPENSS
24a0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 L_NO_TLS1_3).
24b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
24c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 ndElement(interp
24d0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 , objPtr, Tcl_Ne
24e0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f wStringObj(proto
24f0: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d cols[TLS_TLS1_3]
2500: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a , -1));.#endif..
2510: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
2520: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a sult(interp, obj
2530: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
2540: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 TCL_OK;..client
2550: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
2560: 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d a;.}.../*. *----
2570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
25a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
25b0: 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a *. * VersionObj
25c0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 Cmd --. *. *.Ret
25d0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 77 69 74 urn a string wit
25e0: 68 20 74 68 65 20 4f 70 65 6e 53 53 4c 20 76 65 h the OpenSSL ve
25f0: 72 73 69 6f 6e 20 69 6e 66 6f 2e 0a 20 2a 0a 20 rsion info.. *.
2600: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
2610: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
2620: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
2630: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
2640: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
2690: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f tatic int.Versio
26a0: 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 nObjCmd(ClientDa
26b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
26c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
26d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
26e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
26f0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 []) {. Tcl_Ob
2700: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 j *objPtr;..
2710: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
2720: 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d );.. objPtr =
2730: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
2740: 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f j(OPENSSL_VERSIO
2750: 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 N_TEXT, -1);.
2760: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
2770: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 t(interp, objPtr
2780: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
2790: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 L_OK;..clientDat
27a0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a a = clientData;.
27b0: 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f .objc = objc;..o
27c0: 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a bjv = objv;.}...
27d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
2820: 6c 73 5f 49 6e 66 6f 43 6f 6d 6d 61 6e 64 73 20 ls_InfoCommands
2830: 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 --. *. *.Create
2840: 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a info commands. *
2850: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
2860: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 TCL_OK or TCL_ER
2870: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ROR. *. * Side e
2880: 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 ffects:. *.Creat
2890: 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 es commands. *.
28a0: 2a 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 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 ----. */.int Tls
28f0: 5f 49 6e 66 6f 43 6f 6d 6d 61 6e 64 73 28 54 63 _InfoCommands(Tc
2900: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
2910: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 ) {. Tcl_Crea
2920: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
2930: 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 erp, "tls::ciphe
2940: 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 rs", CiphersObjC
2950: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
2960: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
2970: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
2980: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
2990: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
29a0: 2c 20 22 74 6c 73 3a 3a 64 69 67 65 73 74 73 22 , "tls::digests"
29b0: 2c 20 44 69 67 65 73 74 73 4f 62 6a 43 6d 64 2c , DigestsObjCmd,
29c0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
29d0: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
29e0: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
29f0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
2a00: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
2a10: 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c tls::protocols",
2a20: 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 ProtocolsObjCmd
2a30: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
2a40: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
2a50: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
2a60: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
2a70: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
2a80: 22 74 6c 73 3a 3a 6d 61 63 73 22 2c 20 4d 61 63 "tls::macs", Mac
2a90: 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 sObjCmd, (Client
2aa0: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
2ab0: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
2ac0: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
2ad0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
2ae0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 nterp, "tls::ver
2af0: 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 sion", VersionOb
2b00: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
2b10: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
2b20: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
2b30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
2b40: 4c 5f 4f 4b 3b 0a 7d 0a L_OK;.}.