Hex Artifact Content

Artifact 81a965108cb00d20a7ca0477dd8d8a164ad4c9b3f02c1c7b199de8ed3c7dbf4a:


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