Artifact
4b096f23cb9cd572ba5c27a374fccd82c4d1c53b990604351e04c73c0ce6b7c2:
0000: 2f 2a 0a 20 2a 20 4b 65 79 20 44 65 72 69 76 61 /*. * Key Deriva
0010: 74 69 6f 6e 20 46 75 6e 63 74 69 6f 6e 20 28 4b tion Function (K
0020: 44 46 29 20 4d 6f 64 75 6c 65 0a 20 2a 0a 20 2a DF) Module. *. *
0030: 20 50 72 6f 76 69 64 65 73 20 63 6f 6d 6d 61 6e Provides comman
0040: 64 73 20 74 6f 20 64 65 72 69 76 65 20 6b 65 79 ds to derive key
0050: 73 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 s.. *. * Copyrig
0060: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61 ht (C) 2023 Bria
0070: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a 2f n O'Hagan. *. */
0080: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 ..#include "tlsI
0090: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 nt.h".#include "
00a0: 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63 6c tclOpts.h".#incl
00b0: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 61 6e ude <openssl/ran
00c0: 64 2e 68 3e 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a d.h>../*********
00d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
00e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 **********/../*
0110: 4f 70 74 69 6f 6e 73 20 66 6f 72 20 52 61 6e 64 Options for Rand
0120: 6f 6d 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 0a om commands */..
0130: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
0140: 72 20 2a 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20 r *command_opts
0150: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 2d 70 72 69 [] = {. "-pri
0160: 76 61 74 65 22 2c 20 4e 55 4c 4c 7d 3b 0a 0a 65 vate", NULL};..e
0170: 6e 75 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f 70 74 num _command_opt
0180: 73 20 7b 0a 20 20 20 20 5f 6f 70 74 5f 70 72 69 s {. _opt_pri
0190: 76 61 74 65 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d vate.};../*. *--
01a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01e0: 2d 0a 20 2a 0a 20 2a 20 52 41 4e 44 5f 52 61 6e -. *. * RAND_Ran
01f0: 64 6f 6d 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 6e dom --. *. *.Gen
0200: 65 72 61 74 65 20 72 61 6e 64 6f 6d 20 62 79 65 erate random bye
0210: 73 20 75 73 69 6e 67 20 61 20 72 61 6e 64 6f 6d s using a random
0220: 20 62 79 74 65 73 20 75 73 69 6e 67 20 61 20 63 bytes using a c
0230: 72 79 70 74 6f 67 72 61 70 68 69 63 61 6c 6c 79 ryptographically
0240: 0a 20 2a 09 73 65 63 75 72 65 20 70 73 65 75 64 . *.secure pseud
0250: 6f 20 72 61 6e 64 6f 6d 20 67 65 6e 65 72 61 74 o random generat
0260: 6f 72 20 28 43 53 50 52 4e 47 29 2e 0a 20 2a 0a or (CSPRNG).. *.
0270: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
0280: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
0290: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
02a0: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 fects:. *.Sets r
02b0: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 72 61 6e esult to the ran
02c0: 64 6f 6d 20 62 79 74 65 73 2c 20 6f 72 20 61 6e dom bytes, or an
02d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 error message.
02e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
0330: 69 63 20 69 6e 74 20 52 41 4e 44 5f 52 61 6e 64 ic int RAND_Rand
0340: 6f 6d 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c om(ClientData cl
0350: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
0360: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
0370: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
0380: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
0390: 0a 20 20 20 20 69 6e 74 20 6f 75 74 5f 6c 65 6e . int out_len
03a0: 20 3d 20 30 2c 20 72 65 73 3b 0a 20 20 20 20 75 = 0, res;. u
03b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 nsigned char *ou
03c0: 74 5f 62 75 66 3b 0a 20 20 20 20 54 63 6c 5f 4f t_buf;. Tcl_O
03d0: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 20 bj *resultObj;.
03e0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 (void) client
03f0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
0400: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
0410: 20 20 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f /* Clear erro
0420: 72 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 rs */. Tcl_Re
0430: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
0440: 29 3b 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 );. ERR_clear
0450: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f _error();.. /
0460: 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 * Validate arg c
0470: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 ount */. if (
0480: 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 objc < 2 || objc
0490: 20 3e 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f > 3) {..Tcl_Wro
04a0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
04b0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 70 72 , 1, objv, "?-pr
04c0: 69 76 61 74 65 3f 20 6c 65 6e 67 74 68 22 29 3b ivate? length");
04d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
04e0: 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 OR;. } else i
04f0: 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a f (objc == 3) {.
0500: 09 54 63 6c 5f 53 69 7a 65 20 66 6e 3b 0a 09 69 .Tcl_Size fn;..i
0510: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 f (Tcl_GetIndexF
0520: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
0530: 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 5f bjv[1], command_
0540: 6f 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 opts, "option",
0550: 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 0, &fn) != TCL_O
0560: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e K) {.. return
0570: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
0580: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
0590: 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 20 20 69 length */. i
05a0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f f (Tcl_GetIntFro
05b0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
05c0: 76 5b 6f 62 6a 63 20 2d 20 31 5d 2c 20 26 6f 75 v[objc - 1], &ou
05d0: 74 5f 6c 65 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b t_len) != TCL_OK
05e0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
05f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
0600: 20 69 66 20 28 6f 75 74 5f 6c 65 6e 20 3c 20 30 if (out_len < 0
0610: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 ) {..Tcl_SetObjR
0620: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
0630: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 62 61 64 l_ObjPrintf("bad
0640: 20 63 6f 75 6e 74 20 5c 22 25 64 5c 22 3a 20 6d count \"%d\": m
0650: 75 73 74 20 62 65 20 69 6e 74 65 67 65 72 20 3e ust be integer >
0660: 3d 20 30 22 2c 20 6f 75 74 5f 6c 65 6e 29 29 3b = 0", out_len));
0670: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
0680: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
0690: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 74 6f 72 61 * Allocate stora
06a0: 67 65 20 66 6f 72 20 72 65 73 75 6c 74 20 2a 2f ge for result */
06b0: 0a 20 20 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d . resultObj =
06c0: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 Tcl_NewObj();.
06d0: 20 20 20 6f 75 74 5f 62 75 66 20 3d 20 54 63 6c out_buf = Tcl
06e0: 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e _SetByteArrayLen
06f0: 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 28 gth(resultObj, (
0700: 54 63 6c 5f 53 69 7a 65 29 20 6f 75 74 5f 6c 65 Tcl_Size) out_le
0710: 6e 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 n);. if (resu
0720: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 20 7c 7c ltObj == NULL ||
0730: 20 6f 75 74 5f 62 75 66 20 3d 3d 20 4e 55 4c 4c out_buf == NULL
0740: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
0750: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d esult(interp, "M
0760: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
0770: 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a error", (char *
0780: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 44 65 ) NULL);..Tcl_De
0790: 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c crRefCount(resul
07a0: 74 4f 62 6a 29 3b 0a 09 72 65 74 75 72 6e 20 54 tObj);..return T
07b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
07c0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 72 61 6e 64 . /* Get rand
07d0: 6f 6d 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 om bytes */.
07e0: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b if (objc == 2) {
07f0: 0a 09 72 65 73 20 3d 20 52 41 4e 44 5f 62 79 74 ..res = RAND_byt
0800: 65 73 28 6f 75 74 5f 62 75 66 2c 20 6f 75 74 5f es(out_buf, out_
0810: 6c 65 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 len);. } else
0820: 20 7b 0a 09 72 65 73 20 3d 20 52 41 4e 44 5f 70 {..res = RAND_p
0830: 72 69 76 5f 62 79 74 65 73 28 6f 75 74 5f 62 75 riv_bytes(out_bu
0840: 66 2c 20 6f 75 74 5f 6c 65 6e 29 3b 0a 20 20 20 f, out_len);.
0850: 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 }. if (!res)
0860: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
0870: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 47 65 sult(interp, "Ge
0880: 6e 65 72 61 74 65 20 66 61 69 6c 65 64 3a 20 22 nerate failed: "
0890: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
08a0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
08b0: 4c 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 L);..Tcl_DecrRef
08c0: 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 Count(resultObj)
08d0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
08e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
08f0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
0900: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f (interp, resultO
0910: 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 bj);. return
0920: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a TCL_OK;.}../*. *
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0970: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 52 61 ---. *. * Tls_Ra
0980: 6e 64 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a ndCommands --. *
0990: 0a 20 2a 09 43 72 65 61 74 65 20 6b 65 79 20 63 . *.Create key c
09a0: 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 ommands. *. * Re
09b0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b turns:. *.TCL_OK
09c0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a or TCL_ERROR. *
09d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
09e0: 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d :. *.Creates com
09f0: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mands. *. *-----
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0a40: 2a 2f 0a 69 6e 74 20 54 6c 73 5f 52 61 6e 64 43 */.int Tls_RandC
0a50: 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65 ommands(Tcl_Inte
0a60: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
0a70: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
0a80: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
0a90: 74 6c 73 3a 3a 72 61 6e 64 6f 6d 22 2c 20 52 41 tls::random", RA
0aa0: 4e 44 5f 52 61 6e 64 6f 6d 2c 20 28 43 6c 69 65 ND_Random, (Clie
0ab0: 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
0ac0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
0ad0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 *) NULL);. r
0ae0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
0af0: 0a .