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 65 76 70 ude <openssl/evp
00c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 .h>.#include <op
00d0: 65 6e 73 73 6c 2f 6b 64 66 2e 68 3e 0a 0a 2f 2a enssl/kdf.h>../*
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 2a 2a 2a 2a 2a 2a ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0120: 2a 2a 2f 0a 0a 2f 2a 20 4f 70 74 69 6f 6e 73 20 **/../* Options
0130: 66 6f 72 20 4b 44 46 20 63 6f 6d 6d 61 6e 64 73 for KDF commands
0140: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 */..static cons
0150: 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 5f t char *command_
0160: 6f 70 74 73 20 5b 5d 20 3d 20 7b 0a 20 20 20 20 opts [] = {.
0170: 22 2d 63 69 70 68 65 72 22 2c 20 22 2d 64 69 67 "-cipher", "-dig
0180: 65 73 74 22 2c 20 22 2d 68 61 73 68 22 2c 20 22 est", "-hash", "
0190: 2d 69 6e 66 6f 22 2c 20 22 2d 69 74 65 72 61 74 -info", "-iterat
01a0: 69 6f 6e 73 22 2c 20 22 2d 6b 65 79 22 2c 20 22 ions", "-key", "
01b0: 2d 6c 65 6e 67 74 68 22 2c 20 22 2d 70 61 73 73 -length", "-pass
01c0: 77 6f 72 64 22 2c 0a 20 20 20 20 22 2d 73 61 6c word",. "-sal
01d0: 74 22 2c 20 22 2d 73 69 7a 65 22 2c 20 22 2d 4e t", "-size", "-N
01e0: 22 2c 20 22 2d 6e 22 2c 20 22 2d 72 22 2c 20 22 ", "-n", "-r", "
01f0: 2d 70 22 2c 20 4e 55 4c 4c 7d 3b 0a 0a 65 6e 75 -p", NULL};..enu
0200: 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20 m _command_opts
0210: 7b 0a 20 20 20 20 5f 6f 70 74 5f 63 69 70 68 65 {. _opt_ciphe
0220: 72 2c 20 5f 6f 70 74 5f 64 69 67 65 73 74 2c 20 r, _opt_digest,
0230: 5f 6f 70 74 5f 68 61 73 68 2c 20 5f 6f 70 74 5f _opt_hash, _opt_
0240: 69 6e 66 6f 2c 20 5f 6f 70 74 5f 69 74 65 72 2c info, _opt_iter,
0250: 20 5f 6f 70 74 5f 6b 65 79 2c 20 5f 6f 70 74 5f _opt_key, _opt_
0260: 6c 65 6e 67 74 68 2c 0a 20 20 20 20 5f 6f 70 74 length,. _opt
0270: 5f 70 61 73 73 77 6f 72 64 2c 20 5f 6f 70 74 5f _password, _opt_
0280: 73 61 6c 74 2c 20 5f 6f 70 74 5f 73 69 7a 65 2c salt, _opt_size,
0290: 20 5f 6f 70 74 5f 4e 2c 20 5f 6f 70 74 5f 6e 2c _opt_N, _opt_n,
02a0: 20 5f 6f 70 74 5f 72 2c 20 5f 6f 70 74 5f 70 0a _opt_r, _opt_p.
02b0: 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d };../*. *-------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
02e0: 2d 2d 2d 2d 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 0a 20 2a 0a ------------. *.
0300: 20 2a 20 4b 44 46 5f 50 42 4b 44 46 32 20 2d 2d * KDF_PBKDF2 --
0310: 0a 20 2a 0a 20 2a 09 50 4b 43 53 35 5f 50 42 4b . *. *.PKCS5_PBK
0320: 44 46 32 5f 48 4d 41 43 20 6b 65 79 20 64 65 72 DF2_HMAC key der
0330: 69 76 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e ivation function
0340: 20 28 4b 44 46 29 20 73 70 65 63 69 66 69 65 64 (KDF) specified
0350: 20 62 79 20 50 4b 43 53 20 23 35 2e 0a 20 2a 09 by PKCS #5.. *.
0360: 4b 44 46 73 20 69 6e 63 6c 75 64 65 20 50 42 4b KDFs include PBK
0370: 44 46 32 20 66 72 6f 6d 20 52 46 43 20 32 38 39 DF2 from RFC 289
0380: 38 2f 38 30 31 38 20 61 6e 64 20 53 63 72 79 70 8/8018 and Scryp
0390: 74 20 66 72 6f 6d 20 52 46 43 20 37 39 31 34 2e t from RFC 7914.
03a0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
03b0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
03c0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
03d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 e effects:. *.Se
03e0: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 61 20 6c ts result to a l
03f0: 69 73 74 20 6f 66 20 6b 65 79 20 61 6e 64 20 69 ist of key and i
0400: 76 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 6e 20 v values, or an
0410: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a error message. *
0420: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0460: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
0470: 63 20 69 6e 74 20 4b 44 46 5f 50 42 4b 44 46 32 c int KDF_PBKDF2
0480: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
0490: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
04a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
04b0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
04c0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
04d0: 20 20 20 54 63 6c 5f 53 69 7a 65 20 66 6e 2c 20 Tcl_Size fn,
04e0: 73 61 6c 74 5f 6c 65 6e 20 3d 20 30 2c 20 70 61 salt_len = 0, pa
04f0: 73 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 ss_len = 0;.
0500: 69 6e 74 20 69 6b 6c 65 6e 2c 20 69 76 6c 65 6e int iklen, ivlen
0510: 2c 20 69 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 , iter = 1;.
0520: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
0530: 61 73 73 20 3d 20 4e 55 4c 4c 2c 20 2a 73 61 6c ass = NULL, *sal
0540: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f t = NULL;. co
0550: 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 20 3d nst EVP_MD *md =
0560: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 NULL;. const
0570: 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 EVP_CIPHER *cip
0580: 68 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 her = NULL;.
0590: 69 6e 74 20 62 75 66 5f 6c 65 6e 20 3d 20 28 45 int buf_len = (E
05a0: 56 50 5f 4d 41 58 5f 4b 45 59 5f 4c 45 4e 47 54 VP_MAX_KEY_LENGT
05b0: 48 20 2b 20 45 56 50 5f 4d 41 58 5f 49 56 5f 4c H + EVP_MAX_IV_L
05c0: 45 4e 47 54 48 29 2a 34 2c 20 64 6b 5f 6c 65 6e ENGTH)*4, dk_len
05d0: 20 3d 20 62 75 66 5f 6c 65 6e 3b 0a 20 20 20 20 = buf_len;.
05e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 6d unsigned char tm
05f0: 70 6b 65 79 69 76 5b 28 45 56 50 5f 4d 41 58 5f pkeyiv[(EVP_MAX_
0600: 4b 45 59 5f 4c 45 4e 47 54 48 20 2b 20 45 56 50 KEY_LENGTH + EVP
0610: 5f 4d 41 58 5f 49 56 5f 4c 45 4e 47 54 48 29 2a _MAX_IV_LENGTH)*
0620: 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 4];. (void) c
0630: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 lientData;..
0640: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
0650: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 );.. /* Clear
0660: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54 errors */. T
0670: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 cl_ResetResult(i
0680: 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 52 52 5f nterp);. ERR_
0690: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
06a0: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 /* Validate
06b0: 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 arg count */.
06c0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c 7c if (objc < 3 ||
06d0: 20 6f 62 6a 63 20 3e 20 31 31 29 20 7b 0a 09 54 objc > 11) {..T
06e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
06f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
0700: 20 22 5b 2d 63 69 70 68 65 72 20 63 69 70 68 65 "[-cipher ciphe
0710: 72 20 7c 20 2d 73 69 7a 65 20 6c 65 6e 67 74 68 r | -size length
0720: 5d 20 2d 64 69 67 65 73 74 20 64 69 67 65 73 74 ] -digest digest
0730: 20 3f 2d 69 74 65 72 61 74 69 6f 6e 73 20 63 6f ?-iterations co
0740: 75 6e 74 3f 20 3f 2d 70 61 73 73 77 6f 72 64 20 unt? ?-password
0750: 73 74 72 69 6e 67 3f 20 3f 2d 73 61 6c 74 20 73 string? ?-salt s
0760: 74 72 69 6e 67 3f 22 29 3b 0a 09 72 65 74 75 72 tring?");..retur
0770: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
0780: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 20 }.. /* Init
0790: 62 75 66 66 65 72 73 20 2a 2f 0a 20 20 20 20 6d buffers */. m
07a0: 65 6d 73 65 74 28 74 6d 70 6b 65 79 69 76 2c 20 emset(tmpkeyiv,
07b0: 30 2c 20 62 75 66 5f 6c 65 6e 29 3b 0a 0a 20 20 0, buf_len);..
07c0: 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 /* Get options
07d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 6e 74 */. for (int
07e0: 20 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 idx = 1; idx <
07f0: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 objc; idx++) {..
0800: 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 2a 2f /* Get option */
0810: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 ..if (Tcl_GetInd
0820: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
0830: 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f 6d , objv[idx], com
0840: 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74 69 mand_opts, "opti
0850: 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20 on", 0, &fn) !=
0860: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 TCL_OK) {.. r
0870: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
0880: 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61 74 ..}.../* Validat
0890: 65 20 61 72 67 20 68 61 73 20 61 20 76 61 6c 75 e arg has a valu
08a0: 65 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20 e */..if (++idx
08b0: 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20 >= objc) {..
08c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
08d0: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c (interp, "No val
08e0: 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22 ue for option \"
08f0: 22 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b ", command_opts[
0900: 66 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 fn], "\"", (char
0910: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 *) NULL);..
0920: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
0930: 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e ;..}...switch(fn
0940: 29 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 ) {..case _opt_c
0950: 69 70 68 65 72 3a 0a 09 20 20 20 20 69 66 20 28 ipher:.. if (
0960: 28 63 69 70 68 65 72 20 3d 20 55 74 69 6c 5f 47 (cipher = Util_G
0970: 65 74 43 69 70 68 65 72 28 69 6e 74 65 72 70 2c etCipher(interp,
0980: 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 54 52 55 45 objv[idx], TRUE
0990: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 )) == NULL) {...
09a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
09b0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 ;.. }.. br
09c0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
09d0: 64 69 67 65 73 74 3a 0a 09 63 61 73 65 20 5f 6f digest:..case _o
09e0: 70 74 5f 68 61 73 68 3a 0a 09 20 20 20 20 69 66 pt_hash:.. if
09f0: 20 28 28 6d 64 20 3d 20 55 74 69 6c 5f 47 65 74 ((md = Util_Get
0a00: 44 69 67 65 73 74 28 69 6e 74 65 72 70 2c 20 6f Digest(interp, o
0a10: 62 6a 76 5b 69 64 78 5d 2c 20 54 52 55 45 29 29 bjv[idx], TRUE))
0a20: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 == NULL) {...re
0a30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
0a40: 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 . }.. brea
0a50: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 69 74 k;..case _opt_it
0a60: 65 72 3a 0a 09 20 20 20 20 69 66 20 28 55 74 69 er:.. if (Uti
0a70: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c l_GetInt(interp,
0a80: 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 69 74 65 objv[idx], &ite
0a90: 72 2c 20 22 69 74 65 72 61 74 69 6f 6e 73 22 2c r, "iterations",
0aa0: 20 31 2c 20 2d 31 29 20 21 3d 20 54 43 4c 5f 4f 1, -1) != TCL_O
0ab0: 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 K) {...return TC
0ac0: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
0ad0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
0ae0: 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a 09 63 61 73 e _opt_key:..cas
0af0: 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72 64 3a e _opt_password:
0b00: 0a 09 20 20 20 20 70 61 73 73 20 3d 20 55 74 69 .. pass = Uti
0b10: 6c 5f 47 65 74 4b 65 79 28 69 6e 74 65 72 70 2c l_GetKey(interp,
0b20: 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 70 61 73 objv[idx], &pas
0b30: 73 5f 6c 65 6e 2c 20 63 6f 6d 6d 61 6e 64 5f 6f s_len, command_o
0b40: 70 74 73 5b 66 6e 5d 2c 20 30 2c 20 46 41 4c 53 pts[fn], 0, FALS
0b50: 45 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a E);.. break;.
0b60: 09 63 61 73 65 20 5f 6f 70 74 5f 73 61 6c 74 3a .case _opt_salt:
0b70: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 .. GET_OPT_BY
0b80: 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 TE_ARRAY(objv[id
0b90: 78 5d 2c 20 73 61 6c 74 2c 20 26 73 61 6c 74 5f x], salt, &salt_
0ba0: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b len);.. break
0bb0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6c 65 6e ;..case _opt_len
0bc0: 67 74 68 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f gth:..case _opt_
0bd0: 73 69 7a 65 3a 0a 09 20 20 20 20 69 66 20 28 55 size:.. if (U
0be0: 74 69 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 til_GetInt(inter
0bf0: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 64 p, objv[idx], &d
0c00: 6b 5f 6c 65 6e 2c 20 63 6f 6d 6d 61 6e 64 5f 6f k_len, command_o
0c10: 70 74 73 5b 66 6e 5d 2c 20 31 2c 20 62 75 66 5f pts[fn], 1, buf_
0c20: 6c 65 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 len) != TCL_OK)
0c30: 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {...return TCL_E
0c40: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
0c50: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 break;..}.
0c60: 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 }.. /* Valida
0c70: 74 65 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 te options */.
0c80: 20 20 69 66 20 28 6d 64 20 3d 3d 20 4e 55 4c 4c if (md == NULL
0c90: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
0ca0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
0cb0: 6f 20 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 o digest", (char
0cc0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
0cd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
0ce0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
0cf0: 6f 75 74 70 75 74 20 74 79 70 65 20 73 69 7a 65 output type size
0d00: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 69 70 s */. if (cip
0d10: 68 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 her == NULL) {..
0d20: 69 66 20 28 64 6b 5f 6c 65 6e 20 3e 20 62 75 66 if (dk_len > buf
0d30: 5f 6c 65 6e 29 20 64 6b 5f 6c 65 6e 20 3d 20 62 _len) dk_len = b
0d40: 75 66 5f 6c 65 6e 3b 0a 09 69 6b 6c 65 6e 20 3d uf_len;..iklen =
0d50: 20 64 6b 5f 6c 65 6e 3b 0a 09 69 76 6c 65 6e 20 dk_len;..ivlen
0d60: 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 = 0;. } else
0d70: 7b 0a 09 69 6b 6c 65 6e 20 3d 20 45 56 50 5f 43 {..iklen = EVP_C
0d80: 49 50 48 45 52 5f 6b 65 79 5f 6c 65 6e 67 74 68 IPHER_key_length
0d90: 28 63 69 70 68 65 72 29 3b 0a 09 69 76 6c 65 6e (cipher);..ivlen
0da0: 20 3d 20 45 56 50 5f 43 49 50 48 45 52 5f 69 76 = EVP_CIPHER_iv
0db0: 5f 6c 65 6e 67 74 68 28 63 69 70 68 65 72 29 3b _length(cipher);
0dc0: 0a 09 64 6b 5f 6c 65 6e 20 3d 20 69 6b 6c 65 6e ..dk_len = iklen
0dd0: 2b 69 76 6c 65 6e 3b 0a 20 20 20 20 7d 0a 0a 20 +ivlen;. }..
0de0: 20 20 20 2f 2a 20 44 65 72 69 76 65 20 6b 65 79 /* Derive key
0df0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 50 4b 43 */. if (!PKC
0e00: 53 35 5f 50 42 4b 44 46 32 5f 48 4d 41 43 28 70 S5_PBKDF2_HMAC(p
0e10: 61 73 73 2c 20 28 69 6e 74 29 20 70 61 73 73 5f ass, (int) pass_
0e20: 6c 65 6e 2c 20 73 61 6c 74 2c 20 28 69 6e 74 29 len, salt, (int)
0e30: 20 73 61 6c 74 5f 6c 65 6e 2c 20 69 74 65 72 2c salt_len, iter,
0e40: 20 6d 64 2c 20 64 6b 5f 6c 65 6e 2c 20 74 6d 70 md, dk_len, tmp
0e50: 6b 65 79 69 76 29 29 20 7b 0a 09 54 63 6c 5f 41 keyiv)) {..Tcl_A
0e60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
0e70: 72 70 2c 20 22 4b 65 79 20 64 65 72 69 76 61 74 rp, "Key derivat
0e80: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 ion failed: ", R
0e90: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
0ea0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
0eb0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
0ec0: 7d 0a 0a 20 20 20 2f 2a 20 53 65 74 20 72 65 73 }.. /* Set res
0ed0: 75 6c 74 20 74 6f 20 6b 65 79 20 61 6e 64 20 69 ult to key and i
0ee0: 76 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 69 70 v */. if (cip
0ef0: 68 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 her == NULL) {..
0f00: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
0f10: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
0f20: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 6d 70 ByteArrayObj(tmp
0f30: 6b 65 79 69 76 2c 20 28 54 63 6c 5f 53 69 7a 65 keyiv, (Tcl_Size
0f40: 29 20 64 6b 5f 6c 65 6e 29 29 3b 0a 20 20 20 20 ) dk_len));.
0f50: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 } else {..Tcl_Ob
0f60: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 j *resultObj = T
0f70: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c cl_NewListObj(0,
0f80: 20 4e 55 4c 4c 29 3b 0a 09 4c 41 50 50 45 4e 44 NULL);..LAPPEND
0f90: 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 _BARRAY(interp,
0fa0: 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 22 resultObj, "key"
0fb0: 2c 20 74 6d 70 6b 65 79 69 76 2c 20 28 54 63 6c , tmpkeyiv, (Tcl
0fc0: 5f 53 69 7a 65 29 20 69 6b 6c 65 6e 29 3b 0a 09 _Size) iklen);..
0fd0: 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 LAPPEND_BARRAY(i
0fe0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
0ff0: 2c 20 22 69 76 22 2c 20 74 6d 70 6b 65 79 69 76 , "iv", tmpkeyiv
1000: 2b 69 6b 6c 65 6e 2c 20 28 54 63 6c 5f 53 69 7a +iklen, (Tcl_Siz
1010: 65 29 20 69 76 6c 65 6e 29 3b 0a 09 54 63 6c 5f e) ivlen);..Tcl_
1020: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
1030: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b erp, resultObj);
1040: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
1050: 6c 65 61 72 20 64 61 74 61 20 2a 2f 0a 20 20 20 lear data */.
1060: 20 6d 65 6d 73 65 74 28 74 6d 70 6b 65 79 69 76 memset(tmpkeyiv
1070: 2c 20 30 2c 20 62 75 66 5f 6c 65 6e 29 3b 0a 20 , 0, buf_len);.
1080: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
1090: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
10a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10e0: 0a 20 2a 20 4b 44 46 5f 48 4b 44 46 20 2d 2d 0a . * KDF_HKDF --.
10f0: 20 2a 0a 20 2a 09 48 4d 41 43 2d 62 61 73 65 64 *. *.HMAC-based
1100: 20 45 78 74 72 61 63 74 2d 61 6e 64 2d 45 78 70 Extract-and-Exp
1110: 61 6e 64 20 4b 65 79 20 44 65 72 69 76 61 74 69 and Key Derivati
1120: 6f 6e 20 46 75 6e 63 74 69 6f 6e 20 28 48 4b 44 on Function (HKD
1130: 46 29 2e 0a 20 2a 09 53 65 65 20 52 46 43 20 35 F).. *.See RFC 5
1140: 38 36 39 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 869.. *. * Retur
1150: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 ns:. *.TCL_OK or
1160: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a TCL_ERROR. *. *
1170: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
1180: 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f *.Sets result to
1190: 20 61 20 6b 65 79 20 6f 66 20 73 70 65 63 69 66 a key of specif
11a0: 69 65 64 20 6c 65 6e 67 74 68 2c 20 6f 72 20 61 ied length, or a
11b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a n error message.
11c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1200: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
1210: 74 69 63 20 69 6e 74 20 4b 44 46 5f 48 4b 44 46 tic int KDF_HKDF
1220: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
1230: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
1240: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
1250: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
1260: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
1270: 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 EVP_PKEY_CTX
1280: 2a 70 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *pctx = NULL;.
1290: 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a const EVP_MD *
12a0: 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 md = NULL;. u
12b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 61 nsigned char *sa
12c0: 6c 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79 20 lt = NULL, *key
12d0: 3d 20 4e 55 4c 4c 2c 20 2a 69 6e 66 6f 20 3d 20 = NULL, *info =
12e0: 4e 55 4c 4c 2c 20 2a 6f 75 74 20 3d 20 4e 55 4c NULL, *out = NUL
12f0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 L;. Tcl_Size
1300: 73 61 6c 74 5f 6c 65 6e 20 3d 20 30 2c 20 6b 65 salt_len = 0, ke
1310: 79 5f 6c 65 6e 20 3d 20 30 2c 20 69 6e 66 6f 5f y_len = 0, info_
1320: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 len = 0;. int
1330: 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 res = TCL_OK;.
1340: 20 20 20 54 63 6c 5f 53 69 7a 65 20 66 6e 3b 0a Tcl_Size fn;.
1350: 20 20 20 20 69 6e 74 20 64 6b 5f 6c 65 6e 20 3d int dk_len =
1360: 20 45 56 50 5f 4d 41 58 5f 4b 45 59 5f 4c 45 4e EVP_MAX_KEY_LEN
1370: 47 54 48 20 2b 20 45 56 50 5f 4d 41 58 5f 49 56 GTH + EVP_MAX_IV
1380: 5f 4c 45 4e 47 54 48 3b 0a 20 20 20 20 73 69 7a _LENGTH;. siz
1390: 65 5f 74 20 6f 75 74 5f 6c 65 6e 3b 0a 20 20 20 e_t out_len;.
13a0: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 Tcl_Obj *result
13b0: 4f 62 6a 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 Obj;. (void)
13c0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
13d0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
13e0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 ");.. /* Clea
13f0: 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 r errors */.
1400: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 Tcl_ResetResult(
1410: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 52 52 interp);. ERR
1420: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a _clear_error();.
1430: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 . /* Validate
1440: 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 arg count */.
1450: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 35 20 7c if (objc < 5 |
1460: 7c 20 6f 62 6a 63 20 3e 20 31 31 29 20 7b 0a 09 | objc > 11) {..
1470: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
1480: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
1490: 2c 20 22 2d 64 69 67 65 73 74 20 64 69 67 65 73 , "-digest diges
14a0: 74 20 2d 6b 65 79 20 73 74 72 69 6e 67 20 3f 2d t -key string ?-
14b0: 69 6e 66 6f 20 73 74 72 69 6e 67 3f 20 3f 2d 73 info string? ?-s
14c0: 61 6c 74 20 73 74 72 69 6e 67 3f 20 3f 2d 73 69 alt string? ?-si
14d0: 7a 65 20 64 65 72 69 76 65 64 5f 6c 65 6e 67 74 ze derived_lengt
14e0: 68 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 h?");..return TC
14f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
1500: 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f /* Get optio
1510: 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 ns */. for (i
1520: 6e 74 20 69 64 78 20 3d 20 31 3b 20 69 64 78 20 nt idx = 1; idx
1530: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b < objc; idx++) {
1540: 0a 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 ../* Get option
1550: 2a 2f 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 */..if (Tcl_GetI
1560: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 ndexFromObj(inte
1570: 72 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 rp, objv[idx], c
1580: 6f 6d 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 ommand_opts, "op
1590: 74 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 tion", 0, &fn) !
15a0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
15b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
15c0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 R;..}.../* Valid
15d0: 61 74 65 20 61 72 67 20 68 61 73 20 61 20 76 61 ate arg has a va
15e0: 6c 75 65 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 lue */..if (++id
15f0: 78 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 x >= objc) {..
1600: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
1610: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 lt(interp, "No v
1620: 61 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 alue for option
1630: 5c 22 22 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 \"", command_opt
1640: 73 5b 66 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 s[fn], "\"", (ch
1650: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 ar *) NULL);..
1660: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
1670: 4f 52 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 OR;..}...switch(
1680: 66 6e 29 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 fn) {..case _opt
1690: 5f 64 69 67 65 73 74 3a 0a 09 63 61 73 65 20 5f _digest:..case _
16a0: 6f 70 74 5f 68 61 73 68 3a 0a 09 20 20 20 20 69 opt_hash:.. i
16b0: 66 20 28 28 6d 64 20 3d 20 55 74 69 6c 5f 47 65 f ((md = Util_Ge
16c0: 74 44 69 67 65 73 74 28 69 6e 74 65 72 70 2c 20 tDigest(interp,
16d0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 54 52 55 45 29 objv[idx], TRUE)
16e0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 67 ) == NULL) {...g
16f0: 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 20 oto error;..
1700: 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 }.. break;..c
1710: 61 73 65 20 5f 6f 70 74 5f 69 6e 66 6f 3a 0a 09 ase _opt_info:..
1720: 20 20 20 20 2f 2a 20 4d 61 78 20 31 30 32 34 2f /* Max 1024/
1730: 32 30 34 38 20 2a 2f 0a 09 20 20 20 20 47 45 54 2048 */.. GET
1740: 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28 _OPT_BYTE_ARRAY(
1750: 6f 62 6a 76 5b 69 64 78 5d 2c 20 69 6e 66 6f 2c objv[idx], info,
1760: 20 26 69 6e 66 6f 5f 6c 65 6e 29 3b 0a 09 20 20 &info_len);..
1770: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f break;..case _
1780: 6f 70 74 5f 6b 65 79 3a 0a 09 63 61 73 65 20 5f opt_key:..case _
1790: 6f 70 74 5f 70 61 73 73 77 6f 72 64 3a 0a 09 20 opt_password:..
17a0: 20 20 20 69 66 20 28 28 6b 65 79 20 3d 20 55 74 if ((key = Ut
17b0: 69 6c 5f 47 65 74 4b 65 79 28 69 6e 74 65 72 70 il_GetKey(interp
17c0: 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 6b 65 , objv[idx], &ke
17d0: 79 5f 6c 65 6e 2c 20 63 6f 6d 6d 61 6e 64 5f 6f y_len, command_o
17e0: 70 74 73 5b 66 6e 5d 2c 20 30 2c 20 31 29 29 20 pts[fn], 0, 1))
17f0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 67 6f 74 == NULL) {...got
1800: 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a o error;.. }.
1810: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
1820: 65 20 5f 6f 70 74 5f 73 61 6c 74 3a 0a 09 20 20 e _opt_salt:..
1830: 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 GET_OPT_BYTE_A
1840: 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 RRAY(objv[idx],
1850: 73 61 6c 74 2c 20 26 73 61 6c 74 5f 6c 65 6e 29 salt, &salt_len)
1860: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
1870: 61 73 65 20 5f 6f 70 74 5f 6c 65 6e 67 74 68 3a ase _opt_length:
1880: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 69 7a 65 ..case _opt_size
1890: 3a 0a 09 20 20 20 20 69 66 20 28 55 74 69 6c 5f :.. if (Util_
18a0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 6f GetInt(interp, o
18b0: 62 6a 76 5b 69 64 78 5d 2c 20 26 64 6b 5f 6c 65 bjv[idx], &dk_le
18c0: 6e 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b n, command_opts[
18d0: 66 6e 5d 2c 20 31 2c 20 30 29 20 21 3d 20 54 43 fn], 1, 0) != TC
18e0: 4c 5f 4f 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 65 L_OK) {...goto e
18f0: 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 rror;.. }..
1900: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 break;..}.
1910: 7d 0a 0a 20 20 20 20 69 66 20 28 6d 64 20 3d 3d }.. if (md ==
1920: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
1930: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
1940: 70 2c 20 22 6e 6f 20 64 69 67 65 73 74 22 2c 20 p, "no digest",
1950: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
1960: 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 .goto error;.
1970: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6b 65 79 20 }.. if (key
1980: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
1990: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
19a0: 65 72 70 2c 20 22 6e 6f 20 6b 65 79 22 2c 20 28 erp, "no key", (
19b0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
19c0: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 goto error;.
19d0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
19e0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 context */.
19f0: 70 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f pctx = EVP_PKEY_
1a00: 43 54 58 5f 6e 65 77 5f 69 64 28 45 56 50 5f 50 CTX_new_id(EVP_P
1a10: 4b 45 59 5f 48 4b 44 46 2c 20 4e 55 4c 4c 29 3b KEY_HKDF, NULL);
1a20: 0a 20 20 20 20 69 66 20 28 70 63 74 78 20 3d 3d . if (pctx ==
1a30: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
1a40: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
1a50: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 p, "Memory alloc
1a60: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 ation error", (c
1a70: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 har *) NULL);..g
1a80: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d oto error;. }
1a90: 0a 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b .. if (EVP_PK
1aa0: 45 59 5f 64 65 72 69 76 65 5f 69 6e 69 74 28 70 EY_derive_init(p
1ab0: 63 74 78 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c ctx) < 1) {..Tcl
1ac0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
1ad0: 74 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a terp, "Initializ
1ae0: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 e failed: ", REA
1af0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
1b00: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 NULL);..goto err
1b10: 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f or;. }.. /
1b20: 2a 20 53 65 74 20 63 6f 6e 66 69 67 20 70 61 72 * Set config par
1b30: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 ameters */. i
1b40: 66 20 28 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f f (EVP_PKEY_CTX_
1b50: 73 65 74 5f 68 6b 64 66 5f 6d 64 28 70 63 74 78 set_hkdf_md(pctx
1b60: 2c 20 6d 64 29 20 3c 20 31 29 20 7b 0a 09 54 63 , md) < 1) {..Tc
1b70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
1b80: 6e 74 65 72 70 2c 20 22 53 65 74 20 64 69 67 65 nterp, "Set dige
1b90: 73 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 st failed: ", RE
1ba0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
1bb0: 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 NULL);..goto er
1bc0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ror;. }. i
1bd0: 66 20 28 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f f (EVP_PKEY_CTX_
1be0: 73 65 74 31 5f 68 6b 64 66 5f 6b 65 79 28 70 63 set1_hkdf_key(pc
1bf0: 74 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29 20 6b tx, key, (int) k
1c00: 65 79 5f 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09 ey_len) < 1) {..
1c10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
1c20: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 6b 65 (interp, "Set ke
1c30: 79 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 y failed: ", REA
1c40: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
1c50: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 NULL);..goto err
1c60: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 or;. }. if
1c70: 20 28 73 61 6c 74 20 21 3d 20 4e 55 4c 4c 20 26 (salt != NULL &
1c80: 26 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 & EVP_PKEY_CTX_s
1c90: 65 74 31 5f 68 6b 64 66 5f 73 61 6c 74 28 70 63 et1_hkdf_salt(pc
1ca0: 74 78 2c 20 73 61 6c 74 2c 20 28 69 6e 74 29 20 tx, salt, (int)
1cb0: 73 61 6c 74 5f 6c 65 6e 29 20 3c 20 31 29 20 7b salt_len) < 1) {
1cc0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
1cd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
1ce0: 73 61 6c 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 salt failed: ",
1cf0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
1d00: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 *) NULL);..goto
1d10: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 error;. }.
1d20: 20 69 66 20 28 69 6e 66 6f 20 21 3d 20 4e 55 4c if (info != NUL
1d30: 4c 20 26 26 20 45 56 50 5f 50 4b 45 59 5f 43 54 L && EVP_PKEY_CT
1d40: 58 5f 61 64 64 31 5f 68 6b 64 66 5f 69 6e 66 6f X_add1_hkdf_info
1d50: 28 70 63 74 78 2c 20 69 6e 66 6f 2c 20 28 69 6e (pctx, info, (in
1d60: 74 29 20 69 6e 66 6f 5f 6c 65 6e 29 20 3c 20 31 t) info_len) < 1
1d70: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
1d80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
1d90: 65 74 20 69 6e 66 6f 20 66 61 69 6c 65 64 3a 20 et info failed:
1da0: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 ", REASON(), (ch
1db0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f ar *) NULL);..go
1dc0: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
1dd0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 62 75 66 66 . /* Get buff
1de0: 65 72 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 er */. result
1df0: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Obj = Tcl_NewObj
1e00: 28 29 3b 0a 20 20 20 20 69 66 20 28 28 6f 75 74 ();. if ((out
1e10: 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 = Tcl_SetByteAr
1e20: 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 rayLength(result
1e30: 4f 62 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 Obj, (Tcl_Size)
1e40: 64 6b 5f 6c 65 6e 29 29 20 3d 3d 20 4e 55 4c 4c dk_len)) == NULL
1e50: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
1e60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d esult(interp, "M
1e70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
1e80: 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a error", (char *
1e90: 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 ) NULL);..goto e
1ea0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rror;. }.
1eb0: 6f 75 74 5f 6c 65 6e 20 3d 20 28 73 69 7a 65 5f out_len = (size_
1ec0: 74 29 20 64 6b 5f 6c 65 6e 3b 0a 0a 20 20 20 20 t) dk_len;..
1ed0: 2f 2a 20 44 65 72 69 76 65 20 6b 65 79 20 2a 2f /* Derive key */
1ee0: 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45 . if (EVP_PKE
1ef0: 59 5f 64 65 72 69 76 65 28 70 63 74 78 2c 20 6f Y_derive(pctx, o
1f00: 75 74 2c 20 26 6f 75 74 5f 6c 65 6e 29 20 3e 20 ut, &out_len) >
1f10: 30 29 20 7b 0a 09 2f 2a 20 53 68 72 69 6e 6b 20 0) {../* Shrink
1f20: 62 75 66 66 65 72 20 74 6f 20 61 63 74 75 61 6c buffer to actual
1f30: 20 73 69 7a 65 20 2a 2f 0a 09 54 63 6c 5f 53 65 size */..Tcl_Se
1f40: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
1f50: 28 72 65 73 75 6c 74 4f 62 6a 2c 20 28 54 63 6c (resultObj, (Tcl
1f60: 5f 53 69 7a 65 29 20 6f 75 74 5f 6c 65 6e 29 3b _Size) out_len);
1f70: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
1f80: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c lt(interp, resul
1f90: 74 4f 62 6a 29 3b 0a 09 72 65 73 20 3d 20 54 43 tObj);..res = TC
1fa0: 4c 5f 4f 4b 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65 L_OK;..goto done
1fb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
1fc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
1fd0: 28 69 6e 74 65 72 70 2c 20 22 4b 65 79 20 64 65 (interp, "Key de
1fe0: 72 69 76 61 74 69 6f 6e 20 66 61 69 6c 65 64 3a rivation failed:
1ff0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 ", REASON(), (c
2000: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 har *) NULL);..T
2010: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
2020: 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 resultObj);.
2030: 7d 0a 0a 65 72 72 6f 72 3a 0a 20 20 20 20 72 65 }..error:. re
2040: 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 64 s = TCL_ERROR;.d
2050: 6f 6e 65 3a 0a 20 20 20 20 69 66 20 28 70 63 74 one:. if (pct
2060: 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 x != NULL) {..EV
2070: 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 P_PKEY_CTX_free(
2080: 70 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 pctx);. }.
2090: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a return res;.}..
20a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b --------. *. * K
20f0: 44 46 5f 53 63 72 79 70 74 20 2d 2d 0a 20 2a 0a DF_Scrypt --. *.
2100: 20 2a 09 48 4d 41 43 2d 62 61 73 65 64 20 45 78 *.HMAC-based Ex
2110: 74 72 61 63 74 2d 61 6e 64 2d 45 78 70 61 6e 64 tract-and-Expand
2120: 20 4b 65 79 20 44 65 72 69 76 61 74 69 6f 6e 20 Key Derivation
2130: 46 75 6e 63 74 69 6f 6e 20 28 48 4b 44 46 29 2e Function (HKDF).
2140: 0a 20 2a 09 53 65 65 20 52 46 43 20 35 38 36 39 . *.See RFC 5869
2150: 20 61 6e 64 20 52 46 43 20 37 39 31 34 2e 0a 20 and RFC 7914..
2160: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
2170: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 .TCL_OK or TCL_E
2180: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 RROR. *. * Side
2190: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
21a0: 20 72 65 73 75 6c 74 20 74 6f 20 61 20 6c 69 73 result to a lis
21b0: 74 20 6f 66 20 6b 65 79 20 61 6e 64 20 69 76 20 t of key and iv
21c0: 76 61 6c 75 65 73 2c 20 6f 72 20 61 6e 20 65 72 values, or an er
21d0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 ror message. *.
21e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2220: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
2230: 69 6e 74 20 4b 44 46 5f 53 63 72 79 70 74 28 43 int KDF_Scrypt(C
2240: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
2250: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
2260: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
2270: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
2280: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
2290: 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 70 EVP_PKEY_CTX *p
22a0: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
22b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 unsigned char *s
22c0: 61 6c 74 20 3d 20 4e 55 4c 4c 2c 20 2a 70 61 73 alt = NULL, *pas
22d0: 73 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 75 74 20 3d s = NULL, *out =
22e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 NULL;. Tcl_S
22f0: 69 7a 65 20 73 61 6c 74 5f 6c 65 6e 20 3d 20 30 ize salt_len = 0
2300: 2c 20 70 61 73 73 5f 6c 65 6e 20 3d 20 30 3b 0a , pass_len = 0;.
2310: 20 20 20 20 69 6e 74 20 64 6b 5f 6c 65 6e 20 3d int dk_len =
2320: 20 36 34 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f 64, res = TCL_O
2330: 4b 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 K;. Tcl_Size
2340: 66 6e 3b 0a 20 20 20 20 75 69 6e 74 36 34 5f 74 fn;. uint64_t
2350: 20 4e 20 3d 20 30 2c 20 70 20 3d 20 30 2c 20 72 N = 0, p = 0, r
2360: 20 3d 20 30 2c 20 6d 61 78 6d 65 6d 20 3d 20 30 = 0, maxmem = 0
2370: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6f 75 74 ;. size_t out
2380: 5f 6c 65 6e 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 _len;. Tcl_Ob
2390: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 20 20 j *resultObj;.
23a0: 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 (void) clientD
23b0: 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 ata;.. dprint
23c0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
23d0: 20 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f 72 /* Clear error
23e0: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 s */. Tcl_Res
23f0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 etResult(interp)
2400: 3b 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f ;. ERR_clear_
2410: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f 2a error();.. /*
2420: 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f Validate arg co
2430: 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f unt */. if (o
2440: 62 6a 63 20 3c 20 35 20 7c 7c 20 6f 62 6a 63 20 bjc < 5 || objc
2450: 3e 20 31 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f > 13) {..Tcl_Wro
2460: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
2470: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 2d 70 61 73 , 1, objv, "-pas
2480: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 2d 73 61 sword string -sa
2490: 6c 74 20 73 74 72 69 6e 67 20 3f 2d 4e 20 63 6f lt string ?-N co
24a0: 73 74 50 61 72 61 6d 65 74 65 72 3f 20 3f 2d 72 stParameter? ?-r
24b0: 20 62 6c 6f 63 6b 53 69 7a 65 3f 20 3f 2d 70 20 blockSize? ?-p
24c0: 70 61 72 61 6c 6c 65 6c 69 7a 61 74 69 6f 6e 3f parallelization?
24d0: 20 3f 2d 73 69 7a 65 20 64 65 72 69 76 65 64 5f ?-size derived_
24e0: 6c 65 6e 67 74 68 3f 22 29 3b 0a 09 72 65 74 75 length?");..retu
24f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
2500: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
2510: 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 options */. f
2520: 6f 72 20 28 69 6e 74 20 69 64 78 20 3d 20 31 3b or (int idx = 1;
2530: 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 idx < objc; idx
2540: 2b 2b 29 20 7b 0a 09 2f 2a 20 47 65 74 20 6f 70 ++) {../* Get op
2550: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 54 63 6c tion */..if (Tcl
2560: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a _GetIndexFromObj
2570: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 64 (interp, objv[id
2580: 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 x], command_opts
2590: 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 , "option", 0, &
25a0: 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b fn) != TCL_OK) {
25b0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
25c0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 _ERROR;..}.../*
25d0: 56 61 6c 69 64 61 74 65 20 61 72 67 20 68 61 73 Validate arg has
25e0: 20 61 20 76 61 6c 75 65 20 2a 2f 0a 09 69 66 20 a value */..if
25f0: 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a 63 29 20 (++idx >= objc)
2600: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
2610: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
2620: 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72 20 6f 70 "No value for op
2630: 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d 6d 61 6e tion \"", comman
2640: 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22 5c 22 22 d_opts[fn], "\""
2650: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
2660: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
2670: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 73 77 L_ERROR;..}...sw
2680: 69 74 63 68 28 66 6e 29 20 7b 0a 09 63 61 73 65 itch(fn) {..case
2690: 20 5f 6f 70 74 5f 6b 65 79 3a 0a 09 63 61 73 65 _opt_key:..case
26a0: 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72 64 3a 0a _opt_password:.
26b0: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 . GET_OPT_BYT
26c0: 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 E_ARRAY(objv[idx
26d0: 5d 2c 20 70 61 73 73 2c 20 26 70 61 73 73 5f 6c ], pass, &pass_l
26e0: 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b en);.. break;
26f0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 61 6c 74 ..case _opt_salt
2700: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 :.. GET_OPT_B
2710: 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 YTE_ARRAY(objv[i
2720: 64 78 5d 2c 20 73 61 6c 74 2c 20 26 73 61 6c 74 dx], salt, &salt
2730: 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 _len);.. brea
2740: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6c 65 k;..case _opt_le
2750: 6e 67 74 68 3a 0a 09 63 61 73 65 20 5f 6f 70 74 ngth:..case _opt
2760: 5f 73 69 7a 65 3a 0a 09 20 20 20 20 69 66 20 28 _size:.. if (
2770: 55 74 69 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 Util_GetInt(inte
2780: 72 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 rp, objv[idx], &
2790: 64 6b 5f 6c 65 6e 2c 20 63 6f 6d 6d 61 6e 64 5f dk_len, command_
27a0: 6f 70 74 73 5b 66 6e 5d 2c 20 31 2c 20 30 29 20 opts[fn], 1, 0)
27b0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 67 != TCL_OK) {...g
27c0: 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 20 oto error;..
27d0: 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 }.. break;..c
27e0: 61 73 65 20 5f 6f 70 74 5f 4e 3a 0a 09 63 61 73 ase _opt_N:..cas
27f0: 65 20 5f 6f 70 74 5f 6e 3a 0a 09 20 20 20 20 47 e _opt_n:.. G
2800: 45 54 5f 4f 50 54 5f 57 49 44 45 28 6f 62 6a 76 ET_OPT_WIDE(objv
2810: 5b 69 64 78 5d 2c 20 26 4e 29 3b 0a 09 20 20 20 [idx], &N);..
2820: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f break;..case _o
2830: 70 74 5f 72 3a 0a 09 20 20 20 20 47 45 54 5f 4f pt_r:.. GET_O
2840: 50 54 5f 57 49 44 45 28 6f 62 6a 76 5b 69 64 78 PT_WIDE(objv[idx
2850: 5d 2c 20 26 72 29 3b 0a 09 20 20 20 20 62 72 65 ], &r);.. bre
2860: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 70 ak;..case _opt_p
2870: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 57 :.. GET_OPT_W
2880: 49 44 45 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 IDE(objv[idx], &
2890: 70 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a p);.. break;.
28a0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 .}. }.. if
28b0: 20 28 70 61 73 73 20 3d 3d 20 4e 55 4c 4c 29 20 (pass == NULL)
28c0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
28d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 ult(interp, "no
28e0: 70 61 73 73 77 6f 72 64 22 2c 20 28 63 68 61 72 password", (char
28f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
2900: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
2910: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 61 6c }.. if (sal
2920: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 t == NULL) {..Tc
2930: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
2940: 6e 74 65 72 70 2c 20 22 6e 6f 20 73 61 6c 74 22 nterp, "no salt"
2950: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
2960: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
2970: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
2980: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6e 74 65 78 /* Create contex
2990: 74 20 2a 2f 0a 20 20 20 20 70 63 74 78 20 3d 20 t */. pctx =
29a0: 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 EVP_PKEY_CTX_new
29b0: 5f 69 64 28 45 56 50 5f 50 4b 45 59 5f 53 43 52 _id(EVP_PKEY_SCR
29c0: 59 50 54 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 YPT, NULL);.
29d0: 69 66 20 28 70 63 74 78 20 3d 3d 20 4e 55 4c 4c if (pctx == NULL
29e0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
29f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d esult(interp, "M
2a00: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
2a10: 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a error", (char *
2a20: 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 ) NULL);..goto e
2a30: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 rror;. }..
2a40: 20 69 66 20 28 45 56 50 5f 50 4b 45 59 5f 64 65 if (EVP_PKEY_de
2a50: 72 69 76 65 5f 69 6e 69 74 28 70 63 74 78 29 20 rive_init(pctx)
2a60: 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 < 1) {..Tcl_Appe
2a70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
2a80: 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 66 61 69 "Initialize fai
2a90: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 led: ", REASON()
2aa0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
2ab0: 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 ;..goto error;.
2ac0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
2ad0: 20 63 6f 6e 66 69 67 20 70 61 72 61 6d 65 74 65 config paramete
2ae0: 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 rs */. if (EV
2af0: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 31 5f P_PKEY_CTX_set1_
2b00: 70 62 65 5f 70 61 73 73 28 70 63 74 78 2c 20 70 pbe_pass(pctx, p
2b10: 61 73 73 2c 20 28 69 6e 74 29 20 70 61 73 73 5f ass, (int) pass_
2b20: 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c len) < 1) {..Tcl
2b30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
2b40: 74 65 72 70 2c 20 22 53 65 74 20 6b 65 79 20 66 terp, "Set key f
2b50: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e ailed: ", REASON
2b60: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
2b70: 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b L);..goto error;
2b80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 45 . }. if (E
2b90: 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 31 VP_PKEY_CTX_set1
2ba0: 5f 73 63 72 79 70 74 5f 73 61 6c 74 28 70 63 74 _scrypt_salt(pct
2bb0: 78 2c 20 73 61 6c 74 2c 20 28 69 6e 74 29 20 73 x, salt, (int) s
2bc0: 61 6c 74 5f 6c 65 6e 29 20 3c 20 31 29 20 7b 0a alt_len) < 1) {.
2bd0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
2be0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 73 t(interp, "Set s
2bf0: 61 6c 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 alt failed: ", R
2c00: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
2c10: 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 ) NULL);..goto e
2c20: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rror;. }.
2c30: 69 66 20 28 4e 20 21 3d 20 30 20 26 26 20 45 56 if (N != 0 && EV
2c40: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 P_PKEY_CTX_set_s
2c50: 63 72 79 70 74 5f 4e 28 70 63 74 78 2c 20 4e 29 crypt_N(pctx, N)
2c60: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 < 1) {..Tcl_App
2c70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
2c80: 2c 20 22 53 65 74 20 63 6f 73 74 20 70 61 72 61 , "Set cost para
2c90: 6d 65 74 65 72 20 28 4e 29 20 66 61 69 6c 65 64 meter (N) failed
2ca0: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 : ", REASON(), (
2cb0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
2cc0: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 goto error;.
2cd0: 7d 0a 20 20 20 20 69 66 20 28 72 20 21 3d 20 30 }. if (r != 0
2ce0: 20 26 26 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 && EVP_PKEY_CTX
2cf0: 5f 73 65 74 5f 73 63 72 79 70 74 5f 72 28 70 63 _set_scrypt_r(pc
2d00: 74 78 2c 20 72 29 20 3c 20 31 29 20 7b 0a 09 54 tx, r) < 1) {..T
2d10: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
2d20: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 6c 6f 63 interp, "Set loc
2d30: 6b 20 73 69 7a 65 20 70 61 72 61 6d 65 74 65 72 k size parameter
2d40: 20 28 72 29 20 66 61 69 6c 65 64 3a 20 22 2c 20 (r) failed: ",
2d50: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
2d60: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 *) NULL);..goto
2d70: 65 72 72 6f 72 3b 0a 20 20 20 7d 0a 20 20 20 20 error;. }.
2d80: 69 66 20 28 70 20 21 3d 20 30 20 26 26 20 45 56 if (p != 0 && EV
2d90: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 P_PKEY_CTX_set_s
2da0: 63 72 79 70 74 5f 70 28 70 63 74 78 2c 20 70 29 crypt_p(pctx, p)
2db0: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 < 1) {..Tcl_App
2dc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
2dd0: 2c 20 22 53 65 74 20 50 61 72 61 6c 6c 65 6c 69 , "Set Paralleli
2de0: 7a 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 zation parameter
2df0: 20 28 70 29 20 66 61 69 6c 65 64 3a 20 22 2c 20 (p) failed: ",
2e00: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
2e10: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 *) NULL);..goto
2e20: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 error;. }.
2e30: 20 69 66 20 28 6d 61 78 6d 65 6d 20 21 3d 20 30 if (maxmem != 0
2e40: 20 26 26 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 && EVP_PKEY_CTX
2e50: 5f 73 65 74 5f 73 63 72 79 70 74 5f 6d 61 78 6d _set_scrypt_maxm
2e60: 65 6d 5f 62 79 74 65 73 28 70 63 74 78 2c 20 6d em_bytes(pctx, m
2e70: 61 78 6d 65 6d 29 20 3c 20 31 29 20 7b 0a 09 54 axmem) < 1) {..T
2e80: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
2e90: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 6d 61 78 interp, "Set max
2ea0: 20 6d 65 6d 6f 72 79 20 66 61 69 6c 65 64 3a 20 memory failed:
2eb0: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 ", REASON(), (ch
2ec0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f ar *) NULL);..go
2ed0: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
2ee0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 62 75 66 66 . /* Get buff
2ef0: 65 72 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 er */. result
2f00: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Obj = Tcl_NewObj
2f10: 28 29 3b 0a 20 20 20 20 69 66 20 28 28 6f 75 74 ();. if ((out
2f20: 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 = Tcl_SetByteAr
2f30: 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 rayLength(result
2f40: 4f 62 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 Obj, (Tcl_Size)
2f50: 64 6b 5f 6c 65 6e 29 29 20 3d 3d 20 4e 55 4c 4c dk_len)) == NULL
2f60: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
2f70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d esult(interp, "M
2f80: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
2f90: 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a error", (char *
2fa0: 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 ) NULL);..goto e
2fb0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rror;. }.
2fc0: 6f 75 74 5f 6c 65 6e 20 3d 20 28 73 69 7a 65 5f out_len = (size_
2fd0: 74 29 20 64 6b 5f 6c 65 6e 3b 0a 0a 20 20 20 20 t) dk_len;..
2fe0: 2f 2a 20 44 65 72 69 76 65 20 6b 65 79 20 2a 2f /* Derive key */
2ff0: 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45 . if (EVP_PKE
3000: 59 5f 64 65 72 69 76 65 28 70 63 74 78 2c 20 6f Y_derive(pctx, o
3010: 75 74 2c 20 26 6f 75 74 5f 6c 65 6e 29 20 3e 20 ut, &out_len) >
3020: 30 29 20 7b 0a 09 2f 2a 20 53 68 72 69 6e 6b 20 0) {../* Shrink
3030: 62 75 66 66 65 72 20 74 6f 20 61 63 74 75 61 6c buffer to actual
3040: 20 73 69 7a 65 20 2a 2f 0a 09 54 63 6c 5f 53 65 size */..Tcl_Se
3050: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
3060: 28 72 65 73 75 6c 74 4f 62 6a 2c 20 28 54 63 6c (resultObj, (Tcl
3070: 5f 53 69 7a 65 29 20 6f 75 74 5f 6c 65 6e 29 3b _Size) out_len);
3080: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
3090: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c lt(interp, resul
30a0: 74 4f 62 6a 29 3b 0a 09 67 6f 74 6f 20 64 6f 6e tObj);..goto don
30b0: 65 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e;.. } else {
30c0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
30d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4b 65 79 20 lt(interp, "Key
30e0: 64 65 72 69 76 61 74 69 6f 6e 20 66 61 69 6c 65 derivation faile
30f0: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 d: ", REASON(),
3100: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
3110: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
3120: 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 t(resultObj);.
3130: 20 20 7d 0a 0a 65 72 72 6f 72 3a 0a 20 20 20 20 }..error:.
3140: 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b res = TCL_ERROR;
3150: 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20 69 66 20 28 ..done:. if (
3160: 70 63 74 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a pctx != NULL) {.
3170: 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 .EVP_PKEY_CTX_fr
3180: 65 65 28 70 63 74 78 29 3b 0a 20 20 20 20 7d 0a ee(pctx);. }.
3190: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
31a0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
31b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
31f0: 2a 20 54 6c 73 5f 4b 65 79 43 6f 6d 6d 61 6e 64 * Tls_KeyCommand
3200: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 s --. *. *.Creat
3210: 65 20 6b 65 79 20 63 6f 6d 6d 61 6e 64 73 0a 20 e key commands.
3220: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
3230: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 .TCL_OK or TCL_E
3240: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 RROR. *. * Side
3250: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 effects:. *.Crea
3260: 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a tes commands. *.
3270: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c -----. */.int Tl
32c0: 73 5f 4b 44 46 43 6f 6d 6d 61 6e 64 73 28 54 63 s_KDFCommands(Tc
32d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
32e0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 ) {. Tcl_Crea
32f0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
3300: 65 72 70 2c 20 22 74 6c 73 3a 3a 68 6b 64 66 22 erp, "tls::hkdf"
3310: 2c 20 4b 44 46 5f 48 4b 44 46 2c 20 28 43 6c 69 , KDF_HKDF, (Cli
3320: 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
3330: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
3340: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
3350: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
3360: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
3370: 73 3a 3a 70 62 6b 64 66 32 22 2c 20 4b 44 46 5f s::pbkdf2", KDF_
3380: 50 42 4b 44 46 32 2c 20 28 43 6c 69 65 6e 74 44 PBKDF2, (ClientD
3390: 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f ata) NULL, (Tcl_
33a0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
33b0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
33c0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
33d0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 (interp, "tls::s
33e0: 63 72 79 70 74 22 2c 20 4b 44 46 5f 53 63 72 79 crypt", KDF_Scry
33f0: 70 74 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 pt, (ClientData)
3400: 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
3410: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
3420: 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 L);. return T
3430: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a CL_OK;.}..