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 47 ion failed: ", G
0e90: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c ET_ERR_REASON(),
0ea0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
0eb0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
0ec0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 2f 2a OR;. }.. /*
0ed0: 20 53 65 74 20 72 65 73 75 6c 74 20 74 6f 20 6b Set result to k
0ee0: 65 79 20 61 6e 64 20 69 76 20 2a 2f 0a 20 20 20 ey and iv */.
0ef0: 20 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20 4e if (cipher == N
0f00: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f ULL) {..Tcl_SetO
0f10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
0f20: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
0f30: 79 4f 62 6a 28 74 6d 70 6b 65 79 69 76 2c 20 28 yObj(tmpkeyiv, (
0f40: 54 63 6c 5f 53 69 7a 65 29 20 64 6b 5f 6c 65 6e Tcl_Size) dk_len
0f50: 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ));. } else {
0f60: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c ..Tcl_Obj *resul
0f70: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 tObj = Tcl_NewLi
0f80: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a stObj(0, NULL);.
0f90: 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 .LAPPEND_BARRAY(
0fa0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
0fb0: 6a 2c 20 22 6b 65 79 22 2c 20 74 6d 70 6b 65 79 j, "key", tmpkey
0fc0: 69 76 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 69 iv, (Tcl_Size) i
0fd0: 6b 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f klen);..LAPPEND_
0fe0: 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 72 BARRAY(interp, r
0ff0: 65 73 75 6c 74 4f 62 6a 2c 20 22 69 76 22 2c 20 esultObj, "iv",
1000: 74 6d 70 6b 65 79 69 76 2b 69 6b 6c 65 6e 2c 20 tmpkeyiv+iklen,
1010: 28 54 63 6c 5f 53 69 7a 65 29 20 69 76 6c 65 6e (Tcl_Size) ivlen
1020: 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 );..Tcl_SetObjRe
1030: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 sult(interp, res
1040: 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 0a ultObj);. }..
1050: 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 64 61 74 /* Clear dat
1060: 61 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 a */. memset(
1070: 74 6d 70 6b 65 79 69 76 2c 20 30 2c 20 62 75 66 tmpkeyiv, 0, buf
1080: 5f 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 _len);. retur
1090: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a n TCL_OK;.}../*.
10a0: 20 2a 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 2d 2d 2d ----------------
10e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 44 46 5f -----. *. * KDF_
10f0: 48 4b 44 46 20 2d 2d 0a 20 2a 0a 20 2a 09 48 4d HKDF --. *. *.HM
1100: 41 43 2d 62 61 73 65 64 20 45 78 74 72 61 63 74 AC-based Extract
1110: 2d 61 6e 64 2d 45 78 70 61 6e 64 20 4b 65 79 20 -and-Expand Key
1120: 44 65 72 69 76 61 74 69 6f 6e 20 46 75 6e 63 74 Derivation Funct
1130: 69 6f 6e 20 28 48 4b 44 46 29 2e 0a 20 2a 09 53 ion (HKDF).. *.S
1140: 65 65 20 52 46 43 20 35 38 36 39 2e 0a 20 2a 0a ee RFC 5869.. *.
1150: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
1160: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
1170: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
1180: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 fects:. *.Sets r
1190: 65 73 75 6c 74 20 74 6f 20 61 20 6b 65 79 20 6f esult to a key o
11a0: 66 20 73 70 65 63 69 66 69 65 64 20 6c 65 6e 67 f specified leng
11b0: 74 68 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 th, or an error
11c0: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d message. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1210: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
1220: 4b 44 46 5f 48 4b 44 46 28 43 6c 69 65 6e 74 44 KDF_HKDF(ClientD
1230: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
1240: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1250: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
1260: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
1270: 76 5b 5d 29 20 7b 0a 20 20 20 20 45 56 50 5f 50 v[]) {. EVP_P
1280: 4b 45 59 5f 43 54 58 20 2a 70 63 74 78 20 3d 20 KEY_CTX *pctx =
1290: 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 NULL;. const
12a0: 45 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e 55 4c EVP_MD *md = NUL
12b0: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 L;. unsigned
12c0: 63 68 61 72 20 2a 73 61 6c 74 20 3d 20 4e 55 4c char *salt = NUL
12d0: 4c 2c 20 2a 6b 65 79 20 3d 20 4e 55 4c 4c 2c 20 L, *key = NULL,
12e0: 2a 69 6e 66 6f 20 3d 20 4e 55 4c 4c 2c 20 2a 6f *info = NULL, *o
12f0: 75 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 ut = NULL;. T
1300: 63 6c 5f 53 69 7a 65 20 73 61 6c 74 5f 6c 65 6e cl_Size salt_len
1310: 20 3d 20 30 2c 20 6b 65 79 5f 6c 65 6e 20 3d 20 = 0, key_len =
1320: 30 2c 20 69 6e 66 6f 5f 6c 65 6e 20 3d 20 30 3b 0, info_len = 0;
1330: 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 54 . int res = T
1340: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 54 63 6c 5f 53 CL_OK;. Tcl_S
1350: 69 7a 65 20 66 6e 3b 0a 20 20 20 20 69 6e 74 20 ize fn;. int
1360: 64 6b 5f 6c 65 6e 20 3d 20 45 56 50 5f 4d 41 58 dk_len = EVP_MAX
1370: 5f 4b 45 59 5f 4c 45 4e 47 54 48 20 2b 20 45 56 _KEY_LENGTH + EV
1380: 50 5f 4d 41 58 5f 49 56 5f 4c 45 4e 47 54 48 3b P_MAX_IV_LENGTH;
1390: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6f 75 74 5f . size_t out_
13a0: 6c 65 6e 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a len;. Tcl_Obj
13b0: 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 20 20 20 *resultObj;.
13c0: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 (void) clientDa
13d0: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 ta;.. dprintf
13e0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
13f0: 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f 72 73 /* Clear errors
1400: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 */. Tcl_Rese
1410: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b tResult(interp);
1420: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
1430: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 rror();.. /*
1440: 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 Validate arg cou
1450: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 nt */. if (ob
1460: 6a 63 20 3c 20 35 20 7c 7c 20 6f 62 6a 63 20 3e jc < 5 || objc >
1470: 20 31 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 11) {..Tcl_Wron
1480: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
1490: 20 31 2c 20 6f 62 6a 76 2c 20 22 2d 64 69 67 65 1, objv, "-dige
14a0: 73 74 20 64 69 67 65 73 74 20 2d 6b 65 79 20 73 st digest -key s
14b0: 74 72 69 6e 67 20 3f 2d 69 6e 66 6f 20 73 74 72 tring ?-info str
14c0: 69 6e 67 3f 20 3f 2d 73 61 6c 74 20 73 74 72 69 ing? ?-salt stri
14d0: 6e 67 3f 20 3f 2d 73 69 7a 65 20 64 65 72 69 76 ng? ?-size deriv
14e0: 65 64 5f 6c 65 6e 67 74 68 3f 22 29 3b 0a 09 72 ed_length?");..r
14f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
1500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
1510: 65 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 et options */.
1520: 20 20 66 6f 72 20 28 69 6e 74 20 69 64 78 20 3d for (int idx =
1530: 20 31 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 1; idx < objc;
1540: 69 64 78 2b 2b 29 20 7b 0a 09 2f 2a 20 47 65 74 idx++) {../* Get
1550: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 option */..if (
1560: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d Tcl_GetIndexFrom
1570: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
1580: 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f [idx], command_o
1590: 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 pts, "option", 0
15a0: 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b , &fn) != TCL_OK
15b0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
15c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
15d0: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 /* Validate arg
15e0: 68 61 73 20 61 20 76 61 6c 75 65 20 2a 2f 0a 09 has a value */..
15f0: 69 66 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a if (++idx >= obj
1600: 63 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 c) {.. Tcl_Ap
1610: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
1620: 70 2c 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72 p, "No value for
1630: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d option \"", com
1640: 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22 mand_opts[fn], "
1650: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 \"", (char *) NU
1660: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e LL);.. return
1670: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
1680: 09 73 77 69 74 63 68 28 66 6e 29 20 7b 0a 09 63 .switch(fn) {..c
1690: 61 73 65 20 5f 6f 70 74 5f 64 69 67 65 73 74 3a ase _opt_digest:
16a0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 68 61 73 68 ..case _opt_hash
16b0: 3a 0a 09 20 20 20 20 69 66 20 28 28 6d 64 20 3d :.. if ((md =
16c0: 20 55 74 69 6c 5f 47 65 74 44 69 67 65 73 74 28 Util_GetDigest(
16d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 64 78 interp, objv[idx
16e0: 5d 2c 20 54 52 55 45 29 29 20 3d 3d 20 4e 55 4c ], TRUE)) == NUL
16f0: 4c 29 20 7b 0a 09 09 67 6f 74 6f 20 65 72 72 6f L) {...goto erro
1700: 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 r;.. }.. b
1710: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 reak;..case _opt
1720: 5f 69 6e 66 6f 3a 0a 09 20 20 20 20 2f 2a 20 4d _info:.. /* M
1730: 61 78 20 31 30 32 34 2f 32 30 34 38 20 2a 2f 0a ax 1024/2048 */.
1740: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 . GET_OPT_BYT
1750: 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 E_ARRAY(objv[idx
1760: 5d 2c 20 69 6e 66 6f 2c 20 26 69 6e 66 6f 5f 6c ], info, &info_l
1770: 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b en);.. break;
1780: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a ..case _opt_key:
1790: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 70 61 73 73 ..case _opt_pass
17a0: 77 6f 72 64 3a 0a 09 20 20 20 20 69 66 20 28 28 word:.. if ((
17b0: 6b 65 79 20 3d 20 55 74 69 6c 5f 47 65 74 4b 65 key = Util_GetKe
17c0: 79 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 y(interp, objv[i
17d0: 64 78 5d 2c 20 26 6b 65 79 5f 6c 65 6e 2c 20 63 dx], &key_len, c
17e0: 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c ommand_opts[fn],
17f0: 20 30 2c 20 31 29 29 20 3d 3d 20 4e 55 4c 4c 29 0, 1)) == NULL)
1800: 20 7b 0a 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b {...goto error;
1810: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 .. }.. bre
1820: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 ak;..case _opt_s
1830: 61 6c 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 alt:.. GET_OP
1840: 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a T_BYTE_ARRAY(obj
1850: 76 5b 69 64 78 5d 2c 20 73 61 6c 74 2c 20 26 73 v[idx], salt, &s
1860: 61 6c 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 alt_len);.. b
1870: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 reak;..case _opt
1880: 5f 6c 65 6e 67 74 68 3a 0a 09 63 61 73 65 20 5f _length:..case _
1890: 6f 70 74 5f 73 69 7a 65 3a 0a 09 20 20 20 20 69 opt_size:.. i
18a0: 66 20 28 55 74 69 6c 5f 47 65 74 49 6e 74 28 69 f (Util_GetInt(i
18b0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 64 78 5d nterp, objv[idx]
18c0: 2c 20 26 64 6b 5f 6c 65 6e 2c 20 63 6f 6d 6d 61 , &dk_len, comma
18d0: 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 31 2c 20 nd_opts[fn], 1,
18e0: 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 0) != TCL_OK) {.
18f0: 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 ..goto error;..
1900: 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b }.. break;
1910: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 ..}. }.. i
1920: 66 20 28 6d 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b f (md == NULL) {
1930: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
1940: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 64 lt(interp, "no d
1950: 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 igest", (char *)
1960: 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 NULL);..goto er
1970: 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ror;. }..
1980: 69 66 20 28 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 if (key == NULL)
1990: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
19a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f sult(interp, "no
19b0: 20 6b 65 79 22 2c 20 28 63 68 61 72 20 2a 29 20 key", (char *)
19c0: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 NULL);..goto err
19d0: 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f or;. }.. /
19e0: 2a 20 43 72 65 61 74 65 20 63 6f 6e 74 65 78 74 * Create context
19f0: 20 2a 2f 0a 20 20 20 20 70 63 74 78 20 3d 20 45 */. pctx = E
1a00: 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 5f VP_PKEY_CTX_new_
1a10: 69 64 28 45 56 50 5f 50 4b 45 59 5f 48 4b 44 46 id(EVP_PKEY_HKDF
1a20: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 , NULL);. if
1a30: 28 70 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b (pctx == NULL) {
1a40: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
1a50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f lt(interp, "Memo
1a60: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 ry allocation er
1a70: 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ror", (char *) N
1a80: 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f ULL);..goto erro
1a90: 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 r;. }.. if
1aa0: 20 28 45 56 50 5f 50 4b 45 59 5f 64 65 72 69 76 (EVP_PKEY_deriv
1ab0: 65 5f 69 6e 69 74 28 70 63 74 78 29 20 3c 20 31 e_init(pctx) < 1
1ac0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
1ad0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 esult(interp, "I
1ae0: 6e 69 74 69 61 6c 69 7a 65 20 66 61 69 6c 65 64 nitialize failed
1af0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
1b00: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
1b10: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 NULL);..goto err
1b20: 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f or;. }.. /
1b30: 2a 20 53 65 74 20 63 6f 6e 66 69 67 20 70 61 72 * Set config par
1b40: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 ameters */. i
1b50: 66 20 28 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f f (EVP_PKEY_CTX_
1b60: 73 65 74 5f 68 6b 64 66 5f 6d 64 28 70 63 74 78 set_hkdf_md(pctx
1b70: 2c 20 6d 64 29 20 3c 20 31 29 20 7b 0a 09 54 63 , md) < 1) {..Tc
1b80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
1b90: 6e 74 65 72 70 2c 20 22 53 65 74 20 64 69 67 65 nterp, "Set dige
1ba0: 73 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 st failed: ", GE
1bb0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 T_ERR_REASON(),
1bc0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
1bd0: 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 .goto error;.
1be0: 20 7d 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50 }. if (EVP_P
1bf0: 4b 45 59 5f 43 54 58 5f 73 65 74 31 5f 68 6b 64 KEY_CTX_set1_hkd
1c00: 66 5f 6b 65 79 28 70 63 74 78 2c 20 6b 65 79 2c f_key(pctx, key,
1c10: 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 29 20 (int) key_len)
1c20: 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 < 1) {..Tcl_Appe
1c30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
1c40: 20 22 53 65 74 20 6b 65 79 20 66 61 69 6c 65 64 "Set key failed
1c50: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
1c60: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
1c70: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 NULL);..goto err
1c80: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 or;. }. if
1c90: 20 28 73 61 6c 74 20 21 3d 20 4e 55 4c 4c 20 26 (salt != NULL &
1ca0: 26 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 & EVP_PKEY_CTX_s
1cb0: 65 74 31 5f 68 6b 64 66 5f 73 61 6c 74 28 70 63 et1_hkdf_salt(pc
1cc0: 74 78 2c 20 73 61 6c 74 2c 20 28 69 6e 74 29 20 tx, salt, (int)
1cd0: 73 61 6c 74 5f 6c 65 6e 29 20 3c 20 31 29 20 7b salt_len) < 1) {
1ce0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
1cf0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 lt(interp, "Set
1d00: 73 61 6c 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 salt failed: ",
1d10: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
1d20: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
1d30: 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 ;..goto error;.
1d40: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 69 6e 66 }. if (inf
1d50: 6f 20 21 3d 20 4e 55 4c 4c 20 26 26 20 45 56 50 o != NULL && EVP
1d60: 5f 50 4b 45 59 5f 43 54 58 5f 61 64 64 31 5f 68 _PKEY_CTX_add1_h
1d70: 6b 64 66 5f 69 6e 66 6f 28 70 63 74 78 2c 20 69 kdf_info(pctx, i
1d80: 6e 66 6f 2c 20 28 69 6e 74 29 20 69 6e 66 6f 5f nfo, (int) info_
1d90: 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c len) < 1) {..Tcl
1da0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
1db0: 74 65 72 70 2c 20 22 53 65 74 20 69 6e 66 6f 20 terp, "Set info
1dc0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
1dd0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
1de0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f ar *) NULL);..go
1df0: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
1e00: 0a 20 20 20 20 2f 2a 20 47 65 74 20 62 75 66 66 . /* Get buff
1e10: 65 72 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 er */. result
1e20: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Obj = Tcl_NewObj
1e30: 28 29 3b 0a 20 20 20 20 69 66 20 28 28 6f 75 74 ();. if ((out
1e40: 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 = Tcl_SetByteAr
1e50: 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 rayLength(result
1e60: 4f 62 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 Obj, (Tcl_Size)
1e70: 64 6b 5f 6c 65 6e 29 29 20 3d 3d 20 4e 55 4c 4c dk_len)) == NULL
1e80: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
1e90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d esult(interp, "M
1ea0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
1eb0: 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a error", (char *
1ec0: 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 ) NULL);..goto e
1ed0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rror;. }.
1ee0: 6f 75 74 5f 6c 65 6e 20 3d 20 28 73 69 7a 65 5f out_len = (size_
1ef0: 74 29 20 64 6b 5f 6c 65 6e 3b 0a 0a 20 20 20 20 t) dk_len;..
1f00: 2f 2a 20 44 65 72 69 76 65 20 6b 65 79 20 2a 2f /* Derive key */
1f10: 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45 . if (EVP_PKE
1f20: 59 5f 64 65 72 69 76 65 28 70 63 74 78 2c 20 6f Y_derive(pctx, o
1f30: 75 74 2c 20 26 6f 75 74 5f 6c 65 6e 29 20 3e 20 ut, &out_len) >
1f40: 30 29 20 7b 0a 09 2f 2a 20 53 68 72 69 6e 6b 20 0) {../* Shrink
1f50: 62 75 66 66 65 72 20 74 6f 20 61 63 74 75 61 6c buffer to actual
1f60: 20 73 69 7a 65 20 2a 2f 0a 09 54 63 6c 5f 53 65 size */..Tcl_Se
1f70: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
1f80: 28 72 65 73 75 6c 74 4f 62 6a 2c 20 28 54 63 6c (resultObj, (Tcl
1f90: 5f 53 69 7a 65 29 20 6f 75 74 5f 6c 65 6e 29 3b _Size) out_len);
1fa0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
1fb0: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c lt(interp, resul
1fc0: 74 4f 62 6a 29 3b 0a 09 72 65 73 20 3d 20 54 43 tObj);..res = TC
1fd0: 4c 5f 4f 4b 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65 L_OK;..goto done
1fe0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
1ff0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
2000: 28 69 6e 74 65 72 70 2c 20 22 4b 65 79 20 64 65 (interp, "Key de
2010: 72 69 76 61 74 69 6f 6e 20 66 61 69 6c 65 64 3a rivation failed:
2020: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 ", GET_ERR_REAS
2030: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
2040: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 ULL);..Tcl_DecrR
2050: 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 efCount(resultOb
2060: 6a 29 3b 0a 20 20 20 20 7d 0a 0a 65 72 72 6f 72 j);. }..error
2070: 3a 0a 20 20 20 20 72 65 73 20 3d 20 54 43 4c 5f :. res = TCL_
2080: 45 52 52 4f 52 3b 0a 64 6f 6e 65 3a 0a 20 20 20 ERROR;.done:.
2090: 20 69 66 20 28 70 63 74 78 20 21 3d 20 4e 55 4c if (pctx != NUL
20a0: 4c 29 20 7b 0a 09 45 56 50 5f 50 4b 45 59 5f 43 L) {..EVP_PKEY_C
20b0: 54 58 5f 66 72 65 65 28 70 63 74 78 29 3b 0a 20 TX_free(pctx);.
20c0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
20d0: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d res;.}../*. *---
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2100: 2d 2d 2d 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: 0a 20 2a 0a 20 2a 20 4b 44 46 5f 53 63 72 79 70 . *. * KDF_Scryp
2130: 74 20 2d 2d 0a 20 2a 0a 20 2a 09 48 4d 41 43 2d t --. *. *.HMAC-
2140: 62 61 73 65 64 20 45 78 74 72 61 63 74 2d 61 6e based Extract-an
2150: 64 2d 45 78 70 61 6e 64 20 4b 65 79 20 44 65 72 d-Expand Key Der
2160: 69 76 61 74 69 6f 6e 20 46 75 6e 63 74 69 6f 6e ivation Function
2170: 20 28 48 4b 44 46 29 2e 0a 20 2a 09 53 65 65 20 (HKDF).. *.See
2180: 52 46 43 20 35 38 36 39 20 61 6e 64 20 52 46 43 RFC 5869 and RFC
2190: 20 37 39 31 34 2e 0a 20 2a 0a 20 2a 20 52 65 74 7914.. *. * Ret
21a0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
21b0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
21c0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
21d0: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 . *.Sets result
21e0: 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 6b 65 79 to a list of key
21f0: 20 61 6e 64 20 69 76 20 76 61 6c 75 65 73 2c 20 and iv values,
2200: 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 or an error mess
2210: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d age. *. *-------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f ------------. */
2260: 0a 73 74 61 74 69 63 20 69 6e 74 20 4b 44 46 5f .static int KDF_
2270: 53 63 72 79 70 74 28 43 6c 69 65 6e 74 44 61 74 Scrypt(ClientDat
2280: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
2290: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
22a0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
22b0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
22c0: 5d 29 20 7b 0a 20 20 20 20 45 56 50 5f 50 4b 45 ]) {. EVP_PKE
22d0: 59 5f 43 54 58 20 2a 70 63 74 78 20 3d 20 4e 55 Y_CTX *pctx = NU
22e0: 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 LL;. unsigned
22f0: 20 63 68 61 72 20 2a 73 61 6c 74 20 3d 20 4e 55 char *salt = NU
2300: 4c 4c 2c 20 2a 70 61 73 73 20 3d 20 4e 55 4c 4c LL, *pass = NULL
2310: 2c 20 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 20 , *out = NULL;.
2320: 20 20 20 54 63 6c 5f 53 69 7a 65 20 73 61 6c 74 Tcl_Size salt
2330: 5f 6c 65 6e 20 3d 20 30 2c 20 70 61 73 73 5f 6c _len = 0, pass_l
2340: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 en = 0;. int
2350: 64 6b 5f 6c 65 6e 20 3d 20 36 34 2c 20 72 65 73 dk_len = 64, res
2360: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 54 = TCL_OK;. T
2370: 63 6c 5f 53 69 7a 65 20 66 6e 3b 0a 20 20 20 20 cl_Size fn;.
2380: 75 69 6e 74 36 34 5f 74 20 4e 20 3d 20 30 2c 20 uint64_t N = 0,
2390: 70 20 3d 20 30 2c 20 72 20 3d 20 30 2c 20 6d 61 p = 0, r = 0, ma
23a0: 78 6d 65 6d 20 3d 20 30 3b 0a 20 20 20 20 73 69 xmem = 0;. si
23b0: 7a 65 5f 74 20 6f 75 74 5f 6c 65 6e 3b 0a 20 20 ze_t out_len;.
23c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
23d0: 74 4f 62 6a 3b 0a 20 20 20 20 28 76 6f 69 64 29 tObj;. (void)
23e0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
23f0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 dprintf("Calle
2400: 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 d");.. /* Cle
2410: 61 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 ar errors */.
2420: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 Tcl_ResetResult
2430: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 52 (interp);. ER
2440: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b R_clear_error();
2450: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 .. /* Validat
2460: 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 e arg count */.
2470: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 35 20 if (objc < 5
2480: 7c 7c 20 6f 62 6a 63 20 3e 20 31 33 29 20 7b 0a || objc > 13) {.
2490: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
24a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
24b0: 76 2c 20 22 2d 70 61 73 73 77 6f 72 64 20 73 74 v, "-password st
24c0: 72 69 6e 67 20 2d 73 61 6c 74 20 73 74 72 69 6e ring -salt strin
24d0: 67 20 3f 2d 4e 20 63 6f 73 74 50 61 72 61 6d 65 g ?-N costParame
24e0: 74 65 72 3f 20 3f 2d 72 20 62 6c 6f 63 6b 53 69 ter? ?-r blockSi
24f0: 7a 65 3f 20 3f 2d 70 20 70 61 72 61 6c 6c 65 6c ze? ?-p parallel
2500: 69 7a 61 74 69 6f 6e 3f 20 3f 2d 73 69 7a 65 20 ization? ?-size
2510: 64 65 72 69 76 65 64 5f 6c 65 6e 67 74 68 3f 22 derived_length?"
2520: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
2530: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
2540: 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 20 /* Get options
2550: 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 6e 74 20 */. for (int
2560: 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 6f idx = 1; idx < o
2570: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 2f bjc; idx++) {../
2580: 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a * Get option */.
2590: 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 .if (Tcl_GetInde
25a0: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c xFromObj(interp,
25b0: 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f 6d 6d objv[idx], comm
25c0: 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74 69 6f and_opts, "optio
25d0: 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20 54 n", 0, &fn) != T
25e0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 CL_OK) {.. re
25f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
2600: 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61 74 65 .}.../* Validate
2610: 20 61 72 67 20 68 61 73 20 61 20 76 61 6c 75 65 arg has a value
2620: 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20 3e */..if (++idx >
2630: 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20 54 = objc) {.. T
2640: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
2650: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c 75 interp, "No valu
2660: 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22 22 e for option \""
2670: 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 , command_opts[f
2680: 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 n], "\"", (char
2690: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 *) NULL);.. r
26a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
26b0: 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29 ..}...switch(fn)
26c0: 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65 {..case _opt_ke
26d0: 79 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 70 61 y:..case _opt_pa
26e0: 73 73 77 6f 72 64 3a 0a 09 20 20 20 20 47 45 54 ssword:.. GET
26f0: 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28 _OPT_BYTE_ARRAY(
2700: 6f 62 6a 76 5b 69 64 78 5d 2c 20 70 61 73 73 2c objv[idx], pass,
2710: 20 26 70 61 73 73 5f 6c 65 6e 29 3b 0a 09 20 20 &pass_len);..
2720: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f break;..case _
2730: 6f 70 74 5f 73 61 6c 74 3a 0a 09 20 20 20 20 47 opt_salt:.. G
2740: 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 ET_OPT_BYTE_ARRA
2750: 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 61 6c Y(objv[idx], sal
2760: 74 2c 20 26 73 61 6c 74 5f 6c 65 6e 29 3b 0a 09 t, &salt_len);..
2770: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 break;..case
2780: 20 5f 6f 70 74 5f 6c 65 6e 67 74 68 3a 0a 09 63 _opt_length:..c
2790: 61 73 65 20 5f 6f 70 74 5f 73 69 7a 65 3a 0a 09 ase _opt_size:..
27a0: 20 20 20 20 69 66 20 28 55 74 69 6c 5f 47 65 74 if (Util_Get
27b0: 49 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Int(interp, objv
27c0: 5b 69 64 78 5d 2c 20 26 64 6b 5f 6c 65 6e 2c 20 [idx], &dk_len,
27d0: 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d command_opts[fn]
27e0: 2c 20 31 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f , 1, 0) != TCL_O
27f0: 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 65 72 72 6f K) {...goto erro
2800: 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 r;.. }.. b
2810: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 reak;..case _opt
2820: 5f 4e 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6e _N:..case _opt_n
2830: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 57 :.. GET_OPT_W
2840: 49 44 45 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 IDE(objv[idx], &
2850: 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a N);.. break;.
2860: 09 63 61 73 65 20 5f 6f 70 74 5f 72 3a 0a 09 20 .case _opt_r:..
2870: 20 20 20 47 45 54 5f 4f 50 54 5f 57 49 44 45 28 GET_OPT_WIDE(
2880: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 72 29 3b 0a objv[idx], &r);.
2890: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
28a0: 65 20 5f 6f 70 74 5f 70 3a 0a 09 20 20 20 20 47 e _opt_p:.. G
28b0: 45 54 5f 4f 50 54 5f 57 49 44 45 28 6f 62 6a 76 ET_OPT_WIDE(objv
28c0: 5b 69 64 78 5d 2c 20 26 70 29 3b 0a 09 20 20 20 [idx], &p);..
28d0: 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d break;..}. }
28e0: 0a 0a 20 20 20 20 69 66 20 28 70 61 73 73 20 3d .. if (pass =
28f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 = NULL) {..Tcl_A
2900: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
2910: 72 70 2c 20 22 6e 6f 20 70 61 73 73 77 6f 72 64 rp, "no password
2920: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
2930: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
2940: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
2950: 20 69 66 20 28 73 61 6c 74 20 3d 3d 20 4e 55 4c if (salt == NUL
2960: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 L) {..Tcl_Append
2970: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
2980: 6e 6f 20 73 61 6c 74 22 2c 20 28 63 68 61 72 20 no salt", (char
2990: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
29a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
29b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
29c0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 e context */.
29d0: 20 70 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 pctx = EVP_PKEY
29e0: 5f 43 54 58 5f 6e 65 77 5f 69 64 28 45 56 50 5f _CTX_new_id(EVP_
29f0: 50 4b 45 59 5f 53 43 52 59 50 54 2c 20 4e 55 4c PKEY_SCRYPT, NUL
2a00: 4c 29 3b 0a 20 20 20 20 69 66 20 28 70 63 74 78 L);. if (pctx
2a10: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
2a20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
2a30: 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c terp, "Memory al
2a40: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c location error",
2a50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
2a60: 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 ..goto error;.
2a70: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 45 56 50 }.. if (EVP
2a80: 5f 50 4b 45 59 5f 64 65 72 69 76 65 5f 69 6e 69 _PKEY_derive_ini
2a90: 74 28 70 63 74 78 29 20 3c 20 31 29 20 7b 0a 09 t(pctx) < 1) {..
2aa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
2ab0: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 (interp, "Initia
2ac0: 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 lize failed: ",
2ad0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
2ae0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
2af0: 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 ;..goto error;.
2b00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 }.. /* Set
2b10: 20 63 6f 6e 66 69 67 20 70 61 72 61 6d 65 74 65 config paramete
2b20: 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 rs */. if (EV
2b30: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 31 5f P_PKEY_CTX_set1_
2b40: 70 62 65 5f 70 61 73 73 28 70 63 74 78 2c 20 70 pbe_pass(pctx, p
2b50: 61 73 73 2c 20 28 69 6e 74 29 20 70 61 73 73 5f ass, (int) pass_
2b60: 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c len) < 1) {..Tcl
2b70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
2b80: 74 65 72 70 2c 20 22 53 65 74 20 6b 65 79 20 66 terp, "Set key f
2b90: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 ailed: ", GET_ER
2ba0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 R_REASON(), (cha
2bb0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 r *) NULL);..got
2bc0: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 o error;. }.
2bd0: 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45 59 5f if (EVP_PKEY_
2be0: 43 54 58 5f 73 65 74 31 5f 73 63 72 79 70 74 5f CTX_set1_scrypt_
2bf0: 73 61 6c 74 28 70 63 74 78 2c 20 73 61 6c 74 2c salt(pctx, salt,
2c00: 20 28 69 6e 74 29 20 73 61 6c 74 5f 6c 65 6e 29 (int) salt_len)
2c10: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 < 1) {..Tcl_App
2c20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
2c30: 2c 20 22 53 65 74 20 73 61 6c 74 20 66 61 69 6c , "Set salt fail
2c40: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 ed: ", GET_ERR_R
2c50: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a EASON(), (char *
2c60: 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 ) NULL);..goto e
2c70: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rror;. }.
2c80: 69 66 20 28 4e 20 21 3d 20 30 20 26 26 20 45 56 if (N != 0 && EV
2c90: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 P_PKEY_CTX_set_s
2ca0: 63 72 79 70 74 5f 4e 28 70 63 74 78 2c 20 4e 29 crypt_N(pctx, N)
2cb0: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 < 1) {..Tcl_App
2cc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
2cd0: 2c 20 22 53 65 74 20 63 6f 73 74 20 70 61 72 61 , "Set cost para
2ce0: 6d 65 74 65 72 20 28 4e 29 20 66 61 69 6c 65 64 meter (N) failed
2cf0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
2d00: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
2d10: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 NULL);..goto err
2d20: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 or;. }. if
2d30: 20 28 72 20 21 3d 20 30 20 26 26 20 45 56 50 5f (r != 0 && EVP_
2d40: 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 63 72 PKEY_CTX_set_scr
2d50: 79 70 74 5f 72 28 70 63 74 78 2c 20 72 29 20 3c ypt_r(pctx, r) <
2d60: 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 1) {..Tcl_Appen
2d70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
2d80: 22 53 65 74 20 6c 6f 63 6b 20 73 69 7a 65 20 70 "Set lock size p
2d90: 61 72 61 6d 65 74 65 72 20 28 72 29 20 66 61 69 arameter (r) fai
2da0: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
2db0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
2dc0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 *) NULL);..goto
2dd0: 65 72 72 6f 72 3b 0a 20 20 20 7d 0a 20 20 20 20 error;. }.
2de0: 69 66 20 28 70 20 21 3d 20 30 20 26 26 20 45 56 if (p != 0 && EV
2df0: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 P_PKEY_CTX_set_s
2e00: 63 72 79 70 74 5f 70 28 70 63 74 78 2c 20 70 29 crypt_p(pctx, p)
2e10: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 < 1) {..Tcl_App
2e20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
2e30: 2c 20 22 53 65 74 20 50 61 72 61 6c 6c 65 6c 69 , "Set Paralleli
2e40: 7a 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 zation parameter
2e50: 20 28 70 29 20 66 61 69 6c 65 64 3a 20 22 2c 20 (p) failed: ",
2e60: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 GET_ERR_REASON()
2e70: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
2e80: 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 ;..goto error;.
2e90: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6d 61 78 }. if (max
2ea0: 6d 65 6d 20 21 3d 20 30 20 26 26 20 45 56 50 5f mem != 0 && EVP_
2eb0: 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 63 72 PKEY_CTX_set_scr
2ec0: 79 70 74 5f 6d 61 78 6d 65 6d 5f 62 79 74 65 73 ypt_maxmem_bytes
2ed0: 28 70 63 74 78 2c 20 6d 61 78 6d 65 6d 29 20 3c (pctx, maxmem) <
2ee0: 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 1) {..Tcl_Appen
2ef0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
2f00: 22 53 65 74 20 6d 61 78 20 6d 65 6d 6f 72 79 20 "Set max memory
2f10: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 failed: ", GET_E
2f20: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 RR_REASON(), (ch
2f30: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f ar *) NULL);..go
2f40: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
2f50: 0a 20 20 20 20 2f 2a 20 47 65 74 20 62 75 66 66 . /* Get buff
2f60: 65 72 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 er */. result
2f70: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Obj = Tcl_NewObj
2f80: 28 29 3b 0a 20 20 20 20 69 66 20 28 28 6f 75 74 ();. if ((out
2f90: 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 = Tcl_SetByteAr
2fa0: 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 rayLength(result
2fb0: 4f 62 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 Obj, (Tcl_Size)
2fc0: 64 6b 5f 6c 65 6e 29 29 20 3d 3d 20 4e 55 4c 4c dk_len)) == NULL
2fd0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
2fe0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d esult(interp, "M
2ff0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
3000: 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a error", (char *
3010: 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 ) NULL);..goto e
3020: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rror;. }.
3030: 6f 75 74 5f 6c 65 6e 20 3d 20 28 73 69 7a 65 5f out_len = (size_
3040: 74 29 20 64 6b 5f 6c 65 6e 3b 0a 0a 20 20 20 20 t) dk_len;..
3050: 2f 2a 20 44 65 72 69 76 65 20 6b 65 79 20 2a 2f /* Derive key */
3060: 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45 . if (EVP_PKE
3070: 59 5f 64 65 72 69 76 65 28 70 63 74 78 2c 20 6f Y_derive(pctx, o
3080: 75 74 2c 20 26 6f 75 74 5f 6c 65 6e 29 20 3e 20 ut, &out_len) >
3090: 30 29 20 7b 0a 09 2f 2a 20 53 68 72 69 6e 6b 20 0) {../* Shrink
30a0: 62 75 66 66 65 72 20 74 6f 20 61 63 74 75 61 6c buffer to actual
30b0: 20 73 69 7a 65 20 2a 2f 0a 09 54 63 6c 5f 53 65 size */..Tcl_Se
30c0: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
30d0: 28 72 65 73 75 6c 74 4f 62 6a 2c 20 28 54 63 6c (resultObj, (Tcl
30e0: 5f 53 69 7a 65 29 20 6f 75 74 5f 6c 65 6e 29 3b _Size) out_len);
30f0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
3100: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c lt(interp, resul
3110: 74 4f 62 6a 29 3b 0a 09 67 6f 74 6f 20 64 6f 6e tObj);..goto don
3120: 65 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e;.. } else {
3130: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
3140: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4b 65 79 20 lt(interp, "Key
3150: 64 65 72 69 76 61 74 69 6f 6e 20 66 61 69 6c 65 derivation faile
3160: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 d: ", GET_ERR_RE
3170: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 ASON(), (char *)
3180: 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 44 65 63 NULL);..Tcl_Dec
3190: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 rRefCount(result
31a0: 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 0a 65 72 72 Obj);. }..err
31b0: 6f 72 3a 0a 20 20 20 20 72 65 73 20 3d 20 54 43 or:. res = TC
31c0: 4c 5f 45 52 52 4f 52 3b 0a 0a 64 6f 6e 65 3a 0a L_ERROR;..done:.
31d0: 20 20 20 20 69 66 20 28 70 63 74 78 20 21 3d 20 if (pctx !=
31e0: 4e 55 4c 4c 29 20 7b 0a 09 45 56 50 5f 50 4b 45 NULL) {..EVP_PKE
31f0: 59 5f 43 54 58 5f 66 72 65 65 28 70 63 74 78 29 Y_CTX_free(pctx)
3200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
3210: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a rn res;.}../*. *
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3260: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 4b 65 ---. *. * Tls_Ke
3270: 79 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a yCommands --. *.
3280: 20 2a 09 43 72 65 61 74 65 20 6b 65 79 20 63 6f *.Create key co
3290: 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 74 mmands. *. * Ret
32a0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
32b0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
32c0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
32d0: 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d 6d . *.Creates comm
32e0: 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ands. *. *------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3330: 2f 0a 69 6e 74 20 54 6c 73 5f 4b 44 46 43 6f 6d /.int Tls_KDFCom
3340: 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 mands(Tcl_Interp
3350: 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
3360: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
3370: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
3380: 73 3a 3a 68 6b 64 66 22 2c 20 4b 44 46 5f 48 4b s::hkdf", KDF_HK
3390: 44 46 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 DF, (ClientData)
33a0: 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 NULL, (Tcl_CmdD
33b0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
33c0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
33d0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
33e0: 65 72 70 2c 20 22 74 6c 73 3a 3a 70 62 6b 64 66 erp, "tls::pbkdf
33f0: 32 22 2c 20 4b 44 46 5f 50 42 4b 44 46 32 2c 20 2", KDF_PBKDF2,
3400: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c (ClientData) NUL
3410: 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 L, (Tcl_CmdDelet
3420: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
3430: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
3440: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
3450: 20 22 74 6c 73 3a 3a 73 63 72 79 70 74 22 2c 20 "tls::scrypt",
3460: 4b 44 46 5f 53 63 72 79 70 74 2c 20 28 43 6c 69 KDF_Scrypt, (Cli
3470: 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 entData) NULL, (
3480: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
3490: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
34a0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
34b0: 0a 0a ..