Hex Artifact Content

Artifact 2263ba96963708b3f8f476178c6dea499d680f15e332c194dd17320c0107b02a:


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 69 6e 74 20 70 61 73 73 5f 6c 65 6e 20     int pass_len 
04e0: 3d 20 30 2c 20 73 61 6c 74 5f 6c 65 6e 20 3d 20  = 0, salt_len = 
04f0: 30 2c 20 66 6e 3b 0a 20 20 20 20 69 6e 74 20 69  0, fn;.    int i
0500: 6b 6c 65 6e 2c 20 69 76 6c 65 6e 2c 20 69 74 65  klen, ivlen, ite
0510: 72 20 3d 20 31 3b 0a 20 20 20 20 75 6e 73 69 67  r = 1;.    unsig
0520: 6e 65 64 20 63 68 61 72 20 2a 70 61 73 73 20 3d  ned char *pass =
0530: 20 4e 55 4c 4c 2c 20 2a 73 61 6c 74 20 3d 20 4e   NULL, *salt = N
0540: 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ULL;.    const E
0550: 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c  VP_MD *md = NULL
0560: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
0570: 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 20 3d  CIPHER *cipher =
0580: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 62   NULL;.    int b
0590: 75 66 5f 6c 65 6e 20 3d 20 28 45 56 50 5f 4d 41  uf_len = (EVP_MA
05a0: 58 5f 4b 45 59 5f 4c 45 4e 47 54 48 20 2b 20 45  X_KEY_LENGTH + E
05b0: 56 50 5f 4d 41 58 5f 49 56 5f 4c 45 4e 47 54 48  VP_MAX_IV_LENGTH
05c0: 29 2a 34 2c 20 64 6b 5f 6c 65 6e 20 3d 20 62 75  )*4, dk_len = bu
05d0: 66 5f 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67  f_len;.    unsig
05e0: 6e 65 64 20 63 68 61 72 20 74 6d 70 6b 65 79 69  ned char tmpkeyi
05f0: 76 5b 28 45 56 50 5f 4d 41 58 5f 4b 45 59 5f 4c  v[(EVP_MAX_KEY_L
0600: 45 4e 47 54 48 20 2b 20 45 56 50 5f 4d 41 58 5f  ENGTH + EVP_MAX_
0610: 49 56 5f 4c 45 4e 47 54 48 29 2a 34 5d 3b 0a 20  IV_LENGTH)*4];. 
0620: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
0630: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
0640: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
0650: 20 20 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f     /* Clear erro
0660: 72 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65  rs */.    Tcl_Re
0670: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0680: 29 3b 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  );.    ERR_clear
0690: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f  _error();..    /
06a0: 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63  * Validate arg c
06b0: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ount */.    if (
06c0: 6f 62 6a 63 20 3c 20 33 20 7c 7c 20 6f 62 6a 63  objc < 3 || objc
06d0: 20 3e 20 31 31 29 20 7b 0a 09 54 63 6c 5f 57 72   > 11) {..Tcl_Wr
06e0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
06f0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 5b 2d 63  p, 1, objv, "[-c
0700: 69 70 68 65 72 20 63 69 70 68 65 72 20 7c 20 2d  ipher cipher | -
0710: 73 69 7a 65 20 6c 65 6e 67 74 68 5d 20 2d 64 69  size length] -di
0720: 67 65 73 74 20 64 69 67 65 73 74 20 3f 2d 69 74  gest digest ?-it
0730: 65 72 61 74 69 6f 6e 73 20 63 6f 75 6e 74 3f 20  erations count? 
0740: 3f 2d 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e  ?-password strin
0750: 67 3f 20 3f 2d 73 61 6c 74 20 73 74 72 69 6e 67  g? ?-salt string
0760: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
0770: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
0780: 20 20 20 2f 2a 20 49 6e 69 74 20 62 75 66 66 65     /* Init buffe
0790: 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  rs */.    memset
07a0: 28 74 6d 70 6b 65 79 69 76 2c 20 30 2c 20 62 75  (tmpkeyiv, 0, bu
07b0: 66 5f 6c 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  f_len);..    /* 
07c0: 47 65 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20  Get options */. 
07d0: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 64 78 20     for (int idx 
07e0: 3d 20 31 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b  = 1; idx < objc;
07f0: 20 69 64 78 2b 2b 29 20 7b 0a 09 2f 2a 20 47 65   idx++) {../* Ge
0800: 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  t option */..if 
0810: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f  (Tcl_GetIndexFro
0820: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
0830: 76 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f  v[idx], command_
0840: 6f 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20  opts, "option", 
0850: 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f  0, &fn) != TCL_O
0860: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  K) {..    return
0870: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
0880: 09 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67  ./* Validate arg
0890: 20 68 61 73 20 61 20 76 61 6c 75 65 20 2a 2f 0a   has a value */.
08a0: 09 69 66 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62  .if (++idx >= ob
08b0: 6a 63 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  jc) {..    Tcl_A
08c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
08d0: 72 70 2c 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f  rp, "No value fo
08e0: 72 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f  r option \"", co
08f0: 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20  mmand_opts[fn], 
0900: 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  "\"", NULL);..  
0910: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0920: 4f 52 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28  OR;..}...switch(
0930: 66 6e 29 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74  fn) {..case _opt
0940: 5f 63 69 70 68 65 72 3a 0a 09 20 20 20 20 69 66  _cipher:..    if
0950: 20 28 28 63 69 70 68 65 72 20 3d 20 55 74 69 6c   ((cipher = Util
0960: 5f 47 65 74 43 69 70 68 65 72 28 69 6e 74 65 72  _GetCipher(inter
0970: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 54 52  p, objv[idx], TR
0980: 55 45 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  UE)) == NULL) {.
0990: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
09a0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
09b0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
09c0: 74 5f 64 69 67 65 73 74 3a 0a 09 63 61 73 65 20  t_digest:..case 
09d0: 5f 6f 70 74 5f 68 61 73 68 3a 0a 09 20 20 20 20  _opt_hash:..    
09e0: 69 66 20 28 28 6d 64 20 3d 20 55 74 69 6c 5f 47  if ((md = Util_G
09f0: 65 74 44 69 67 65 73 74 28 69 6e 74 65 72 70 2c  etDigest(interp,
0a00: 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 54 52 55 45   objv[idx], TRUE
0a10: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  )) == NULL) {...
0a20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0a30: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72  ;..    }..    br
0a40: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
0a50: 69 74 65 72 3a 0a 09 20 20 20 20 69 66 20 28 55  iter:..    if (U
0a60: 74 69 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  til_GetInt(inter
0a70: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 69  p, objv[idx], &i
0a80: 74 65 72 2c 20 22 69 74 65 72 61 74 69 6f 6e 73  ter, "iterations
0a90: 22 2c 20 31 2c 20 2d 31 29 20 21 3d 20 54 43 4c  ", 1, -1) != TCL
0aa0: 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  _OK) {...return 
0ab0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
0ac0: 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  }..    break;..c
0ad0: 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a 09 63  ase _opt_key:..c
0ae0: 61 73 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72  ase _opt_passwor
0af0: 64 3a 0a 09 20 20 20 20 70 61 73 73 20 3d 20 55  d:..    pass = U
0b00: 74 69 6c 5f 47 65 74 4b 65 79 28 69 6e 74 65 72  til_GetKey(inter
0b10: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 70  p, objv[idx], &p
0b20: 61 73 73 5f 6c 65 6e 2c 20 63 6f 6d 6d 61 6e 64  ass_len, command
0b30: 5f 6f 70 74 73 5b 66 6e 5d 2c 20 30 2c 20 46 41  _opts[fn], 0, FA
0b40: 4c 53 45 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  LSE);..    break
0b50: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 61 6c  ;..case _opt_sal
0b60: 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  t:..    GET_OPT_
0b70: 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b  BYTE_ARRAY(objv[
0b80: 69 64 78 5d 2c 20 73 61 6c 74 2c 20 26 73 61 6c  idx], salt, &sal
0b90: 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65  t_len);..    bre
0ba0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6c  ak;..case _opt_l
0bb0: 65 6e 67 74 68 3a 0a 09 63 61 73 65 20 5f 6f 70  ength:..case _op
0bc0: 74 5f 73 69 7a 65 3a 0a 09 20 20 20 20 69 66 20  t_size:..    if 
0bd0: 28 55 74 69 6c 5f 47 65 74 49 6e 74 28 69 6e 74  (Util_GetInt(int
0be0: 65 72 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20  erp, objv[idx], 
0bf0: 26 64 6b 5f 6c 65 6e 2c 20 63 6f 6d 6d 61 6e 64  &dk_len, command
0c00: 5f 6f 70 74 73 5b 66 6e 5d 2c 20 31 2c 20 62 75  _opts[fn], 1, bu
0c10: 66 5f 6c 65 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b  f_len) != TCL_OK
0c20: 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  ) {...return TCL
0c30: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
0c40: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20      break;..}.  
0c50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69    }..    /* Vali
0c60: 64 61 74 65 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a  date options */.
0c70: 20 20 20 20 69 66 20 28 6d 64 20 3d 3d 20 4e 55      if (md == NU
0c80: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
0c90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0ca0: 22 6e 6f 20 64 69 67 65 73 74 22 2c 20 4e 55 4c  "no digest", NUL
0cb0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
0cc0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
0cd0: 20 20 2f 2a 20 53 65 74 20 6f 75 74 70 75 74 20    /* Set output 
0ce0: 74 79 70 65 20 73 69 7a 65 73 20 2a 2f 0a 20 20  type sizes */.  
0cf0: 20 20 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20    if (cipher == 
0d00: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 64 6b 5f  NULL) {..if (dk_
0d10: 6c 65 6e 20 3e 20 62 75 66 5f 6c 65 6e 29 20 64  len > buf_len) d
0d20: 6b 5f 6c 65 6e 20 3d 20 62 75 66 5f 6c 65 6e 3b  k_len = buf_len;
0d30: 0a 09 69 6b 6c 65 6e 20 3d 20 64 6b 5f 6c 65 6e  ..iklen = dk_len
0d40: 3b 0a 09 69 76 6c 65 6e 20 3d 20 30 3b 0a 20 20  ;..ivlen = 0;.  
0d50: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 6b 6c 65    } else {..ikle
0d60: 6e 20 3d 20 45 56 50 5f 43 49 50 48 45 52 5f 6b  n = EVP_CIPHER_k
0d70: 65 79 5f 6c 65 6e 67 74 68 28 63 69 70 68 65 72  ey_length(cipher
0d80: 29 3b 0a 09 69 76 6c 65 6e 20 3d 20 45 56 50 5f  );..ivlen = EVP_
0d90: 43 49 50 48 45 52 5f 69 76 5f 6c 65 6e 67 74 68  CIPHER_iv_length
0da0: 28 63 69 70 68 65 72 29 3b 0a 09 64 6b 5f 6c 65  (cipher);..dk_le
0db0: 6e 20 3d 20 69 6b 6c 65 6e 2b 69 76 6c 65 6e 3b  n = iklen+ivlen;
0dc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
0dd0: 65 72 69 76 65 20 6b 65 79 20 2a 2f 0a 20 20 20  erive key */.   
0de0: 20 69 66 20 28 21 50 4b 43 53 35 5f 50 42 4b 44   if (!PKCS5_PBKD
0df0: 46 32 5f 48 4d 41 43 28 70 61 73 73 2c 20 70 61  F2_HMAC(pass, pa
0e00: 73 73 5f 6c 65 6e 2c 20 73 61 6c 74 2c 20 73 61  ss_len, salt, sa
0e10: 6c 74 5f 6c 65 6e 2c 20 69 74 65 72 2c 20 6d 64  lt_len, iter, md
0e20: 2c 20 64 6b 5f 6c 65 6e 2c 20 74 6d 70 6b 65 79  , dk_len, tmpkey
0e30: 69 76 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  iv)) {..Tcl_Appe
0e40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0e50: 20 22 4b 65 79 20 64 65 72 69 76 61 74 69 6f 6e   "Key derivation
0e60: 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53   failed: ", REAS
0e70: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ON(), NULL);..re
0e80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0e90: 20 20 20 20 7d 0a 0a 20 20 20 2f 2a 20 53 65 74      }..   /* Set
0ea0: 20 72 65 73 75 6c 74 20 74 6f 20 6b 65 79 20 61   result to key a
0eb0: 6e 64 20 69 76 20 2a 2f 0a 20 20 20 20 69 66 20  nd iv */.    if 
0ec0: 28 63 69 70 68 65 72 20 3d 3d 20 4e 55 4c 4c 29  (cipher == NULL)
0ed0: 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65   {..Tcl_SetObjRe
0ee0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
0ef0: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
0f00: 28 74 6d 70 6b 65 79 69 76 2c 20 64 6b 5f 6c 65  (tmpkeyiv, dk_le
0f10: 6e 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  n));.    } else 
0f20: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75  {..Tcl_Obj *resu
0f30: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c  ltObj = Tcl_NewL
0f40: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
0f50: 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
0f60: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
0f70: 62 6a 2c 20 22 6b 65 79 22 2c 20 74 6d 70 6b 65  bj, "key", tmpke
0f80: 79 69 76 2c 20 69 6b 6c 65 6e 29 3b 0a 09 4c 41  yiv, iklen);..LA
0f90: 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
0fa0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20  erp, resultObj, 
0fb0: 22 69 76 22 2c 20 74 6d 70 6b 65 79 69 76 2b 69  "iv", tmpkeyiv+i
0fc0: 6b 6c 65 6e 2c 20 69 76 6c 65 6e 29 3b 0a 09 54  klen, ivlen);..T
0fd0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
0fe0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
0ff0: 6a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  j);.    }..    /
1000: 2a 20 43 6c 65 61 72 20 64 61 74 61 20 2a 2f 0a  * Clear data */.
1010: 20 20 20 20 6d 65 6d 73 65 74 28 74 6d 70 6b 65      memset(tmpke
1020: 79 69 76 2c 20 30 2c 20 62 75 66 5f 6c 65 6e 29  yiv, 0, buf_len)
1030: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1040: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1090: 0a 20 2a 0a 20 2a 20 4b 44 46 5f 48 4b 44 46 20  . *. * KDF_HKDF 
10a0: 2d 2d 0a 20 2a 0a 20 2a 09 48 4d 41 43 2d 62 61  --. *. *.HMAC-ba
10b0: 73 65 64 20 45 78 74 72 61 63 74 2d 61 6e 64 2d  sed Extract-and-
10c0: 45 78 70 61 6e 64 20 4b 65 79 20 44 65 72 69 76  Expand Key Deriv
10d0: 61 74 69 6f 6e 20 46 75 6e 63 74 69 6f 6e 20 28  ation Function (
10e0: 48 4b 44 46 29 2e 0a 20 2a 09 53 65 65 20 52 46  HKDF).. *.See RF
10f0: 43 20 35 38 36 39 2e 0a 20 2a 0a 20 2a 20 52 65  C 5869.. *. * Re
1100: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
1110: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
1120: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
1130: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74  :. *.Sets result
1140: 20 74 6f 20 61 20 6b 65 79 20 6f 66 20 73 70 65   to a key of spe
1150: 63 69 66 69 65 64 20 6c 65 6e 67 74 68 2c 20 6f  cified length, o
1160: 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  r an error messa
1170: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ge. *. *--------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
11c0: 73 74 61 74 69 63 20 69 6e 74 20 4b 44 46 5f 48  static int KDF_H
11d0: 4b 44 46 28 43 6c 69 65 6e 74 44 61 74 61 20 63  KDF(ClientData c
11e0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
11f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
1200: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
1210: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
1220: 7b 0a 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43  {.    EVP_PKEY_C
1230: 54 58 20 2a 70 63 74 78 20 3d 20 4e 55 4c 4c 3b  TX *pctx = NULL;
1240: 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d  .    const EVP_M
1250: 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  D *md = NULL;.  
1260: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1270: 2a 73 61 6c 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6b  *salt = NULL, *k
1280: 65 79 20 3d 20 4e 55 4c 4c 2c 20 2a 69 6e 66 6f  ey = NULL, *info
1290: 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 75 74 20 3d 20   = NULL, *out = 
12a0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 61  NULL;.    int sa
12b0: 6c 74 5f 6c 65 6e 20 3d 20 30 2c 20 6b 65 79 5f  lt_len = 0, key_
12c0: 6c 65 6e 20 3d 20 30 2c 20 69 6e 66 6f 5f 6c 65  len = 0, info_le
12d0: 6e 20 3d 20 30 2c 20 72 65 73 20 3d 20 54 43 4c  n = 0, res = TCL
12e0: 5f 4f 4b 2c 20 66 6e 3b 0a 20 20 20 20 69 6e 74  _OK, fn;.    int
12f0: 20 64 6b 5f 6c 65 6e 20 3d 20 45 56 50 5f 4d 41   dk_len = EVP_MA
1300: 58 5f 4b 45 59 5f 4c 45 4e 47 54 48 20 2b 20 45  X_KEY_LENGTH + E
1310: 56 50 5f 4d 41 58 5f 49 56 5f 4c 45 4e 47 54 48  VP_MAX_IV_LENGTH
1320: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6f 75 74  ;.    size_t out
1330: 5f 6c 65 6e 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  _len;.    Tcl_Ob
1340: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 20 20  j *resultObj;.  
1350: 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44    (void) clientD
1360: 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ata;..    dprint
1370: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
1380: 20 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f 72    /* Clear error
1390: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73  s */.    Tcl_Res
13a0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
13b0: 3b 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ;.    ERR_clear_
13c0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f 2a  error();..    /*
13d0: 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f   Validate arg co
13e0: 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  unt */.    if (o
13f0: 62 6a 63 20 3c 20 35 20 7c 7c 20 6f 62 6a 63 20  bjc < 5 || objc 
1400: 3e 20 31 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  > 11) {..Tcl_Wro
1410: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1420: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 2d 64 69 67  , 1, objv, "-dig
1430: 65 73 74 20 64 69 67 65 73 74 20 2d 6b 65 79 20  est digest -key 
1440: 73 74 72 69 6e 67 20 3f 2d 69 6e 66 6f 20 73 74  string ?-info st
1450: 72 69 6e 67 3f 20 3f 2d 73 61 6c 74 20 73 74 72  ring? ?-salt str
1460: 69 6e 67 3f 20 3f 2d 73 69 7a 65 20 64 65 72 69  ing? ?-size deri
1470: 76 65 64 5f 6c 65 6e 67 74 68 3f 22 29 3b 0a 09  ved_length?");..
1480: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1490: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14a0: 47 65 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20  Get options */. 
14b0: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 64 78 20     for (int idx 
14c0: 3d 20 31 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b  = 1; idx < objc;
14d0: 20 69 64 78 2b 2b 29 20 7b 0a 09 2f 2a 20 47 65   idx++) {../* Ge
14e0: 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  t option */..if 
14f0: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f  (Tcl_GetIndexFro
1500: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1510: 76 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f  v[idx], command_
1520: 6f 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20  opts, "option", 
1530: 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f  0, &fn) != TCL_O
1540: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  K) {..    return
1550: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
1560: 09 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67  ./* Validate arg
1570: 20 68 61 73 20 61 20 76 61 6c 75 65 20 2a 2f 0a   has a value */.
1580: 09 69 66 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62  .if (++idx >= ob
1590: 6a 63 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  jc) {..    Tcl_A
15a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15b0: 72 70 2c 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f  rp, "No value fo
15c0: 72 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f  r option \"", co
15d0: 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20  mmand_opts[fn], 
15e0: 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  "\"", NULL);..  
15f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1600: 4f 52 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28  OR;..}...switch(
1610: 66 6e 29 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74  fn) {..case _opt
1620: 5f 64 69 67 65 73 74 3a 0a 09 63 61 73 65 20 5f  _digest:..case _
1630: 6f 70 74 5f 68 61 73 68 3a 0a 09 20 20 20 20 69  opt_hash:..    i
1640: 66 20 28 28 6d 64 20 3d 20 55 74 69 6c 5f 47 65  f ((md = Util_Ge
1650: 74 44 69 67 65 73 74 28 69 6e 74 65 72 70 2c 20  tDigest(interp, 
1660: 6f 62 6a 76 5b 69 64 78 5d 2c 20 54 52 55 45 29  objv[idx], TRUE)
1670: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 67  ) == NULL) {...g
1680: 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 20  oto error;..    
1690: 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  }..    break;..c
16a0: 61 73 65 20 5f 6f 70 74 5f 69 6e 66 6f 3a 0a 09  ase _opt_info:..
16b0: 20 20 20 20 2f 2a 20 4d 61 78 20 31 30 32 34 2f      /* Max 1024/
16c0: 32 30 34 38 20 2a 2f 0a 09 20 20 20 20 47 45 54  2048 */..    GET
16d0: 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28  _OPT_BYTE_ARRAY(
16e0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 69 6e 66 6f 2c  objv[idx], info,
16f0: 20 26 69 6e 66 6f 5f 6c 65 6e 29 3b 0a 09 20 20   &info_len);..  
1700: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
1710: 6f 70 74 5f 6b 65 79 3a 0a 09 63 61 73 65 20 5f  opt_key:..case _
1720: 6f 70 74 5f 70 61 73 73 77 6f 72 64 3a 0a 09 20  opt_password:.. 
1730: 20 20 20 69 66 20 28 28 6b 65 79 20 3d 20 55 74     if ((key = Ut
1740: 69 6c 5f 47 65 74 4b 65 79 28 69 6e 74 65 72 70  il_GetKey(interp
1750: 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 6b 65  , objv[idx], &ke
1760: 79 5f 6c 65 6e 2c 20 63 6f 6d 6d 61 6e 64 5f 6f  y_len, command_o
1770: 70 74 73 5b 66 6e 5d 2c 20 30 2c 20 31 29 29 20  pts[fn], 0, 1)) 
1780: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 67 6f 74  == NULL) {...got
1790: 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a  o error;..    }.
17a0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
17b0: 65 20 5f 6f 70 74 5f 73 61 6c 74 3a 0a 09 20 20  e _opt_salt:..  
17c0: 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41    GET_OPT_BYTE_A
17d0: 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RRAY(objv[idx], 
17e0: 73 61 6c 74 2c 20 26 73 61 6c 74 5f 6c 65 6e 29  salt, &salt_len)
17f0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
1800: 61 73 65 20 5f 6f 70 74 5f 6c 65 6e 67 74 68 3a  ase _opt_length:
1810: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 69 7a 65  ..case _opt_size
1820: 3a 0a 09 20 20 20 20 69 66 20 28 55 74 69 6c 5f  :..    if (Util_
1830: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 6f  GetInt(interp, o
1840: 62 6a 76 5b 69 64 78 5d 2c 20 26 64 6b 5f 6c 65  bjv[idx], &dk_le
1850: 6e 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b  n, command_opts[
1860: 66 6e 5d 2c 20 31 2c 20 30 29 20 21 3d 20 54 43  fn], 1, 0) != TC
1870: 4c 5f 4f 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 65  L_OK) {...goto e
1880: 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20  rror;..    }..  
1890: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20    break;..}.    
18a0: 7d 0a 0a 20 20 20 20 69 66 20 28 6d 64 20 3d 3d  }..    if (md ==
18b0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
18c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
18d0: 70 2c 20 22 6e 6f 20 64 69 67 65 73 74 22 2c 20  p, "no digest", 
18e0: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72  NULL);..goto err
18f0: 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  or;.    }..    i
1900: 66 20 28 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20  f (key == NULL) 
1910: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
1920: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
1930: 6b 65 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f  key", NULL);..go
1940: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to error;.    }.
1950: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
1960: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 70 63  ontext */.    pc
1970: 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54  tx = EVP_PKEY_CT
1980: 58 5f 6e 65 77 5f 69 64 28 45 56 50 5f 50 4b 45  X_new_id(EVP_PKE
1990: 59 5f 48 4b 44 46 2c 20 4e 55 4c 4c 29 3b 0a 20  Y_HKDF, NULL);. 
19a0: 20 20 20 69 66 20 28 70 63 74 78 20 3d 3d 20 4e     if (pctx == N
19b0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
19c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
19d0: 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74   "Memory allocat
19e0: 69 6f 6e 20 65 72 72 6f 72 22 2c 20 4e 55 4c 4c  ion error", NULL
19f0: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a  );..goto error;.
1a00: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 45      }..    if (E
1a10: 56 50 5f 50 4b 45 59 5f 64 65 72 69 76 65 5f 69  VP_PKEY_derive_i
1a20: 6e 69 74 28 70 63 74 78 29 20 3c 20 31 29 20 7b  nit(pctx) < 1) {
1a30: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
1a40: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74  lt(interp, "Init
1a50: 69 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22  ialize failed: "
1a60: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c  , REASON(), NULL
1a70: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a  );..goto error;.
1a80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
1a90: 74 20 63 6f 6e 66 69 67 20 70 61 72 61 6d 65 74  t config paramet
1aa0: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 45  ers */.    if (E
1ab0: 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f  VP_PKEY_CTX_set_
1ac0: 68 6b 64 66 5f 6d 64 28 70 63 74 78 2c 20 6d 64  hkdf_md(pctx, md
1ad0: 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70  ) < 1) {..Tcl_Ap
1ae0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1af0: 70 2c 20 22 53 65 74 20 64 69 67 65 73 74 20 66  p, "Set digest f
1b00: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e  ailed: ", REASON
1b10: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f  (), NULL);..goto
1b20: 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20   error;.    }.  
1b30: 20 20 69 66 20 28 45 56 50 5f 50 4b 45 59 5f 43    if (EVP_PKEY_C
1b40: 54 58 5f 73 65 74 31 5f 68 6b 64 66 5f 6b 65 79  TX_set1_hkdf_key
1b50: 28 70 63 74 78 2c 20 6b 65 79 2c 20 6b 65 79 5f  (pctx, key, key_
1b60: 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c  len) < 1) {..Tcl
1b70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b80: 74 65 72 70 2c 20 22 53 65 74 20 6b 65 79 20 66  terp, "Set key f
1b90: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e  ailed: ", REASON
1ba0: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f  (), NULL);..goto
1bb0: 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20   error;.    }.  
1bc0: 20 20 69 66 20 28 73 61 6c 74 20 21 3d 20 4e 55    if (salt != NU
1bd0: 4c 4c 20 26 26 20 45 56 50 5f 50 4b 45 59 5f 43  LL && EVP_PKEY_C
1be0: 54 58 5f 73 65 74 31 5f 68 6b 64 66 5f 73 61 6c  TX_set1_hkdf_sal
1bf0: 74 28 70 63 74 78 2c 20 73 61 6c 74 2c 20 73 61  t(pctx, salt, sa
1c00: 6c 74 5f 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09  lt_len) < 1) {..
1c10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c20: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 73 61  (interp, "Set sa
1c30: 6c 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  lt failed: ", RE
1c40: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
1c50: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20  goto error;.    
1c60: 7d 0a 20 20 20 20 69 66 20 28 69 6e 66 6f 20 21  }.    if (info !
1c70: 3d 20 4e 55 4c 4c 20 26 26 20 45 56 50 5f 50 4b  = NULL && EVP_PK
1c80: 45 59 5f 43 54 58 5f 61 64 64 31 5f 68 6b 64 66  EY_CTX_add1_hkdf
1c90: 5f 69 6e 66 6f 28 70 63 74 78 2c 20 69 6e 66 6f  _info(pctx, info
1ca0: 2c 20 69 6e 66 6f 5f 6c 65 6e 29 20 3c 20 31 29  , info_len) < 1)
1cb0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
1cc0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
1cd0: 74 20 69 6e 66 6f 20 66 61 69 6c 65 64 3a 20 22  t info failed: "
1ce0: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c  , REASON(), NULL
1cf0: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a  );..goto error;.
1d00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
1d10: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
1d20: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f  resultObj = Tcl_
1d30: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 69 66  NewObj();.    if
1d40: 20 28 28 6f 75 74 20 3d 20 54 63 6c 5f 53 65 74   ((out = Tcl_Set
1d50: 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28  ByteArrayLength(
1d60: 72 65 73 75 6c 74 4f 62 6a 2c 20 64 6b 5f 6c 65  resultObj, dk_le
1d70: 6e 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  n)) == NULL) {..
1d80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1d90: 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79  (interp, "Memory
1da0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1db0: 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  r", (char *) NUL
1dc0: 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b  L);..goto error;
1dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 5f 6c  .    }.    out_l
1de0: 65 6e 20 3d 20 28 73 69 7a 65 5f 74 29 20 64 6b  en = (size_t) dk
1df0: 5f 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65  _len;..    /* De
1e00: 72 69 76 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20  rive key */.    
1e10: 69 66 20 28 45 56 50 5f 50 4b 45 59 5f 64 65 72  if (EVP_PKEY_der
1e20: 69 76 65 28 70 63 74 78 2c 20 6f 75 74 2c 20 26  ive(pctx, out, &
1e30: 6f 75 74 5f 6c 65 6e 29 20 3e 20 30 29 20 7b 0a  out_len) > 0) {.
1e40: 09 2f 2a 20 53 68 72 69 6e 6b 20 62 75 66 66 65  ./* Shrink buffe
1e50: 72 20 74 6f 20 61 63 74 75 61 6c 20 73 69 7a 65  r to actual size
1e60: 20 2a 2f 0a 09 54 63 6c 5f 53 65 74 42 79 74 65   */..Tcl_SetByte
1e70: 41 72 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75  ArrayLength(resu
1e80: 6c 74 4f 62 6a 2c 20 28 69 6e 74 29 20 6f 75 74  ltObj, (int) out
1e90: 5f 6c 65 6e 29 3b 0a 09 54 63 6c 5f 53 65 74 4f  _len);..Tcl_SetO
1ea0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1eb0: 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 72 65   resultObj);..re
1ec0: 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 09 67 6f 74  s = TCL_OK;..got
1ed0: 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 20 65 6c  o done;.    } el
1ee0: 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  se {..Tcl_Append
1ef0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1f00: 4b 65 79 20 64 65 72 69 76 61 74 69 6f 6e 20 66  Key derivation f
1f10: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e  ailed: ", REASON
1f20: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  (), NULL);..Tcl_
1f30: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73  DecrRefCount(res
1f40: 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 0a  ultObj);.    }..
1f50: 65 72 72 6f 72 3a 0a 20 20 20 20 72 65 73 20 3d  error:.    res =
1f60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 64 6f 6e 65   TCL_ERROR;.done
1f70: 3a 0a 20 20 20 20 69 66 20 28 70 63 74 78 20 21  :.    if (pctx !
1f80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 50 5f 50  = NULL) {..EVP_P
1f90: 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 70 63 74  KEY_CTX_free(pct
1fa0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
1fb0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1fc0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 44 46 5f  -----. *. * KDF_
2010: 53 63 72 79 70 74 20 2d 2d 0a 20 2a 0a 20 2a 09  Scrypt --. *. *.
2020: 48 4d 41 43 2d 62 61 73 65 64 20 45 78 74 72 61  HMAC-based Extra
2030: 63 74 2d 61 6e 64 2d 45 78 70 61 6e 64 20 4b 65  ct-and-Expand Ke
2040: 79 20 44 65 72 69 76 61 74 69 6f 6e 20 46 75 6e  y Derivation Fun
2050: 63 74 69 6f 6e 20 28 48 4b 44 46 29 2e 0a 20 2a  ction (HKDF).. *
2060: 09 53 65 65 20 52 46 43 20 35 38 36 39 20 61 6e  .See RFC 5869 an
2070: 64 20 52 46 43 20 37 39 31 34 2e 0a 20 2a 0a 20  d RFC 7914.. *. 
2080: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
2090: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
20a0: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
20b0: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65  ects:. *.Sets re
20c0: 73 75 6c 74 20 74 6f 20 61 20 6c 69 73 74 20 6f  sult to a list o
20d0: 66 20 6b 65 79 20 61 6e 64 20 69 76 20 76 61 6c  f key and iv val
20e0: 75 65 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  ues, or an error
20f0: 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d   message. *. *--
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: 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
2150: 20 4b 44 46 5f 53 63 72 79 70 74 28 43 6c 69 65   KDF_Scrypt(Clie
2160: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2170: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
2180: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
2190: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
21a0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 45 56  objv[]) {.    EV
21b0: 50 5f 50 4b 45 59 5f 43 54 58 20 2a 70 63 74 78  P_PKEY_CTX *pctx
21c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73   = NULL;.    uns
21d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 61 6c 74  igned char *salt
21e0: 20 3d 20 4e 55 4c 4c 2c 20 2a 70 61 73 73 20 3d   = NULL, *pass =
21f0: 20 4e 55 4c 4c 2c 20 2a 6f 75 74 20 3d 20 4e 55   NULL, *out = NU
2200: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 61 6c 74  LL;.    int salt
2210: 5f 6c 65 6e 20 3d 20 30 2c 20 70 61 73 73 5f 6c  _len = 0, pass_l
2220: 65 6e 20 3d 20 30 2c 20 64 6b 5f 6c 65 6e 20 3d  en = 0, dk_len =
2230: 20 36 34 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f   64, res = TCL_O
2240: 4b 2c 20 66 6e 3b 0a 20 20 20 20 75 69 6e 74 36  K, fn;.    uint6
2250: 34 5f 74 20 4e 20 3d 20 30 2c 20 70 20 3d 20 30  4_t N = 0, p = 0
2260: 2c 20 72 20 3d 20 30 2c 20 6d 61 78 6d 65 6d 20  , r = 0, maxmem 
2270: 3d 20 30 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20  = 0;.    size_t 
2280: 6f 75 74 5f 6c 65 6e 3b 0a 20 20 20 20 54 63 6c  out_len;.    Tcl
2290: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b  _Obj *resultObj;
22a0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
22b0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
22c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
22d0: 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 65 72  .    /* Clear er
22e0: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  rors */.    Tcl_
22f0: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
2300: 72 70 29 3b 0a 20 20 20 20 45 52 52 5f 63 6c 65  rp);.    ERR_cle
2310: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
2320: 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67   /* Validate arg
2330: 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66   count */.    if
2340: 20 28 6f 62 6a 63 20 3c 20 35 20 7c 7c 20 6f 62   (objc < 5 || ob
2350: 6a 63 20 3e 20 31 33 29 20 7b 0a 09 54 63 6c 5f  jc > 13) {..Tcl_
2360: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2370: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 2d  erp, 1, objv, "-
2380: 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20  password string 
2390: 2d 73 61 6c 74 20 73 74 72 69 6e 67 20 3f 2d 4e  -salt string ?-N
23a0: 20 63 6f 73 74 50 61 72 61 6d 65 74 65 72 3f 20   costParameter? 
23b0: 3f 2d 72 20 62 6c 6f 63 6b 53 69 7a 65 3f 20 3f  ?-r blockSize? ?
23c0: 2d 70 20 70 61 72 61 6c 6c 65 6c 69 7a 61 74 69  -p parallelizati
23d0: 6f 6e 3f 20 3f 2d 73 69 7a 65 20 64 65 72 69 76  on? ?-size deriv
23e0: 65 64 5f 6c 65 6e 67 74 68 3f 22 29 3b 0a 09 72  ed_length?");..r
23f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2400: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
2410: 65 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  et options */.  
2420: 20 20 66 6f 72 20 28 69 6e 74 20 69 64 78 20 3d    for (int idx =
2430: 20 31 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20   1; idx < objc; 
2440: 69 64 78 2b 2b 29 20 7b 0a 09 2f 2a 20 47 65 74  idx++) {../* Get
2450: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28   option */..if (
2460: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
2470: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2480: 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f  [idx], command_o
2490: 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30  pts, "option", 0
24a0: 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b  , &fn) != TCL_OK
24b0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
24c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
24d0: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20  /* Validate arg 
24e0: 68 61 73 20 61 20 76 61 6c 75 65 20 2a 2f 0a 09  has a value */..
24f0: 69 66 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a  if (++idx >= obj
2500: 63 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  c) {..    Tcl_Ap
2510: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2520: 70 2c 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72  p, "No value for
2530: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d   option \"", com
2540: 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22  mand_opts[fn], "
2550: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  \"", (char *) NU
2560: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
2570: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
2580: 09 73 77 69 74 63 68 28 66 6e 29 20 7b 0a 09 63  .switch(fn) {..c
2590: 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a 09 63  ase _opt_key:..c
25a0: 61 73 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72  ase _opt_passwor
25b0: 64 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  d:..    GET_OPT_
25c0: 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b  BYTE_ARRAY(objv[
25d0: 69 64 78 5d 2c 20 70 61 73 73 2c 20 26 70 61 73  idx], pass, &pas
25e0: 73 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65  s_len);..    bre
25f0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73  ak;..case _opt_s
2600: 61 6c 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  alt:..    GET_OP
2610: 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a  T_BYTE_ARRAY(obj
2620: 76 5b 69 64 78 5d 2c 20 73 61 6c 74 2c 20 26 73  v[idx], salt, &s
2630: 61 6c 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62  alt_len);..    b
2640: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
2650: 5f 6c 65 6e 67 74 68 3a 0a 09 63 61 73 65 20 5f  _length:..case _
2660: 6f 70 74 5f 73 69 7a 65 3a 0a 09 20 20 20 20 69  opt_size:..    i
2670: 66 20 28 55 74 69 6c 5f 47 65 74 49 6e 74 28 69  f (Util_GetInt(i
2680: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 64 78 5d  nterp, objv[idx]
2690: 2c 20 26 64 6b 5f 6c 65 6e 2c 20 63 6f 6d 6d 61  , &dk_len, comma
26a0: 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 31 2c 20  nd_opts[fn], 1, 
26b0: 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  0) != TCL_OK) {.
26c0: 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20  ..goto error;.. 
26d0: 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b     }..    break;
26e0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 4e 3a 0a 09  ..case _opt_N:..
26f0: 63 61 73 65 20 5f 6f 70 74 5f 6e 3a 0a 09 20 20  case _opt_n:..  
2700: 20 20 47 45 54 5f 4f 50 54 5f 57 49 44 45 28 6f    GET_OPT_WIDE(o
2710: 62 6a 76 5b 69 64 78 5d 2c 20 26 4e 29 3b 0a 09  bjv[idx], &N);..
2720: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
2730: 20 5f 6f 70 74 5f 72 3a 0a 09 20 20 20 20 47 45   _opt_r:..    GE
2740: 54 5f 4f 50 54 5f 57 49 44 45 28 6f 62 6a 76 5b  T_OPT_WIDE(objv[
2750: 69 64 78 5d 2c 20 26 72 29 3b 0a 09 20 20 20 20  idx], &r);..    
2760: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
2770: 74 5f 70 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  t_p:..    GET_OP
2780: 54 5f 57 49 44 45 28 6f 62 6a 76 5b 69 64 78 5d  T_WIDE(objv[idx]
2790: 2c 20 26 70 29 3b 0a 09 20 20 20 20 62 72 65 61  , &p);..    brea
27a0: 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  k;..}.    }..   
27b0: 20 69 66 20 28 70 61 73 73 20 3d 3d 20 4e 55 4c   if (pass == NUL
27c0: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
27d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
27e0: 6e 6f 20 70 61 73 73 77 6f 72 64 22 2c 20 28 63  no password", (c
27f0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
2800: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2810: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
2820: 73 61 6c 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  salt == NULL) {.
2830: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
2840: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 61  t(interp, "no sa
2850: 6c 74 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  lt", (char *) NU
2860: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
2870: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
2880: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6e     /* Create con
2890: 74 65 78 74 20 2a 2f 0a 20 20 20 20 70 63 74 78  text */.    pctx
28a0: 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f   = EVP_PKEY_CTX_
28b0: 6e 65 77 5f 69 64 28 45 56 50 5f 50 4b 45 59 5f  new_id(EVP_PKEY_
28c0: 53 43 52 59 50 54 2c 20 4e 55 4c 4c 29 3b 0a 20  SCRYPT, NULL);. 
28d0: 20 20 20 69 66 20 28 70 63 74 78 20 3d 3d 20 4e     if (pctx == N
28e0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
28f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2900: 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74   "Memory allocat
2910: 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61  ion error", (cha
2920: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74  r *) NULL);..got
2930: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a  o error;.    }..
2940: 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45 59      if (EVP_PKEY
2950: 5f 64 65 72 69 76 65 5f 69 6e 69 74 28 70 63 74  _derive_init(pct
2960: 78 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41  x) < 1) {..Tcl_A
2970: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2980: 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65 20  rp, "Initialize 
2990: 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f  failed: ", REASO
29a0: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74  N(), NULL);..got
29b0: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a  o error;.    }..
29c0: 20 20 20 20 2f 2a 20 53 65 74 20 63 6f 6e 66 69      /* Set confi
29d0: 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
29e0: 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45 59      if (EVP_PKEY
29f0: 5f 43 54 58 5f 73 65 74 31 5f 70 62 65 5f 70 61  _CTX_set1_pbe_pa
2a00: 73 73 28 70 63 74 78 2c 20 70 61 73 73 2c 20 70  ss(pctx, pass, p
2a10: 61 73 73 5f 6c 65 6e 29 20 3c 20 31 29 20 7b 0a  ass_len) < 1) {.
2a20: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
2a30: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 6b  t(interp, "Set k
2a40: 65 79 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  ey failed: ", RE
2a50: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
2a60: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20  goto error;.    
2a70: 7d 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b  }.    if (EVP_PK
2a80: 45 59 5f 43 54 58 5f 73 65 74 31 5f 73 63 72 79  EY_CTX_set1_scry
2a90: 70 74 5f 73 61 6c 74 28 70 63 74 78 2c 20 73 61  pt_salt(pctx, sa
2aa0: 6c 74 2c 20 73 61 6c 74 5f 6c 65 6e 29 20 3c 20  lt, salt_len) < 
2ab0: 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  1) {..Tcl_Append
2ac0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2ad0: 53 65 74 20 73 61 6c 74 20 66 61 69 6c 65 64 3a  Set salt failed:
2ae0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55   ", REASON(), NU
2af0: 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72  LL);..goto error
2b00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
2b10: 4e 20 21 3d 20 30 20 26 26 20 45 56 50 5f 50 4b  N != 0 && EVP_PK
2b20: 45 59 5f 43 54 58 5f 73 65 74 5f 73 63 72 79 70  EY_CTX_set_scryp
2b30: 74 5f 4e 28 70 63 74 78 2c 20 4e 29 20 3c 20 31  t_N(pctx, N) < 1
2b40: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
2b50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
2b60: 65 74 20 63 6f 73 74 20 70 61 72 61 6d 65 74 65  et cost paramete
2b70: 72 20 28 4e 29 20 66 61 69 6c 65 64 3a 20 22 2c  r (N) failed: ",
2b80: 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29   REASON(), NULL)
2b90: 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20  ;..goto error;. 
2ba0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 20 21     }.    if (r !
2bb0: 3d 20 30 20 26 26 20 45 56 50 5f 50 4b 45 59 5f  = 0 && EVP_PKEY_
2bc0: 43 54 58 5f 73 65 74 5f 73 63 72 79 70 74 5f 72  CTX_set_scrypt_r
2bd0: 28 70 63 74 78 2c 20 72 29 20 3c 20 31 29 20 7b  (pctx, r) < 1) {
2be0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
2bf0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
2c00: 6c 6f 63 6b 20 73 69 7a 65 20 70 61 72 61 6d 65  lock size parame
2c10: 74 65 72 20 28 72 29 20 66 61 69 6c 65 64 3a 20  ter (r) failed: 
2c20: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c  ", REASON(), NUL
2c30: 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b  L);..goto error;
2c40: 0a 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 20  .   }.    if (p 
2c50: 21 3d 20 30 20 26 26 20 45 56 50 5f 50 4b 45 59  != 0 && EVP_PKEY
2c60: 5f 43 54 58 5f 73 65 74 5f 73 63 72 79 70 74 5f  _CTX_set_scrypt_
2c70: 70 28 70 63 74 78 2c 20 70 29 20 3c 20 31 29 20  p(pctx, p) < 1) 
2c80: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
2c90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
2ca0: 20 50 61 72 61 6c 6c 65 6c 69 7a 61 74 69 6f 6e   Parallelization
2cb0: 20 70 61 72 61 6d 65 74 65 72 20 28 70 29 20 66   parameter (p) f
2cc0: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e  ailed: ", REASON
2cd0: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f  (), NULL);..goto
2ce0: 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20   error;.    }.  
2cf0: 20 20 69 66 20 28 6d 61 78 6d 65 6d 20 21 3d 20    if (maxmem != 
2d00: 30 20 26 26 20 45 56 50 5f 50 4b 45 59 5f 43 54  0 && EVP_PKEY_CT
2d10: 58 5f 73 65 74 5f 73 63 72 79 70 74 5f 6d 61 78  X_set_scrypt_max
2d20: 6d 65 6d 5f 62 79 74 65 73 28 70 63 74 78 2c 20  mem_bytes(pctx, 
2d30: 6d 61 78 6d 65 6d 29 20 3c 20 31 29 20 7b 0a 09  maxmem) < 1) {..
2d40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2d50: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 6d 61  (interp, "Set ma
2d60: 78 20 6d 65 6d 6f 72 79 20 66 61 69 6c 65 64 3a  x memory failed:
2d70: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55   ", REASON(), NU
2d80: 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72  LL);..goto error
2d90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2da0: 47 65 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  Get buffer */.  
2db0: 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63    resultObj = Tc
2dc0: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
2dd0: 69 66 20 28 28 6f 75 74 20 3d 20 54 63 6c 5f 53  if ((out = Tcl_S
2de0: 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74  etByteArrayLengt
2df0: 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 64 6b 5f  h(resultObj, dk_
2e00: 6c 65 6e 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  len)) == NULL) {
2e10: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
2e20: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f  lt(interp, "Memo
2e30: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
2e40: 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ror", (char *) N
2e50: 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f  ULL);..goto erro
2e60: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74  r;.    }.    out
2e70: 5f 6c 65 6e 20 3d 20 28 73 69 7a 65 5f 74 29 20  _len = (size_t) 
2e80: 64 6b 5f 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20  dk_len;..    /* 
2e90: 44 65 72 69 76 65 20 6b 65 79 20 2a 2f 0a 20 20  Derive key */.  
2ea0: 20 20 69 66 20 28 45 56 50 5f 50 4b 45 59 5f 64    if (EVP_PKEY_d
2eb0: 65 72 69 76 65 28 70 63 74 78 2c 20 6f 75 74 2c  erive(pctx, out,
2ec0: 20 26 6f 75 74 5f 6c 65 6e 29 20 3e 20 30 29 20   &out_len) > 0) 
2ed0: 7b 0a 09 2f 2a 20 53 68 72 69 6e 6b 20 62 75 66  {../* Shrink buf
2ee0: 66 65 72 20 74 6f 20 61 63 74 75 61 6c 20 73 69  fer to actual si
2ef0: 7a 65 20 2a 2f 0a 09 54 63 6c 5f 53 65 74 42 79  ze */..Tcl_SetBy
2f00: 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 72 65  teArrayLength(re
2f10: 73 75 6c 74 4f 62 6a 2c 20 28 69 6e 74 29 20 6f  sultObj, (int) o
2f20: 75 74 5f 6c 65 6e 29 3b 0a 09 54 63 6c 5f 53 65  ut_len);..Tcl_Se
2f30: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2f40: 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09  p, resultObj);..
2f50: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 0a 20 20 20 20  goto done;..    
2f60: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70  } else {..Tcl_Ap
2f70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2f80: 70 2c 20 22 4b 65 79 20 64 65 72 69 76 61 74 69  p, "Key derivati
2f90: 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  on failed: ", RE
2fa0: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
2fb0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2fc0: 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20  (resultObj);.   
2fd0: 20 7d 0a 0a 65 72 72 6f 72 3a 0a 20 20 20 20 72   }..error:.    r
2fe0: 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  es = TCL_ERROR;.
2ff0: 0a 64 6f 6e 65 3a 0a 20 20 20 20 69 66 20 28 70  .done:.    if (p
3000: 63 74 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ctx != NULL) {..
3010: 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65  EVP_PKEY_CTX_fre
3020: 65 28 70 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20  e(pctx);.    }. 
3030: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
3040: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3090: 20 54 6c 73 5f 4b 65 79 43 6f 6d 6d 61 6e 64 73   Tls_KeyCommands
30a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65   --. *. *.Create
30b0: 20 6b 65 79 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a   key commands. *
30c0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09  . * Returns:. *.
30d0: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52  TCL_OK or TCL_ER
30e0: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ROR. *. * Side e
30f0: 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74  ffects:. *.Creat
3100: 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20  es commands. *. 
3110: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73  ----. */.int Tls
3160: 5f 4b 44 46 43 6f 6d 6d 61 6e 64 73 28 54 63 6c  _KDFCommands(Tcl
3170: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
3180: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74   {.    Tcl_Creat
3190: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
31a0: 72 70 2c 20 22 74 6c 73 3a 3a 68 6b 64 66 22 2c  rp, "tls::hkdf",
31b0: 20 4b 44 46 5f 48 4b 44 46 2c 20 28 43 6c 69 65   KDF_HKDF, (Clie
31c0: 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
31d0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
31e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
31f0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
3200: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
3210: 3a 3a 70 62 6b 64 66 32 22 2c 20 4b 44 46 5f 50  ::pbkdf2", KDF_P
3220: 42 4b 44 46 32 2c 20 28 43 6c 69 65 6e 74 44 61  BKDF2, (ClientDa
3230: 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
3240: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
3250: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
3260: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
3270: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 63  interp, "tls::sc
3280: 72 79 70 74 22 2c 20 4b 44 46 5f 53 63 72 79 70  rypt", KDF_Scryp
3290: 74 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  t, (ClientData) 
32a0: 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
32b0: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
32c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
32d0: 4c 5f 4f 4b 3b 0a 7d 0a 0a                       L_OK;.}..