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