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 31 29 29 20 objv[idx], 1))
0990: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 == NULL) {...ret
09a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
09b0: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b }.. break
09c0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 64 69 67 ;..case _opt_dig
09d0: 65 73 74 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f est:..case _opt_
09e0: 68 61 73 68 3a 0a 09 20 20 20 20 69 66 20 28 28 hash:.. if ((
09f0: 6d 64 20 3d 20 55 74 69 6c 5f 47 65 74 44 69 67 md = Util_GetDig
0a00: 65 73 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 est(interp, objv
0a10: 5b 69 64 78 5d 2c 20 31 29 29 20 3d 3d 20 4e 55 [idx], 1)) == NU
0a20: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 LL) {...return T
0a30: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
0a40: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 .. break;..ca
0a50: 73 65 20 5f 6f 70 74 5f 69 74 65 72 3a 0a 09 20 se _opt_iter:..
0a60: 20 20 20 69 66 20 28 55 74 69 6c 5f 47 65 74 49 if (Util_GetI
0a70: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b nt(interp, objv[
0a80: 69 64 78 5d 2c 20 26 69 74 65 72 2c 20 22 69 74 idx], &iter, "it
0a90: 65 72 61 74 69 6f 6e 73 22 2c 20 31 2c 20 2d 31 erations", 1, -1
0aa0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
0ab0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
0ac0: 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 R;.. }.. b
0ad0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 reak;..case _opt
0ae0: 5f 6b 65 79 3a 0a 09 63 61 73 65 20 5f 6f 70 74 _key:..case _opt
0af0: 5f 70 61 73 73 77 6f 72 64 3a 0a 09 20 20 20 20 _password:..
0b00: 70 61 73 73 20 3d 20 55 74 69 6c 5f 47 65 74 4b pass = Util_GetK
0b10: 65 79 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b ey(interp, objv[
0b20: 69 64 78 5d 2c 20 26 70 61 73 73 5f 6c 65 6e 2c idx], &pass_len,
0b30: 20 28 63 68 61 72 20 2a 29 20 63 6f 6d 6d 61 6e (char *) comman
0b40: 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 30 2c 20 30 d_opts[fn], 0, 0
0b50: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 );.. break;..
0b60: 63 61 73 65 20 5f 6f 70 74 5f 73 61 6c 74 3a 0a case _opt_salt:.
0b70: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 . GET_OPT_BYT
0b80: 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 E_ARRAY(objv[idx
0b90: 5d 2c 20 73 61 6c 74 2c 20 26 73 61 6c 74 5f 6c ], salt, &salt_l
0ba0: 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b en);.. break;
0bb0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6c 65 6e 67 ..case _opt_leng
0bc0: 74 68 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 th:..case _opt_s
0bd0: 69 7a 65 3a 0a 09 20 20 20 20 69 66 20 28 55 74 ize:.. if (Ut
0be0: 69 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 il_GetInt(interp
0bf0: 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 64 6b , objv[idx], &dk
0c00: 5f 6c 65 6e 2c 20 28 63 68 61 72 20 2a 29 20 63 _len, (char *) c
0c10: 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c ommand_opts[fn],
0c20: 20 31 2c 20 62 75 66 5f 6c 65 6e 29 20 21 3d 20 1, buf_len) !=
0c30: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 TCL_OK) {...retu
0c40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
0c50: 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b }.. break;
0c60: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
0c70: 2a 20 56 61 6c 69 64 61 74 65 20 6f 70 74 69 6f * Validate optio
0c80: 6e 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 6d 64 ns */. if (md
0c90: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
0ca0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
0cb0: 74 65 72 70 2c 20 22 6e 6f 20 64 69 67 65 73 74 terp, "no digest
0cc0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
0cd0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
0ce0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
0cf0: 20 2f 2a 20 53 65 74 20 6f 75 74 70 75 74 20 74 /* Set output t
0d00: 79 70 65 20 73 69 7a 65 73 20 2a 2f 0a 20 20 20 ype sizes */.
0d10: 20 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20 4e if (cipher == N
0d20: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 64 6b 5f 6c ULL) {..if (dk_l
0d30: 65 6e 20 3e 20 62 75 66 5f 6c 65 6e 29 20 64 6b en > buf_len) dk
0d40: 5f 6c 65 6e 20 3d 20 62 75 66 5f 6c 65 6e 3b 0a _len = buf_len;.
0d50: 09 69 6b 6c 65 6e 20 3d 20 64 6b 5f 6c 65 6e 3b .iklen = dk_len;
0d60: 0a 09 69 76 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 ..ivlen = 0;.
0d70: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 6b 6c 65 6e } else {..iklen
0d80: 20 3d 20 45 56 50 5f 43 49 50 48 45 52 5f 6b 65 = EVP_CIPHER_ke
0d90: 79 5f 6c 65 6e 67 74 68 28 63 69 70 68 65 72 29 y_length(cipher)
0da0: 3b 0a 09 69 76 6c 65 6e 20 3d 20 45 56 50 5f 43 ;..ivlen = EVP_C
0db0: 49 50 48 45 52 5f 69 76 5f 6c 65 6e 67 74 68 28 IPHER_iv_length(
0dc0: 63 69 70 68 65 72 29 3b 0a 09 64 6b 5f 6c 65 6e cipher);..dk_len
0dd0: 20 3d 20 69 6b 6c 65 6e 2b 69 76 6c 65 6e 3b 0a = iklen+ivlen;.
0de0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 }.. /* De
0df0: 72 69 76 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 rive key */.
0e00: 69 66 20 28 21 50 4b 43 53 35 5f 50 42 4b 44 46 if (!PKCS5_PBKDF
0e10: 32 5f 48 4d 41 43 28 28 63 6f 6e 73 74 20 63 68 2_HMAC((const ch
0e20: 61 72 20 2a 29 20 70 61 73 73 2c 20 28 69 6e 74 ar *) pass, (int
0e30: 29 20 70 61 73 73 5f 6c 65 6e 2c 20 73 61 6c 74 ) pass_len, salt
0e40: 2c 20 28 69 6e 74 29 20 73 61 6c 74 5f 6c 65 6e , (int) salt_len
0e50: 2c 20 69 74 65 72 2c 20 6d 64 2c 20 64 6b 5f 6c , iter, md, dk_l
0e60: 65 6e 2c 20 74 6d 70 6b 65 79 69 76 29 29 20 7b en, tmpkeyiv)) {
0e70: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
0e80: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4b 65 79 20 lt(interp, "Key
0e90: 64 65 72 69 76 61 74 69 6f 6e 20 66 61 69 6c 65 derivation faile
0ea0: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 d: ", GET_ERR_RE
0eb0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
0ec0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
0ed0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
0ee0: 0a 0a 20 20 20 2f 2a 20 53 65 74 20 72 65 73 75 .. /* Set resu
0ef0: 6c 74 20 74 6f 20 6b 65 79 20 61 6e 64 20 69 76 lt to key and iv
0f00: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 69 70 68 */. if (ciph
0f10: 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 er == NULL) {..T
0f20: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
0f30: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 interp, Tcl_NewB
0f40: 79 74 65 41 72 72 61 79 4f 62 6a 28 74 6d 70 6b yteArrayObj(tmpk
0f50: 65 79 69 76 2c 20 28 54 63 6c 5f 53 69 7a 65 29 eyiv, (Tcl_Size)
0f60: 20 64 6b 5f 6c 65 6e 29 29 3b 0a 20 20 20 20 7d dk_len));. }
0f70: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a else {..Tcl_Obj
0f80: 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 *resultObj = Tc
0f90: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 l_NewListObj(0,
0fa0: 4e 55 4c 4c 29 3b 0a 09 4c 41 50 50 45 4e 44 5f NULL);..LAPPEND_
0fb0: 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 72 BARRAY(interp, r
0fc0: 65 73 75 6c 74 4f 62 6a 2c 20 22 6b 65 79 22 2c esultObj, "key",
0fd0: 20 74 6d 70 6b 65 79 69 76 2c 20 28 54 63 6c 5f tmpkeyiv, (Tcl_
0fe0: 53 69 7a 65 29 20 69 6b 6c 65 6e 29 3b 0a 09 4c Size) iklen);..L
0ff0: 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e APPEND_BARRAY(in
1000: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c terp, resultObj,
1010: 20 22 69 76 22 2c 20 74 6d 70 6b 65 79 69 76 2b "iv", tmpkeyiv+
1020: 69 6b 6c 65 6e 2c 20 28 54 63 6c 5f 53 69 7a 65 iklen, (Tcl_Size
1030: 29 20 69 76 6c 65 6e 29 3b 0a 09 54 63 6c 5f 53 ) ivlen);..Tcl_S
1040: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
1050: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a rp, resultObj);.
1060: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c }.. /* Cl
1070: 65 61 72 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 ear data */.
1080: 6d 65 6d 73 65 74 28 74 6d 70 6b 65 79 69 76 2c memset(tmpkeyiv,
1090: 20 30 2c 20 62 75 66 5f 6c 65 6e 29 3b 0a 20 20 0, buf_len);.
10a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
10b0: 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d ----------------
10e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
1100: 20 2a 20 4b 44 46 5f 48 4b 44 46 20 2d 2d 0a 20 * KDF_HKDF --.
1110: 2a 0a 20 2a 09 48 4d 41 43 2d 62 61 73 65 64 20 *. *.HMAC-based
1120: 45 78 74 72 61 63 74 2d 61 6e 64 2d 45 78 70 61 Extract-and-Expa
1130: 6e 64 20 4b 65 79 20 44 65 72 69 76 61 74 69 6f nd Key Derivatio
1140: 6e 20 46 75 6e 63 74 69 6f 6e 20 28 48 4b 44 46 n Function (HKDF
1150: 29 2e 0a 20 2a 09 53 65 65 20 52 46 43 20 35 38 ).. *.See RFC 58
1160: 36 39 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 69.. *. * Return
1170: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 s:. *.TCL_OK or
1180: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 TCL_ERROR. *. *
1190: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
11a0: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 .Sets result to
11b0: 61 20 6b 65 79 20 6f 66 20 73 70 65 63 69 66 69 a key of specifi
11c0: 65 64 20 6c 65 6e 67 74 68 2c 20 6f 72 20 61 6e ed length, or an
11d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 error message.
11e0: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1220: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
1230: 69 63 20 69 6e 74 20 4b 44 46 5f 48 4b 44 46 28 ic int KDF_HKDF(
1240: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
1250: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
1260: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
1270: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
1280: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
1290: 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a EVP_PKEY_CTX *
12a0: 70 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 pctx = NULL;.
12b0: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d const EVP_MD *m
12c0: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e d = NULL;. un
12d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 61 6c signed char *sal
12e0: 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79 20 3d t = NULL, *key =
12f0: 20 4e 55 4c 4c 2c 20 2a 69 6e 66 6f 20 3d 20 4e NULL, *info = N
1300: 55 4c 4c 2c 20 2a 6f 75 74 20 3d 20 4e 55 4c 4c ULL, *out = NULL
1310: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 73 ;. Tcl_Size s
1320: 61 6c 74 5f 6c 65 6e 20 3d 20 30 2c 20 6b 65 79 alt_len = 0, key
1330: 5f 6c 65 6e 20 3d 20 30 2c 20 69 6e 66 6f 5f 6c _len = 0, info_l
1340: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 en = 0;. int
1350: 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 res = TCL_OK;.
1360: 20 20 54 63 6c 5f 53 69 7a 65 20 66 6e 3b 0a 20 Tcl_Size fn;.
1370: 20 20 20 69 6e 74 20 64 6b 5f 6c 65 6e 20 3d 20 int dk_len =
1380: 45 56 50 5f 4d 41 58 5f 4b 45 59 5f 4c 45 4e 47 EVP_MAX_KEY_LENG
1390: 54 48 20 2b 20 45 56 50 5f 4d 41 58 5f 49 56 5f TH + EVP_MAX_IV_
13a0: 4c 45 4e 47 54 48 3b 0a 20 20 20 20 73 69 7a 65 LENGTH;. size
13b0: 5f 74 20 6f 75 74 5f 6c 65 6e 3b 0a 20 20 20 20 _t out_len;.
13c0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f Tcl_Obj *resultO
13d0: 62 6a 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 bj;. (void) c
13e0: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 lientData;..
13f0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
1400: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 );.. /* Clear
1410: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54 errors */. T
1420: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 cl_ResetResult(i
1430: 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 52 52 5f nterp);. ERR_
1440: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a clear_error();..
1450: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 /* Validate
1460: 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 arg count */.
1470: 20 69 66 20 28 6f 62 6a 63 20 3c 20 35 20 7c 7c if (objc < 5 ||
1480: 20 6f 62 6a 63 20 3e 20 31 31 29 20 7b 0a 09 54 objc > 11) {..T
1490: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
14a0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
14b0: 20 22 2d 64 69 67 65 73 74 20 64 69 67 65 73 74 "-digest digest
14c0: 20 2d 6b 65 79 20 73 74 72 69 6e 67 20 3f 2d 69 -key string ?-i
14d0: 6e 66 6f 20 73 74 72 69 6e 67 3f 20 3f 2d 73 61 nfo string? ?-sa
14e0: 6c 74 20 73 74 72 69 6e 67 3f 20 3f 2d 73 69 7a lt string? ?-siz
14f0: 65 20 64 65 72 69 76 65 64 5f 6c 65 6e 67 74 68 e derived_length
1500: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
1510: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
1520: 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e /* Get option
1530: 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 6e s */. for (in
1540: 74 20 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c t idx = 1; idx <
1550: 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a objc; idx++) {.
1560: 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 2a ./* Get option *
1570: 2f 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e /..if (Tcl_GetIn
1580: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
1590: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f p, objv[idx], co
15a0: 6d 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74 mmand_opts, "opt
15b0: 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d ion", 0, &fn) !=
15c0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 TCL_OK) {..
15d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
15e0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61 ;..}.../* Valida
15f0: 74 65 20 61 72 67 20 68 61 73 20 61 20 76 61 6c te arg has a val
1600: 75 65 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 ue */..if (++idx
1610: 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 >= objc) {..
1620: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
1630: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 t(interp, "No va
1640: 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c lue for option \
1650: 22 22 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 "", command_opts
1660: 5b 66 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 [fn], "\"", (cha
1670: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 r *) NULL);..
1680: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
1690: 52 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 R;..}...switch(f
16a0: 6e 29 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f n) {..case _opt_
16b0: 64 69 67 65 73 74 3a 0a 09 63 61 73 65 20 5f 6f digest:..case _o
16c0: 70 74 5f 68 61 73 68 3a 0a 09 20 20 20 20 69 66 pt_hash:.. if
16d0: 20 28 28 6d 64 20 3d 20 55 74 69 6c 5f 47 65 74 ((md = Util_Get
16e0: 44 69 67 65 73 74 28 69 6e 74 65 72 70 2c 20 6f Digest(interp, o
16f0: 62 6a 76 5b 69 64 78 5d 2c 20 31 29 29 20 3d 3d bjv[idx], 1)) ==
1700: 20 4e 55 4c 4c 29 20 7b 0a 09 09 67 6f 74 6f 20 NULL) {...goto
1710: 65 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20 error;.. }..
1720: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 break;..case
1730: 5f 6f 70 74 5f 69 6e 66 6f 3a 0a 09 20 20 20 20 _opt_info:..
1740: 2f 2a 20 4d 61 78 20 31 30 32 34 2f 32 30 34 38 /* Max 1024/2048
1750: 20 2a 2f 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 */.. GET_OPT
1760: 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 _BYTE_ARRAY(objv
1770: 5b 69 64 78 5d 2c 20 69 6e 66 6f 2c 20 26 69 6e [idx], info, &in
1780: 66 6f 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 fo_len);.. br
1790: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
17a0: 6b 65 79 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f key:..case _opt_
17b0: 70 61 73 73 77 6f 72 64 3a 0a 09 20 20 20 20 69 password:.. i
17c0: 66 20 28 28 6b 65 79 20 3d 20 55 74 69 6c 5f 47 f ((key = Util_G
17d0: 65 74 4b 65 79 28 69 6e 74 65 72 70 2c 20 6f 62 etKey(interp, ob
17e0: 6a 76 5b 69 64 78 5d 2c 20 26 6b 65 79 5f 6c 65 jv[idx], &key_le
17f0: 6e 2c 20 28 63 68 61 72 20 2a 29 20 63 6f 6d 6d n, (char *) comm
1800: 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 30 2c and_opts[fn], 0,
1810: 20 31 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 1)) == NULL) {.
1820: 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 ..goto error;..
1830: 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b }.. break;
1840: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 61 6c 74 ..case _opt_salt
1850: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 :.. GET_OPT_B
1860: 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 YTE_ARRAY(objv[i
1870: 64 78 5d 2c 20 73 61 6c 74 2c 20 26 73 61 6c 74 dx], salt, &salt
1880: 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 _len);.. brea
1890: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6c 65 k;..case _opt_le
18a0: 6e 67 74 68 3a 0a 09 63 61 73 65 20 5f 6f 70 74 ngth:..case _opt
18b0: 5f 73 69 7a 65 3a 0a 09 20 20 20 20 69 66 20 28 _size:.. if (
18c0: 55 74 69 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 Util_GetInt(inte
18d0: 72 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 rp, objv[idx], &
18e0: 64 6b 5f 6c 65 6e 2c 20 28 63 68 61 72 20 2a 29 dk_len, (char *)
18f0: 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e command_opts[fn
1900: 5d 2c 20 31 2c 20 30 29 20 21 3d 20 54 43 4c 5f ], 1, 0) != TCL_
1910: 4f 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 65 72 72 OK) {...goto err
1920: 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 or;.. }..
1930: 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a break;..}. }.
1940: 0a 20 20 20 20 69 66 20 28 6d 64 20 3d 3d 20 4e . if (md == N
1950: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
1960: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
1970: 20 22 6e 6f 20 64 69 67 65 73 74 22 2c 20 28 63 "no digest", (c
1980: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 har *) NULL);..g
1990: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d oto error;. }
19a0: 0a 0a 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d .. if (key ==
19b0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
19c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
19d0: 70 2c 20 22 6e 6f 20 6b 65 79 22 2c 20 28 63 68 p, "no key", (ch
19e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f ar *) NULL);..go
19f0: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
1a00: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 . /* Create c
1a10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 70 63 ontext */. pc
1a20: 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 tx = EVP_PKEY_CT
1a30: 58 5f 6e 65 77 5f 69 64 28 45 56 50 5f 50 4b 45 X_new_id(EVP_PKE
1a40: 59 5f 48 4b 44 46 2c 20 4e 55 4c 4c 29 3b 0a 20 Y_HKDF, NULL);.
1a50: 20 20 20 69 66 20 28 70 63 74 78 20 3d 3d 20 4e if (pctx == N
1a60: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
1a70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
1a80: 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 "Memory allocat
1a90: 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61 ion error", (cha
1aa0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 r *) NULL);..got
1ab0: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a o error;. }..
1ac0: 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45 59 if (EVP_PKEY
1ad0: 5f 64 65 72 69 76 65 5f 69 6e 69 74 28 70 63 74 _derive_init(pct
1ae0: 78 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 x) < 1) {..Tcl_A
1af0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
1b00: 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 rp, "Initialize
1b10: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
1b20: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
1b30: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f ar *) NULL);..go
1b40: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
1b50: 0a 20 20 20 20 2f 2a 20 53 65 74 20 63 6f 6e 66 . /* Set conf
1b60: 69 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f ig parameters */
1b70: 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45 . if (EVP_PKE
1b80: 59 5f 43 54 58 5f 73 65 74 5f 68 6b 64 66 5f 6d Y_CTX_set_hkdf_m
1b90: 64 28 70 63 74 78 2c 20 6d 64 29 20 3c 20 31 29 d(pctx, md) < 1)
1ba0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
1bb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 sult(interp, "Se
1bc0: 74 20 64 69 67 65 73 74 20 66 61 69 6c 65 64 3a t digest failed:
1bd0: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
1be0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
1bf0: 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f ULL);..goto erro
1c00: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 r;. }. if
1c10: 28 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 (EVP_PKEY_CTX_se
1c20: 74 31 5f 68 6b 64 66 5f 6b 65 79 28 70 63 74 78 t1_hkdf_key(pctx
1c30: 2c 20 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65 79 , key, (int) key
1c40: 5f 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 _len) < 1) {..Tc
1c50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
1c60: 6e 74 65 72 70 2c 20 22 53 65 74 20 6b 65 79 20 nterp, "Set key
1c70: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
1c80: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
1c90: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f ar *) NULL);..go
1ca0: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
1cb0: 20 20 20 20 69 66 20 28 73 61 6c 74 20 21 3d 20 if (salt !=
1cc0: 4e 55 4c 4c 20 26 26 20 45 56 50 5f 50 4b 45 59 NULL && EVP_PKEY
1cd0: 5f 43 54 58 5f 73 65 74 31 5f 68 6b 64 66 5f 73 _CTX_set1_hkdf_s
1ce0: 61 6c 74 28 70 63 74 78 2c 20 73 61 6c 74 2c 20 alt(pctx, salt,
1cf0: 28 69 6e 74 29 20 73 61 6c 74 5f 6c 65 6e 29 20 (int) salt_len)
1d00: 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 < 1) {..Tcl_Appe
1d10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
1d20: 20 22 53 65 74 20 73 61 6c 74 20 66 61 69 6c 65 "Set salt faile
1d30: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 d: ", GET_ERR_RE
1d40: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
1d50: 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 NULL);..goto er
1d60: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ror;. }. i
1d70: 66 20 28 69 6e 66 6f 20 21 3d 20 4e 55 4c 4c 20 f (info != NULL
1d80: 26 26 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f && EVP_PKEY_CTX_
1d90: 61 64 64 31 5f 68 6b 64 66 5f 69 6e 66 6f 28 70 add1_hkdf_info(p
1da0: 63 74 78 2c 20 69 6e 66 6f 2c 20 28 69 6e 74 29 ctx, info, (int)
1db0: 20 69 6e 66 6f 5f 6c 65 6e 29 20 3c 20 31 29 20 info_len) < 1)
1dc0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
1dd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 ult(interp, "Set
1de0: 20 69 6e 66 6f 20 66 61 69 6c 65 64 3a 20 22 2c info failed: ",
1df0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
1e00: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
1e10: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a );..goto error;.
1e20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 }.. /* Ge
1e30: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 t buffer */.
1e40: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f resultObj = Tcl_
1e50: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 69 66 NewObj();. if
1e60: 20 28 28 6f 75 74 20 3d 20 54 63 6c 5f 53 65 74 ((out = Tcl_Set
1e70: 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 ByteArrayLength(
1e80: 72 65 73 75 6c 74 4f 62 6a 2c 20 28 54 63 6c 5f resultObj, (Tcl_
1e90: 53 69 7a 65 29 20 64 6b 5f 6c 65 6e 29 29 20 3d Size) dk_len)) =
1ea0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
1eb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
1ec0: 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f rp, "Memory allo
1ed0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 cation error", (
1ee0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
1ef0: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 goto error;.
1f00: 7d 0a 20 20 20 20 6f 75 74 5f 6c 65 6e 20 3d 20 }. out_len =
1f10: 28 73 69 7a 65 5f 74 29 20 64 6b 5f 6c 65 6e 3b (size_t) dk_len;
1f20: 0a 0a 20 20 20 20 2f 2a 20 44 65 72 69 76 65 20 .. /* Derive
1f30: 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 key */. if (E
1f40: 56 50 5f 50 4b 45 59 5f 64 65 72 69 76 65 28 70 VP_PKEY_derive(p
1f50: 63 74 78 2c 20 6f 75 74 2c 20 26 6f 75 74 5f 6c ctx, out, &out_l
1f60: 65 6e 29 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 53 en) > 0) {../* S
1f70: 68 72 69 6e 6b 20 62 75 66 66 65 72 20 74 6f 20 hrink buffer to
1f80: 61 63 74 75 61 6c 20 73 69 7a 65 20 2a 2f 0a 09 actual size */..
1f90: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 Tcl_SetByteArray
1fa0: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a Length(resultObj
1fb0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6f 75 74 , (Tcl_Size) out
1fc0: 5f 6c 65 6e 29 3b 0a 09 54 63 6c 5f 53 65 74 4f _len);..Tcl_SetO
1fd0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
1fe0: 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 72 65 resultObj);..re
1ff0: 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 09 67 6f 74 s = TCL_OK;..got
2000: 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 20 65 6c o done;. } el
2010: 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 se {..Tcl_Append
2020: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
2030: 4b 65 79 20 64 65 72 69 76 61 74 69 6f 6e 20 66 Key derivation f
2040: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
2050: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
2060: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c r *) NULL);..Tcl
2070: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 _DecrRefCount(re
2080: 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a sultObj);. }.
2090: 0a 65 72 72 6f 72 3a 0a 20 20 20 20 72 65 73 20 .error:. res
20a0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 64 6f 6e = TCL_ERROR;.don
20b0: 65 3a 0a 20 20 20 20 69 66 20 28 70 63 74 78 20 e:. if (pctx
20c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 50 5f != NULL) {..EVP_
20d0: 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 70 63 PKEY_CTX_free(pc
20e0: 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 tx);. }. r
20f0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a eturn res;.}../*
2100: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2140: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 44 46 ------. *. * KDF
2150: 5f 53 63 72 79 70 74 20 2d 2d 0a 20 2a 0a 20 2a _Scrypt --. *. *
2160: 09 48 4d 41 43 2d 62 61 73 65 64 20 45 78 74 72 .HMAC-based Extr
2170: 61 63 74 2d 61 6e 64 2d 45 78 70 61 6e 64 20 4b act-and-Expand K
2180: 65 79 20 44 65 72 69 76 61 74 69 6f 6e 20 46 75 ey Derivation Fu
2190: 6e 63 74 69 6f 6e 20 28 48 4b 44 46 29 2e 0a 20 nction (HKDF)..
21a0: 2a 09 53 65 65 20 52 46 43 20 35 38 36 39 20 61 *.See RFC 5869 a
21b0: 6e 64 20 52 46 43 20 37 39 31 34 2e 0a 20 2a 0a nd RFC 7914.. *.
21c0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
21d0: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
21e0: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
21f0: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 fects:. *.Sets r
2200: 65 73 75 6c 74 20 74 6f 20 61 20 6c 69 73 74 20 esult to a list
2210: 6f 66 20 6b 65 79 20 61 6e 64 20 69 76 20 76 61 of key and iv va
2220: 6c 75 65 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f lues, or an erro
2230: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d r message. *. *-
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2280: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
2290: 74 20 4b 44 46 5f 53 63 72 79 70 74 28 43 6c 69 t KDF_Scrypt(Cli
22a0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
22b0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
22c0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
22d0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
22e0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 45 objv[]) {. E
22f0: 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 70 63 74 VP_PKEY_CTX *pct
2300: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e x = NULL;. un
2310: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 61 6c signed char *sal
2320: 74 20 3d 20 4e 55 4c 4c 2c 20 2a 70 61 73 73 20 t = NULL, *pass
2330: 3d 20 4e 55 4c 4c 2c 20 2a 6f 75 74 20 3d 20 4e = NULL, *out = N
2340: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a ULL;. Tcl_Siz
2350: 65 20 73 61 6c 74 5f 6c 65 6e 20 3d 20 30 2c 20 e salt_len = 0,
2360: 70 61 73 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 pass_len = 0;.
2370: 20 20 69 6e 74 20 64 6b 5f 6c 65 6e 20 3d 20 36 int dk_len = 6
2380: 34 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b 4, res = TCL_OK;
2390: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 66 6e . Tcl_Size fn
23a0: 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e ;. Tcl_WideIn
23b0: 74 20 4e 20 3d 20 30 2c 20 70 20 3d 20 30 2c 20 t N = 0, p = 0,
23c0: 72 20 3d 20 30 2c 20 6d 61 78 6d 65 6d 20 3d 20 r = 0, maxmem =
23d0: 30 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6f 75 0;. size_t ou
23e0: 74 5f 6c 65 6e 3b 0a 20 20 20 20 54 63 6c 5f 4f t_len;. Tcl_O
23f0: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 20 bj *resultObj;.
2400: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 (void) client
2410: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
2420: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
2430: 20 20 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f /* Clear erro
2440: 72 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 rs */. Tcl_Re
2450: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 setResult(interp
2460: 29 3b 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 );. ERR_clear
2470: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f _error();.. /
2480: 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 * Validate arg c
2490: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 ount */. if (
24a0: 6f 62 6a 63 20 3c 20 35 20 7c 7c 20 6f 62 6a 63 objc < 5 || objc
24b0: 20 3e 20 31 33 29 20 7b 0a 09 54 63 6c 5f 57 72 > 13) {..Tcl_Wr
24c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
24d0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 2d 70 61 p, 1, objv, "-pa
24e0: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 2d 73 ssword string -s
24f0: 61 6c 74 20 73 74 72 69 6e 67 20 3f 2d 4e 20 63 alt string ?-N c
2500: 6f 73 74 50 61 72 61 6d 65 74 65 72 3f 20 3f 2d ostParameter? ?-
2510: 72 20 62 6c 6f 63 6b 53 69 7a 65 3f 20 3f 2d 70 r blockSize? ?-p
2520: 20 70 61 72 61 6c 6c 65 6c 69 7a 61 74 69 6f 6e parallelization
2530: 3f 20 3f 2d 73 69 7a 65 20 64 65 72 69 76 65 64 ? ?-size derived
2540: 5f 6c 65 6e 67 74 68 3f 22 29 3b 0a 09 72 65 74 _length?");..ret
2550: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
2560: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
2570: 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 options */.
2580: 66 6f 72 20 28 69 6e 74 20 69 64 78 20 3d 20 31 for (int idx = 1
2590: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 ; idx < objc; id
25a0: 78 2b 2b 29 20 7b 0a 09 2f 2a 20 47 65 74 20 6f x++) {../* Get o
25b0: 70 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 54 63 ption */..if (Tc
25c0: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
25d0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 j(interp, objv[i
25e0: 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 dx], command_opt
25f0: 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 s, "option", 0,
2600: 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 &fn) != TCL_OK)
2610: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 {.. return TC
2620: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a L_ERROR;..}.../*
2630: 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 68 61 Validate arg ha
2640: 73 20 61 20 76 61 6c 75 65 20 2a 2f 0a 09 69 66 s a value */..if
2650: 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a 63 29 (++idx >= objc)
2660: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
2670: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
2680: 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72 20 6f "No value for o
2690: 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d 6d 61 ption \"", comma
26a0: 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22 5c 22 nd_opts[fn], "\"
26b0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
26c0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
26d0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 73 CL_ERROR;..}...s
26e0: 77 69 74 63 68 28 66 6e 29 20 7b 0a 09 63 61 73 witch(fn) {..cas
26f0: 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a 09 63 61 73 e _opt_key:..cas
2700: 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72 64 3a e _opt_password:
2710: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 .. GET_OPT_BY
2720: 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 TE_ARRAY(objv[id
2730: 78 5d 2c 20 70 61 73 73 2c 20 26 70 61 73 73 5f x], pass, &pass_
2740: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b len);.. break
2750: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 61 6c ;..case _opt_sal
2760: 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f t:.. GET_OPT_
2770: 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b BYTE_ARRAY(objv[
2780: 69 64 78 5d 2c 20 73 61 6c 74 2c 20 26 73 61 6c idx], salt, &sal
2790: 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 t_len);.. bre
27a0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6c ak;..case _opt_l
27b0: 65 6e 67 74 68 3a 0a 09 63 61 73 65 20 5f 6f 70 ength:..case _op
27c0: 74 5f 73 69 7a 65 3a 0a 09 20 20 20 20 69 66 20 t_size:.. if
27d0: 28 55 74 69 6c 5f 47 65 74 49 6e 74 28 69 6e 74 (Util_GetInt(int
27e0: 65 72 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 erp, objv[idx],
27f0: 26 64 6b 5f 6c 65 6e 2c 20 28 63 68 61 72 20 2a &dk_len, (char *
2800: 29 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 ) command_opts[f
2810: 6e 5d 2c 20 31 2c 20 30 29 20 21 3d 20 54 43 4c n], 1, 0) != TCL
2820: 5f 4f 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 65 72 _OK) {...goto er
2830: 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ror;.. }..
2840: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f break;..case _o
2850: 70 74 5f 4e 3a 0a 09 63 61 73 65 20 5f 6f 70 74 pt_N:..case _opt
2860: 5f 6e 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 _n:.. GET_OPT
2870: 5f 57 49 44 45 28 6f 62 6a 76 5b 69 64 78 5d 2c _WIDE(objv[idx],
2880: 20 26 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b &N);.. break
2890: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 72 3a 0a ;..case _opt_r:.
28a0: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 57 49 44 . GET_OPT_WID
28b0: 45 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 72 29 E(objv[idx], &r)
28c0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
28d0: 61 73 65 20 5f 6f 70 74 5f 70 3a 0a 09 20 20 20 ase _opt_p:..
28e0: 20 47 45 54 5f 4f 50 54 5f 57 49 44 45 28 6f 62 GET_OPT_WIDE(ob
28f0: 6a 76 5b 69 64 78 5d 2c 20 26 70 29 3b 0a 09 20 jv[idx], &p);..
2900: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 break;..}.
2910: 20 7d 0a 0a 20 20 20 20 69 66 20 28 70 61 73 73 }.. if (pass
2920: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
2930: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
2940: 74 65 72 70 2c 20 22 6e 6f 20 70 61 73 73 77 6f terp, "no passwo
2950: 72 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 rd", (char *) NU
2960: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
2970: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
2980: 20 20 20 69 66 20 28 73 61 6c 74 20 3d 3d 20 4e if (salt == N
2990: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
29a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
29b0: 20 22 6e 6f 20 73 61 6c 74 22 2c 20 28 63 68 61 "no salt", (cha
29c0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
29d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
29e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
29f0: 61 74 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 ate context */.
2a00: 20 20 20 70 63 74 78 20 3d 20 45 56 50 5f 50 4b pctx = EVP_PK
2a10: 45 59 5f 43 54 58 5f 6e 65 77 5f 69 64 28 45 56 EY_CTX_new_id(EV
2a20: 50 5f 50 4b 45 59 5f 53 43 52 59 50 54 2c 20 4e P_PKEY_SCRYPT, N
2a30: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 70 63 ULL);. if (pc
2a40: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 tx == NULL) {..T
2a50: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
2a60: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 interp, "Memory
2a70: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 allocation error
2a80: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
2a90: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a );..goto error;.
2aa0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 45 }.. if (E
2ab0: 56 50 5f 50 4b 45 59 5f 64 65 72 69 76 65 5f 69 VP_PKEY_derive_i
2ac0: 6e 69 74 28 70 63 74 78 29 20 3c 20 31 29 20 7b nit(pctx) < 1) {
2ad0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
2ae0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 lt(interp, "Init
2af0: 69 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 ialize failed: "
2b00: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
2b10: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
2b20: 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b L);..goto error;
2b30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
2b40: 65 74 20 63 6f 6e 66 69 67 20 70 61 72 61 6d 65 et config parame
2b50: 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 ters */. if (
2b60: 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 EVP_PKEY_CTX_set
2b70: 31 5f 70 62 65 5f 70 61 73 73 28 70 63 74 78 2c 1_pbe_pass(pctx,
2b80: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 (const char *)
2b90: 70 61 73 73 2c 20 28 69 6e 74 29 20 70 61 73 73 pass, (int) pass
2ba0: 5f 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 _len) < 1) {..Tc
2bb0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
2bc0: 6e 74 65 72 70 2c 20 22 53 65 74 20 6b 65 79 20 nterp, "Set key
2bd0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
2be0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
2bf0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f ar *) NULL);..go
2c00: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
2c10: 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45 59 if (EVP_PKEY
2c20: 5f 43 54 58 5f 73 65 74 31 5f 73 63 72 79 70 74 _CTX_set1_scrypt
2c30: 5f 73 61 6c 74 28 70 63 74 78 2c 20 73 61 6c 74 _salt(pctx, salt
2c40: 2c 20 28 69 6e 74 29 20 73 61 6c 74 5f 6c 65 6e , (int) salt_len
2c50: 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 ) < 1) {..Tcl_Ap
2c60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
2c70: 70 2c 20 22 53 65 74 20 73 61 6c 74 20 66 61 69 p, "Set salt fai
2c80: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
2c90: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
2ca0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 *) NULL);..goto
2cb0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 error;. }.
2cc0: 20 69 66 20 28 4e 20 21 3d 20 30 20 26 26 20 45 if (N != 0 && E
2cd0: 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f VP_PKEY_CTX_set_
2ce0: 73 63 72 79 70 74 5f 4e 28 70 63 74 78 2c 20 28 scrypt_N(pctx, (
2cf0: 75 69 6e 74 36 34 5f 74 29 20 4e 29 20 3c 20 31 uint64_t) N) < 1
2d00: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
2d10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 esult(interp, "S
2d20: 65 74 20 63 6f 73 74 20 70 61 72 61 6d 65 74 65 et cost paramete
2d30: 72 20 28 4e 29 20 66 61 69 6c 65 64 3a 20 22 2c r (N) failed: ",
2d40: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
2d50: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
2d60: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a );..goto error;.
2d70: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 20 }. if (r
2d80: 21 3d 20 30 20 26 26 20 45 56 50 5f 50 4b 45 59 != 0 && EVP_PKEY
2d90: 5f 43 54 58 5f 73 65 74 5f 73 63 72 79 70 74 5f _CTX_set_scrypt_
2da0: 72 28 70 63 74 78 2c 20 28 75 69 6e 74 36 34 5f r(pctx, (uint64_
2db0: 74 29 20 72 29 20 3c 20 31 29 20 7b 0a 09 54 63 t) r) < 1) {..Tc
2dc0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
2dd0: 6e 74 65 72 70 2c 20 22 53 65 74 20 6c 6f 63 6b nterp, "Set lock
2de0: 20 73 69 7a 65 20 70 61 72 61 6d 65 74 65 72 20 size parameter
2df0: 28 72 29 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 (r) failed: ", G
2e00: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
2e10: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
2e20: 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 ..goto error;.
2e30: 20 7d 0a 20 20 20 20 69 66 20 28 70 20 21 3d 20 }. if (p !=
2e40: 30 20 26 26 20 45 56 50 5f 50 4b 45 59 5f 43 54 0 && EVP_PKEY_CT
2e50: 58 5f 73 65 74 5f 73 63 72 79 70 74 5f 70 28 70 X_set_scrypt_p(p
2e60: 63 74 78 2c 20 28 75 69 6e 74 36 34 5f 74 29 20 ctx, (uint64_t)
2e70: 70 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 p) < 1) {..Tcl_A
2e80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
2e90: 72 70 2c 20 22 53 65 74 20 50 61 72 61 6c 6c 65 rp, "Set Paralle
2ea0: 6c 69 7a 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 lization paramet
2eb0: 65 72 20 28 70 29 20 66 61 69 6c 65 64 3a 20 22 er (p) failed: "
2ec0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e , GET_ERR_REASON
2ed0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c (), (char *) NUL
2ee0: 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b L);..goto error;
2ef0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6d . }. if (m
2f00: 61 78 6d 65 6d 20 21 3d 20 30 20 26 26 20 45 56 axmem != 0 && EV
2f10: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 P_PKEY_CTX_set_s
2f20: 63 72 79 70 74 5f 6d 61 78 6d 65 6d 5f 62 79 74 crypt_maxmem_byt
2f30: 65 73 28 70 63 74 78 2c 20 6d 61 78 6d 65 6d 29 es(pctx, maxmem)
2f40: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 < 1) {..Tcl_App
2f50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
2f60: 2c 20 22 53 65 74 20 6d 61 78 20 6d 65 6d 6f 72 , "Set max memor
2f70: 79 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 y failed: ", GET
2f80: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 _ERR_REASON(), (
2f90: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
2fa0: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 goto error;.
2fb0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 62 75 }.. /* Get bu
2fc0: 66 66 65 72 20 2a 2f 0a 20 20 20 20 72 65 73 75 ffer */. resu
2fd0: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f ltObj = Tcl_NewO
2fe0: 62 6a 28 29 3b 0a 20 20 20 20 69 66 20 28 28 6f bj();. if ((o
2ff0: 75 74 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 ut = Tcl_SetByte
3000: 41 72 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 ArrayLength(resu
3010: 6c 74 4f 62 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 ltObj, (Tcl_Size
3020: 29 20 64 6b 5f 6c 65 6e 29 29 20 3d 3d 20 4e 55 ) dk_len)) == NU
3030: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
3040: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
3050: 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 "Memory allocati
3060: 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 on error", (char
3070: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f *) NULL);..goto
3080: 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 error;. }.
3090: 20 20 6f 75 74 5f 6c 65 6e 20 3d 20 28 73 69 7a out_len = (siz
30a0: 65 5f 74 29 20 64 6b 5f 6c 65 6e 3b 0a 0a 20 20 e_t) dk_len;..
30b0: 20 20 2f 2a 20 44 65 72 69 76 65 20 6b 65 79 20 /* Derive key
30c0: 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50 */. if (EVP_P
30d0: 4b 45 59 5f 64 65 72 69 76 65 28 70 63 74 78 2c KEY_derive(pctx,
30e0: 20 6f 75 74 2c 20 26 6f 75 74 5f 6c 65 6e 29 20 out, &out_len)
30f0: 3e 20 30 29 20 7b 0a 09 2f 2a 20 53 68 72 69 6e > 0) {../* Shrin
3100: 6b 20 62 75 66 66 65 72 20 74 6f 20 61 63 74 75 k buffer to actu
3110: 61 6c 20 73 69 7a 65 20 2a 2f 0a 09 54 63 6c 5f al size */..Tcl_
3120: 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 SetByteArrayLeng
3130: 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 28 54 th(resultObj, (T
3140: 63 6c 5f 53 69 7a 65 29 20 6f 75 74 5f 6c 65 6e cl_Size) out_len
3150: 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 );..Tcl_SetObjRe
3160: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 sult(interp, res
3170: 75 6c 74 4f 62 6a 29 3b 0a 09 67 6f 74 6f 20 64 ultObj);..goto d
3180: 6f 6e 65 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 one;.. } else
3190: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
31a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4b 65 sult(interp, "Ke
31b0: 79 20 64 65 72 69 76 61 74 69 6f 6e 20 66 61 69 y derivation fai
31c0: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
31d0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
31e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 44 *) NULL);..Tcl_D
31f0: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 ecrRefCount(resu
3200: 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 0a 65 ltObj);. }..e
3210: 72 72 6f 72 3a 0a 20 20 20 20 72 65 73 20 3d 20 rror:. res =
3220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 64 6f 6e 65 TCL_ERROR;..done
3230: 3a 0a 20 20 20 20 69 66 20 28 70 63 74 78 20 21 :. if (pctx !
3240: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 50 5f 50 = NULL) {..EVP_P
3250: 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 70 63 74 KEY_CTX_free(pct
3260: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 x);. }. re
3270: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a turn res;.}../*.
3280: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
32d0: 4b 65 79 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 KeyCommands --.
32e0: 2a 0a 20 2a 09 43 72 65 61 74 65 20 6b 65 79 20 *. *.Create key
32f0: 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 commands. *. * R
3300: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f eturns:. *.TCL_O
3310: 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 K or TCL_ERROR.
3320: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3330: 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f s:. *.Creates co
3340: 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d mmands. *. *----
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3390: 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 4b 44 46 43 */.int Tls_KDFC
33a0: 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65 ommands(Tcl_Inte
33b0: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
33c0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
33d0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
33e0: 74 6c 73 3a 3a 68 6b 64 66 22 2c 20 4b 44 46 5f tls::hkdf", KDF_
33f0: 48 4b 44 46 2c 20 28 43 6c 69 65 6e 74 44 61 74 HKDF, (ClientDat
3400: 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d a) NULL, (Tcl_Cm
3410: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
3420: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
3430: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
3440: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 62 6b nterp, "tls::pbk
3450: 64 66 32 22 2c 20 4b 44 46 5f 50 42 4b 44 46 32 df2", KDF_PBKDF2
3460: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e , (ClientData) N
3470: 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ULL, (Tcl_CmdDel
3480: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
3490: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
34a0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
34b0: 70 2c 20 22 74 6c 73 3a 3a 73 63 72 79 70 74 22 p, "tls::scrypt"
34c0: 2c 20 4b 44 46 5f 53 63 72 79 70 74 2c 20 28 43 , KDF_Scrypt, (C
34d0: 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c lientData) NULL,
34e0: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
34f0: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
3500: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
3510: 0a 7d 0a 0a .}..