Hex Artifact Content

Artifact d7871deab8f0d9e827fe80afce5dcf61def982cfebf9fe206ded4471cd9af049:


0000: 2f 2a 0a 20 2a 20 4b 65 79 20 44 65 72 69 76 61  /*. * Key Deriva
0010: 74 69 6f 6e 20 46 75 6e 63 74 69 6f 6e 20 28 4b  tion Function (K
0020: 44 46 29 20 4d 6f 64 75 6c 65 0a 20 2a 0a 20 2a  DF) Module. *. *
0030: 20 50 72 6f 76 69 64 65 73 20 63 6f 6d 6d 61 6e   Provides comman
0040: 64 73 20 74 6f 20 64 65 72 69 76 65 20 6b 65 79  ds to derive key
0050: 73 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67  s.. *. * Copyrig
0060: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61  ht (C) 2023 Bria
0070: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a 2f  n O'Hagan. *. */
0080: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49  ..#include "tlsI
0090: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
00a0: 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63 6c  tclOpts.h".#incl
00b0: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 65 76 70  ude <openssl/evp
00c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  .h>.#include <op
00d0: 65 6e 73 73 6c 2f 6b 64 66 2e 68 3e 0a 0a 2f 2a  enssl/kdf.h>../*
00e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0120: 2a 2a 2f 0a 0a 2f 2a 20 4f 70 74 69 6f 6e 73 20  **/../* Options 
0130: 66 6f 72 20 4b 44 46 20 63 6f 6d 6d 61 6e 64 73  for KDF commands
0140: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73   */..static cons
0150: 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 5f  t char *command_
0160: 6f 70 74 73 20 5b 5d 20 3d 20 7b 0a 20 20 20 20  opts [] = {.    
0170: 22 2d 63 69 70 68 65 72 22 2c 20 22 2d 64 69 67  "-cipher", "-dig
0180: 65 73 74 22 2c 20 22 2d 68 61 73 68 22 2c 20 22  est", "-hash", "
0190: 2d 69 6e 66 6f 22 2c 20 22 2d 69 74 65 72 61 74  -info", "-iterat
01a0: 69 6f 6e 73 22 2c 20 22 2d 6b 65 79 22 2c 20 22  ions", "-key", "
01b0: 2d 6c 65 6e 67 74 68 22 2c 20 22 2d 70 61 73 73  -length", "-pass
01c0: 77 6f 72 64 22 2c 0a 20 20 20 20 22 2d 73 61 6c  word",.    "-sal
01d0: 74 22 2c 20 22 2d 73 69 7a 65 22 2c 20 22 2d 4e  t", "-size", "-N
01e0: 22 2c 20 22 2d 6e 22 2c 20 22 2d 72 22 2c 20 22  ", "-n", "-r", "
01f0: 2d 70 22 2c 20 4e 55 4c 4c 7d 3b 0a 0a 65 6e 75  -p", NULL};..enu
0200: 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20  m _command_opts 
0210: 7b 0a 20 20 20 20 5f 6f 70 74 5f 63 69 70 68 65  {.    _opt_ciphe
0220: 72 2c 20 5f 6f 70 74 5f 64 69 67 65 73 74 2c 20  r, _opt_digest, 
0230: 5f 6f 70 74 5f 68 61 73 68 2c 20 5f 6f 70 74 5f  _opt_hash, _opt_
0240: 69 6e 66 6f 2c 20 5f 6f 70 74 5f 69 74 65 72 2c  info, _opt_iter,
0250: 20 5f 6f 70 74 5f 6b 65 79 2c 20 5f 6f 70 74 5f   _opt_key, _opt_
0260: 6c 65 6e 67 74 68 2c 0a 20 20 20 20 5f 6f 70 74  length,.    _opt
0270: 5f 70 61 73 73 77 6f 72 64 2c 20 5f 6f 70 74 5f  _password, _opt_
0280: 73 61 6c 74 2c 20 5f 6f 70 74 5f 73 69 7a 65 2c  salt, _opt_size,
0290: 20 5f 6f 70 74 5f 4e 2c 20 5f 6f 70 74 5f 6e 2c   _opt_N, _opt_n,
02a0: 20 5f 6f 70 74 5f 72 2c 20 5f 6f 70 74 5f 70 0a   _opt_r, _opt_p.
02b0: 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  };../*. *-------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0300: 20 2a 20 4b 44 46 5f 50 42 4b 44 46 32 20 2d 2d   * KDF_PBKDF2 --
0310: 0a 20 2a 0a 20 2a 09 50 4b 43 53 35 5f 50 42 4b  . *. *.PKCS5_PBK
0320: 44 46 32 5f 48 4d 41 43 20 6b 65 79 20 64 65 72  DF2_HMAC key der
0330: 69 76 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ivation function
0340: 20 28 4b 44 46 29 20 73 70 65 63 69 66 69 65 64   (KDF) specified
0350: 20 62 79 20 50 4b 43 53 20 23 35 2e 0a 20 2a 09   by PKCS #5.. *.
0360: 4b 44 46 73 20 69 6e 63 6c 75 64 65 20 50 42 4b  KDFs include PBK
0370: 44 46 32 20 66 72 6f 6d 20 52 46 43 20 32 38 39  DF2 from RFC 289
0380: 38 2f 38 30 31 38 20 61 6e 64 20 53 63 72 79 70  8/8018 and Scryp
0390: 74 20 66 72 6f 6d 20 52 46 43 20 37 39 31 34 2e  t from RFC 7914.
03a0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
03b0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
03c0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
03d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
03e0: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 61 20 6c  ts result to a l
03f0: 69 73 74 20 6f 66 20 6b 65 79 20 61 6e 64 20 69  ist of key and i
0400: 76 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 6e 20  v values, or an 
0410: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a  error message. *
0420: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0460: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
0470: 63 20 69 6e 74 20 4b 44 46 5f 50 42 4b 44 46 32  c int KDF_PBKDF2
0480: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
0490: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
04a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
04b0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
04c0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
04d0: 20 20 20 54 63 6c 5f 53 69 7a 65 20 66 6e 2c 20     Tcl_Size fn, 
04e0: 73 61 6c 74 5f 6c 65 6e 20 3d 20 30 2c 20 70 61  salt_len = 0, pa
04f0: 73 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  ss_len = 0;.    
0500: 69 6e 74 20 69 6b 6c 65 6e 2c 20 69 76 6c 65 6e  int iklen, ivlen
0510: 2c 20 69 74 65 72 20 3d 20 31 3b 0a 20 20 20 20  , iter = 1;.    
0520: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
0530: 61 73 73 20 3d 20 4e 55 4c 4c 2c 20 2a 73 61 6c  ass = NULL, *sal
0540: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f  t = NULL;.    co
0550: 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 20 3d  nst EVP_MD *md =
0560: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74   NULL;.    const
0570: 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70   EVP_CIPHER *cip
0580: 68 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  her = NULL;.    
0590: 69 6e 74 20 62 75 66 5f 6c 65 6e 20 3d 20 28 45  int buf_len = (E
05a0: 56 50 5f 4d 41 58 5f 4b 45 59 5f 4c 45 4e 47 54  VP_MAX_KEY_LENGT
05b0: 48 20 2b 20 45 56 50 5f 4d 41 58 5f 49 56 5f 4c  H + EVP_MAX_IV_L
05c0: 45 4e 47 54 48 29 2a 34 2c 20 64 6b 5f 6c 65 6e  ENGTH)*4, dk_len
05d0: 20 3d 20 62 75 66 5f 6c 65 6e 3b 0a 20 20 20 20   = buf_len;.    
05e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 6d  unsigned char tm
05f0: 70 6b 65 79 69 76 5b 28 45 56 50 5f 4d 41 58 5f  pkeyiv[(EVP_MAX_
0600: 4b 45 59 5f 4c 45 4e 47 54 48 20 2b 20 45 56 50  KEY_LENGTH + EVP
0610: 5f 4d 41 58 5f 49 56 5f 4c 45 4e 47 54 48 29 2a  _MAX_IV_LENGTH)*
0620: 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  4];.    (void) c
0630: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
0640: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
0650: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72  );..    /* Clear
0660: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54   errors */.    T
0670: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
0680: 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 52 52 5f  nterp);.    ERR_
0690: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
06a0: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20      /* Validate 
06b0: 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  arg count */.   
06c0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c 7c   if (objc < 3 ||
06d0: 20 6f 62 6a 63 20 3e 20 31 31 29 20 7b 0a 09 54   objc > 11) {..T
06e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
06f0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
0700: 20 22 5b 2d 63 69 70 68 65 72 20 63 69 70 68 65   "[-cipher ciphe
0710: 72 20 7c 20 2d 73 69 7a 65 20 6c 65 6e 67 74 68  r | -size length
0720: 5d 20 2d 64 69 67 65 73 74 20 64 69 67 65 73 74  ] -digest digest
0730: 20 3f 2d 69 74 65 72 61 74 69 6f 6e 73 20 63 6f   ?-iterations co
0740: 75 6e 74 3f 20 3f 2d 70 61 73 73 77 6f 72 64 20  unt? ?-password 
0750: 73 74 72 69 6e 67 3f 20 3f 2d 73 61 6c 74 20 73  string? ?-salt s
0760: 74 72 69 6e 67 3f 22 29 3b 0a 09 72 65 74 75 72  tring?");..retur
0770: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
0780: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 20   }..    /* Init 
0790: 62 75 66 66 65 72 73 20 2a 2f 0a 20 20 20 20 6d  buffers */.    m
07a0: 65 6d 73 65 74 28 74 6d 70 6b 65 79 69 76 2c 20  emset(tmpkeyiv, 
07b0: 30 2c 20 62 75 66 5f 6c 65 6e 29 3b 0a 0a 20 20  0, buf_len);..  
07c0: 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73    /* Get options
07d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 6e 74   */.    for (int
07e0: 20 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20   idx = 1; idx < 
07f0: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  objc; idx++) {..
0800: 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 2a 2f  /* Get option */
0810: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64  ..if (Tcl_GetInd
0820: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
0830: 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f 6d  , objv[idx], com
0840: 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74 69  mand_opts, "opti
0850: 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20  on", 0, &fn) != 
0860: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72  TCL_OK) {..    r
0870: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0880: 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61 74  ..}.../* Validat
0890: 65 20 61 72 67 20 68 61 73 20 61 20 76 61 6c 75  e arg has a valu
08a0: 65 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20  e */..if (++idx 
08b0: 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20  >= objc) {..    
08c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
08d0: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c  (interp, "No val
08e0: 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22  ue for option \"
08f0: 22 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b  ", command_opts[
0900: 66 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72  fn], "\"", (char
0910: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
0920: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0930: 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e  ;..}...switch(fn
0940: 29 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63  ) {..case _opt_c
0950: 69 70 68 65 72 3a 0a 09 20 20 20 20 69 66 20 28  ipher:..    if (
0960: 28 63 69 70 68 65 72 20 3d 20 55 74 69 6c 5f 47  (cipher = Util_G
0970: 65 74 43 69 70 68 65 72 28 69 6e 74 65 72 70 2c  etCipher(interp,
0980: 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 54 52 55 45   objv[idx], TRUE
0990: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  )) == NULL) {...
09a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
09b0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72  ;..    }..    br
09c0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
09d0: 64 69 67 65 73 74 3a 0a 09 63 61 73 65 20 5f 6f  digest:..case _o
09e0: 70 74 5f 68 61 73 68 3a 0a 09 20 20 20 20 69 66  pt_hash:..    if
09f0: 20 28 28 6d 64 20 3d 20 55 74 69 6c 5f 47 65 74   ((md = Util_Get
0a00: 44 69 67 65 73 74 28 69 6e 74 65 72 70 2c 20 6f  Digest(interp, o
0a10: 62 6a 76 5b 69 64 78 5d 2c 20 54 52 55 45 29 29  bjv[idx], TRUE))
0a20: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
0a30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0a40: 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61  .    }..    brea
0a50: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 69 74  k;..case _opt_it
0a60: 65 72 3a 0a 09 20 20 20 20 69 66 20 28 55 74 69  er:..    if (Uti
0a70: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
0a80: 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 69 74 65   objv[idx], &ite
0a90: 72 2c 20 22 69 74 65 72 61 74 69 6f 6e 73 22 2c  r, "iterations",
0aa0: 20 31 2c 20 2d 31 29 20 21 3d 20 54 43 4c 5f 4f   1, -1) != TCL_O
0ab0: 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43  K) {...return TC
0ac0: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
0ad0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
0ae0: 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a 09 63 61 73  e _opt_key:..cas
0af0: 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72 64 3a  e _opt_password:
0b00: 0a 09 20 20 20 20 70 61 73 73 20 3d 20 55 74 69  ..    pass = Uti
0b10: 6c 5f 47 65 74 4b 65 79 28 69 6e 74 65 72 70 2c  l_GetKey(interp,
0b20: 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 70 61 73   objv[idx], &pas
0b30: 73 5f 6c 65 6e 2c 20 63 6f 6d 6d 61 6e 64 5f 6f  s_len, command_o
0b40: 70 74 73 5b 66 6e 5d 2c 20 30 2c 20 46 41 4c 53  pts[fn], 0, FALS
0b50: 45 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  E);..    break;.
0b60: 09 63 61 73 65 20 5f 6f 70 74 5f 73 61 6c 74 3a  .case _opt_salt:
0b70: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59  ..    GET_OPT_BY
0b80: 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64  TE_ARRAY(objv[id
0b90: 78 5d 2c 20 73 61 6c 74 2c 20 26 73 61 6c 74 5f  x], salt, &salt_
0ba0: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  len);..    break
0bb0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6c 65 6e  ;..case _opt_len
0bc0: 67 74 68 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f  gth:..case _opt_
0bd0: 73 69 7a 65 3a 0a 09 20 20 20 20 69 66 20 28 55  size:..    if (U
0be0: 74 69 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  til_GetInt(inter
0bf0: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 64  p, objv[idx], &d
0c00: 6b 5f 6c 65 6e 2c 20 63 6f 6d 6d 61 6e 64 5f 6f  k_len, command_o
0c10: 70 74 73 5b 66 6e 5d 2c 20 31 2c 20 62 75 66 5f  pts[fn], 1, buf_
0c20: 6c 65 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  len) != TCL_OK) 
0c30: 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  {...return TCL_E
0c40: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20  RROR;..    }..  
0c50: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20    break;..}.    
0c60: 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61  }..    /* Valida
0c70: 74 65 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  te options */.  
0c80: 20 20 69 66 20 28 6d 64 20 3d 3d 20 4e 55 4c 4c    if (md == NULL
0c90: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
0ca0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
0cb0: 6f 20 64 69 67 65 73 74 22 2c 20 28 63 68 61 72  o digest", (char
0cc0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
0cd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0ce0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
0cf0: 6f 75 74 70 75 74 20 74 79 70 65 20 73 69 7a 65  output type size
0d00: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 69 70  s */.    if (cip
0d10: 68 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  her == NULL) {..
0d20: 69 66 20 28 64 6b 5f 6c 65 6e 20 3e 20 62 75 66  if (dk_len > buf
0d30: 5f 6c 65 6e 29 20 64 6b 5f 6c 65 6e 20 3d 20 62  _len) dk_len = b
0d40: 75 66 5f 6c 65 6e 3b 0a 09 69 6b 6c 65 6e 20 3d  uf_len;..iklen =
0d50: 20 64 6b 5f 6c 65 6e 3b 0a 09 69 76 6c 65 6e 20   dk_len;..ivlen 
0d60: 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  = 0;.    } else 
0d70: 7b 0a 09 69 6b 6c 65 6e 20 3d 20 45 56 50 5f 43  {..iklen = EVP_C
0d80: 49 50 48 45 52 5f 6b 65 79 5f 6c 65 6e 67 74 68  IPHER_key_length
0d90: 28 63 69 70 68 65 72 29 3b 0a 09 69 76 6c 65 6e  (cipher);..ivlen
0da0: 20 3d 20 45 56 50 5f 43 49 50 48 45 52 5f 69 76   = EVP_CIPHER_iv
0db0: 5f 6c 65 6e 67 74 68 28 63 69 70 68 65 72 29 3b  _length(cipher);
0dc0: 0a 09 64 6b 5f 6c 65 6e 20 3d 20 69 6b 6c 65 6e  ..dk_len = iklen
0dd0: 2b 69 76 6c 65 6e 3b 0a 20 20 20 20 7d 0a 0a 20  +ivlen;.    }.. 
0de0: 20 20 20 2f 2a 20 44 65 72 69 76 65 20 6b 65 79     /* Derive key
0df0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 50 4b 43   */.    if (!PKC
0e00: 53 35 5f 50 42 4b 44 46 32 5f 48 4d 41 43 28 70  S5_PBKDF2_HMAC(p
0e10: 61 73 73 2c 20 28 69 6e 74 29 20 70 61 73 73 5f  ass, (int) pass_
0e20: 6c 65 6e 2c 20 73 61 6c 74 2c 20 28 69 6e 74 29  len, salt, (int)
0e30: 20 73 61 6c 74 5f 6c 65 6e 2c 20 69 74 65 72 2c   salt_len, iter,
0e40: 20 6d 64 2c 20 64 6b 5f 6c 65 6e 2c 20 74 6d 70   md, dk_len, tmp
0e50: 6b 65 79 69 76 29 29 20 7b 0a 09 54 63 6c 5f 41  keyiv)) {..Tcl_A
0e60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
0e70: 72 70 2c 20 22 4b 65 79 20 64 65 72 69 76 61 74  rp, "Key derivat
0e80: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47  ion failed: ", G
0e90: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
0ea0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
0eb0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
0ec0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 2f 2a  OR;.    }..   /*
0ed0: 20 53 65 74 20 72 65 73 75 6c 74 20 74 6f 20 6b   Set result to k
0ee0: 65 79 20 61 6e 64 20 69 76 20 2a 2f 0a 20 20 20  ey and iv */.   
0ef0: 20 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20 4e   if (cipher == N
0f00: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f  ULL) {..Tcl_SetO
0f10: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
0f20: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
0f30: 79 4f 62 6a 28 74 6d 70 6b 65 79 69 76 2c 20 28  yObj(tmpkeyiv, (
0f40: 54 63 6c 5f 53 69 7a 65 29 20 64 6b 5f 6c 65 6e  Tcl_Size) dk_len
0f50: 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ));.    } else {
0f60: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c  ..Tcl_Obj *resul
0f70: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tObj = Tcl_NewLi
0f80: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
0f90: 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
0fa0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
0fb0: 6a 2c 20 22 6b 65 79 22 2c 20 74 6d 70 6b 65 79  j, "key", tmpkey
0fc0: 69 76 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 69  iv, (Tcl_Size) i
0fd0: 6b 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  klen);..LAPPEND_
0fe0: 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 72  BARRAY(interp, r
0ff0: 65 73 75 6c 74 4f 62 6a 2c 20 22 69 76 22 2c 20  esultObj, "iv", 
1000: 74 6d 70 6b 65 79 69 76 2b 69 6b 6c 65 6e 2c 20  tmpkeyiv+iklen, 
1010: 28 54 63 6c 5f 53 69 7a 65 29 20 69 76 6c 65 6e  (Tcl_Size) ivlen
1020: 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  );..Tcl_SetObjRe
1030: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73  sult(interp, res
1040: 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 0a  ultObj);.    }..
1050: 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 64 61 74      /* Clear dat
1060: 61 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  a */.    memset(
1070: 74 6d 70 6b 65 79 69 76 2c 20 30 2c 20 62 75 66  tmpkeyiv, 0, buf
1080: 5f 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  _len);.    retur
1090: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
10a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 44 46 5f  -----. *. * KDF_
10f0: 48 4b 44 46 20 2d 2d 0a 20 2a 0a 20 2a 09 48 4d  HKDF --. *. *.HM
1100: 41 43 2d 62 61 73 65 64 20 45 78 74 72 61 63 74  AC-based Extract
1110: 2d 61 6e 64 2d 45 78 70 61 6e 64 20 4b 65 79 20  -and-Expand Key 
1120: 44 65 72 69 76 61 74 69 6f 6e 20 46 75 6e 63 74  Derivation Funct
1130: 69 6f 6e 20 28 48 4b 44 46 29 2e 0a 20 2a 09 53  ion (HKDF).. *.S
1140: 65 65 20 52 46 43 20 35 38 36 39 2e 0a 20 2a 0a  ee RFC 5869.. *.
1150: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
1160: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
1170: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
1180: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72  fects:. *.Sets r
1190: 65 73 75 6c 74 20 74 6f 20 61 20 6b 65 79 20 6f  esult to a key o
11a0: 66 20 73 70 65 63 69 66 69 65 64 20 6c 65 6e 67  f specified leng
11b0: 74 68 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  th, or an error 
11c0: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d  message. *. *---
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1210: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1220: 4b 44 46 5f 48 4b 44 46 28 43 6c 69 65 6e 74 44  KDF_HKDF(ClientD
1230: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
1240: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1250: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
1260: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
1270: 76 5b 5d 29 20 7b 0a 20 20 20 20 45 56 50 5f 50  v[]) {.    EVP_P
1280: 4b 45 59 5f 43 54 58 20 2a 70 63 74 78 20 3d 20  KEY_CTX *pctx = 
1290: 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20  NULL;.    const 
12a0: 45 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e 55 4c  EVP_MD *md = NUL
12b0: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
12c0: 63 68 61 72 20 2a 73 61 6c 74 20 3d 20 4e 55 4c  char *salt = NUL
12d0: 4c 2c 20 2a 6b 65 79 20 3d 20 4e 55 4c 4c 2c 20  L, *key = NULL, 
12e0: 2a 69 6e 66 6f 20 3d 20 4e 55 4c 4c 2c 20 2a 6f  *info = NULL, *o
12f0: 75 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  ut = NULL;.    T
1300: 63 6c 5f 53 69 7a 65 20 73 61 6c 74 5f 6c 65 6e  cl_Size salt_len
1310: 20 3d 20 30 2c 20 6b 65 79 5f 6c 65 6e 20 3d 20   = 0, key_len = 
1320: 30 2c 20 69 6e 66 6f 5f 6c 65 6e 20 3d 20 30 3b  0, info_len = 0;
1330: 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 54  .    int res = T
1340: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 54 63 6c 5f 53  CL_OK;.    Tcl_S
1350: 69 7a 65 20 66 6e 3b 0a 20 20 20 20 69 6e 74 20  ize fn;.    int 
1360: 64 6b 5f 6c 65 6e 20 3d 20 45 56 50 5f 4d 41 58  dk_len = EVP_MAX
1370: 5f 4b 45 59 5f 4c 45 4e 47 54 48 20 2b 20 45 56  _KEY_LENGTH + EV
1380: 50 5f 4d 41 58 5f 49 56 5f 4c 45 4e 47 54 48 3b  P_MAX_IV_LENGTH;
1390: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6f 75 74 5f  .    size_t out_
13a0: 6c 65 6e 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  len;.    Tcl_Obj
13b0: 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 20 20 20   *resultObj;.   
13c0: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
13d0: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ta;..    dprintf
13e0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
13f0: 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f 72 73   /* Clear errors
1400: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65   */.    Tcl_Rese
1410: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1420: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
1430: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f 2a 20  rror();..    /* 
1440: 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75  Validate arg cou
1450: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62  nt */.    if (ob
1460: 6a 63 20 3c 20 35 20 7c 7c 20 6f 62 6a 63 20 3e  jc < 5 || objc >
1470: 20 31 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e   11) {..Tcl_Wron
1480: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1490: 20 31 2c 20 6f 62 6a 76 2c 20 22 2d 64 69 67 65   1, objv, "-dige
14a0: 73 74 20 64 69 67 65 73 74 20 2d 6b 65 79 20 73  st digest -key s
14b0: 74 72 69 6e 67 20 3f 2d 69 6e 66 6f 20 73 74 72  tring ?-info str
14c0: 69 6e 67 3f 20 3f 2d 73 61 6c 74 20 73 74 72 69  ing? ?-salt stri
14d0: 6e 67 3f 20 3f 2d 73 69 7a 65 20 64 65 72 69 76  ng? ?-size deriv
14e0: 65 64 5f 6c 65 6e 67 74 68 3f 22 29 3b 0a 09 72  ed_length?");..r
14f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1510: 65 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  et options */.  
1520: 20 20 66 6f 72 20 28 69 6e 74 20 69 64 78 20 3d    for (int idx =
1530: 20 31 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20   1; idx < objc; 
1540: 69 64 78 2b 2b 29 20 7b 0a 09 2f 2a 20 47 65 74  idx++) {../* Get
1550: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28   option */..if (
1560: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
1570: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1580: 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f  [idx], command_o
1590: 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30  pts, "option", 0
15a0: 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b  , &fn) != TCL_OK
15b0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
15c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
15d0: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20  /* Validate arg 
15e0: 68 61 73 20 61 20 76 61 6c 75 65 20 2a 2f 0a 09  has a value */..
15f0: 69 66 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a  if (++idx >= obj
1600: 63 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  c) {..    Tcl_Ap
1610: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1620: 70 2c 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72  p, "No value for
1630: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d   option \"", com
1640: 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22  mand_opts[fn], "
1650: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  \"", (char *) NU
1660: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
1670: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
1680: 09 73 77 69 74 63 68 28 66 6e 29 20 7b 0a 09 63  .switch(fn) {..c
1690: 61 73 65 20 5f 6f 70 74 5f 64 69 67 65 73 74 3a  ase _opt_digest:
16a0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 68 61 73 68  ..case _opt_hash
16b0: 3a 0a 09 20 20 20 20 69 66 20 28 28 6d 64 20 3d  :..    if ((md =
16c0: 20 55 74 69 6c 5f 47 65 74 44 69 67 65 73 74 28   Util_GetDigest(
16d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 64 78  interp, objv[idx
16e0: 5d 2c 20 54 52 55 45 29 29 20 3d 3d 20 4e 55 4c  ], TRUE)) == NUL
16f0: 4c 29 20 7b 0a 09 09 67 6f 74 6f 20 65 72 72 6f  L) {...goto erro
1700: 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62  r;..    }..    b
1710: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
1720: 5f 69 6e 66 6f 3a 0a 09 20 20 20 20 2f 2a 20 4d  _info:..    /* M
1730: 61 78 20 31 30 32 34 2f 32 30 34 38 20 2a 2f 0a  ax 1024/2048 */.
1740: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54  .    GET_OPT_BYT
1750: 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78  E_ARRAY(objv[idx
1760: 5d 2c 20 69 6e 66 6f 2c 20 26 69 6e 66 6f 5f 6c  ], info, &info_l
1770: 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  en);..    break;
1780: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a  ..case _opt_key:
1790: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 70 61 73 73  ..case _opt_pass
17a0: 77 6f 72 64 3a 0a 09 20 20 20 20 69 66 20 28 28  word:..    if ((
17b0: 6b 65 79 20 3d 20 55 74 69 6c 5f 47 65 74 4b 65  key = Util_GetKe
17c0: 79 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  y(interp, objv[i
17d0: 64 78 5d 2c 20 26 6b 65 79 5f 6c 65 6e 2c 20 63  dx], &key_len, c
17e0: 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c  ommand_opts[fn],
17f0: 20 30 2c 20 31 29 29 20 3d 3d 20 4e 55 4c 4c 29   0, 1)) == NULL)
1800: 20 7b 0a 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b   {...goto error;
1810: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65  ..    }..    bre
1820: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73  ak;..case _opt_s
1830: 61 6c 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  alt:..    GET_OP
1840: 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a  T_BYTE_ARRAY(obj
1850: 76 5b 69 64 78 5d 2c 20 73 61 6c 74 2c 20 26 73  v[idx], salt, &s
1860: 61 6c 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62  alt_len);..    b
1870: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
1880: 5f 6c 65 6e 67 74 68 3a 0a 09 63 61 73 65 20 5f  _length:..case _
1890: 6f 70 74 5f 73 69 7a 65 3a 0a 09 20 20 20 20 69  opt_size:..    i
18a0: 66 20 28 55 74 69 6c 5f 47 65 74 49 6e 74 28 69  f (Util_GetInt(i
18b0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 64 78 5d  nterp, objv[idx]
18c0: 2c 20 26 64 6b 5f 6c 65 6e 2c 20 63 6f 6d 6d 61  , &dk_len, comma
18d0: 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 31 2c 20  nd_opts[fn], 1, 
18e0: 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  0) != TCL_OK) {.
18f0: 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20  ..goto error;.. 
1900: 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b     }..    break;
1910: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ..}.    }..    i
1920: 66 20 28 6d 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  f (md == NULL) {
1930: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
1940: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 64  lt(interp, "no d
1950: 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29  igest", (char *)
1960: 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72   NULL);..goto er
1970: 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ror;.    }..    
1980: 69 66 20 28 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29  if (key == NULL)
1990: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
19a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
19b0: 20 6b 65 79 22 2c 20 28 63 68 61 72 20 2a 29 20   key", (char *) 
19c0: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72  NULL);..goto err
19d0: 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  or;.    }..    /
19e0: 2a 20 43 72 65 61 74 65 20 63 6f 6e 74 65 78 74  * Create context
19f0: 20 2a 2f 0a 20 20 20 20 70 63 74 78 20 3d 20 45   */.    pctx = E
1a00: 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 5f  VP_PKEY_CTX_new_
1a10: 69 64 28 45 56 50 5f 50 4b 45 59 5f 48 4b 44 46  id(EVP_PKEY_HKDF
1a20: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
1a30: 28 70 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (pctx == NULL) {
1a40: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
1a50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f  lt(interp, "Memo
1a60: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
1a70: 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ror", (char *) N
1a80: 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f  ULL);..goto erro
1a90: 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
1aa0: 20 28 45 56 50 5f 50 4b 45 59 5f 64 65 72 69 76   (EVP_PKEY_deriv
1ab0: 65 5f 69 6e 69 74 28 70 63 74 78 29 20 3c 20 31  e_init(pctx) < 1
1ac0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
1ad0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49  esult(interp, "I
1ae0: 6e 69 74 69 61 6c 69 7a 65 20 66 61 69 6c 65 64  nitialize failed
1af0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
1b00: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
1b10: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72  NULL);..goto err
1b20: 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  or;.    }..    /
1b30: 2a 20 53 65 74 20 63 6f 6e 66 69 67 20 70 61 72  * Set config par
1b40: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 69  ameters */.    i
1b50: 66 20 28 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f  f (EVP_PKEY_CTX_
1b60: 73 65 74 5f 68 6b 64 66 5f 6d 64 28 70 63 74 78  set_hkdf_md(pctx
1b70: 2c 20 6d 64 29 20 3c 20 31 29 20 7b 0a 09 54 63  , md) < 1) {..Tc
1b80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1b90: 6e 74 65 72 70 2c 20 22 53 65 74 20 64 69 67 65  nterp, "Set dige
1ba0: 73 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45  st failed: ", GE
1bb0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
1bc0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
1bd0: 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20  .goto error;.   
1be0: 20 7d 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50   }.    if (EVP_P
1bf0: 4b 45 59 5f 43 54 58 5f 73 65 74 31 5f 68 6b 64  KEY_CTX_set1_hkd
1c00: 66 5f 6b 65 79 28 70 63 74 78 2c 20 6b 65 79 2c  f_key(pctx, key,
1c10: 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 29 20   (int) key_len) 
1c20: 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  < 1) {..Tcl_Appe
1c30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1c40: 20 22 53 65 74 20 6b 65 79 20 66 61 69 6c 65 64   "Set key failed
1c50: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
1c60: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
1c70: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72  NULL);..goto err
1c80: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
1c90: 20 28 73 61 6c 74 20 21 3d 20 4e 55 4c 4c 20 26   (salt != NULL &
1ca0: 26 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73  & EVP_PKEY_CTX_s
1cb0: 65 74 31 5f 68 6b 64 66 5f 73 61 6c 74 28 70 63  et1_hkdf_salt(pc
1cc0: 74 78 2c 20 73 61 6c 74 2c 20 28 69 6e 74 29 20  tx, salt, (int) 
1cd0: 73 61 6c 74 5f 6c 65 6e 29 20 3c 20 31 29 20 7b  salt_len) < 1) {
1ce0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
1cf0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
1d00: 73 61 6c 74 20 66 61 69 6c 65 64 3a 20 22 2c 20  salt failed: ", 
1d10: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
1d20: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
1d30: 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20  ;..goto error;. 
1d40: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 69 6e 66     }.    if (inf
1d50: 6f 20 21 3d 20 4e 55 4c 4c 20 26 26 20 45 56 50  o != NULL && EVP
1d60: 5f 50 4b 45 59 5f 43 54 58 5f 61 64 64 31 5f 68  _PKEY_CTX_add1_h
1d70: 6b 64 66 5f 69 6e 66 6f 28 70 63 74 78 2c 20 69  kdf_info(pctx, i
1d80: 6e 66 6f 2c 20 28 69 6e 74 29 20 69 6e 66 6f 5f  nfo, (int) info_
1d90: 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c  len) < 1) {..Tcl
1da0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1db0: 74 65 72 70 2c 20 22 53 65 74 20 69 6e 66 6f 20  terp, "Set info 
1dc0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
1dd0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
1de0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f  ar *) NULL);..go
1df0: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to error;.    }.
1e00: 0a 20 20 20 20 2f 2a 20 47 65 74 20 62 75 66 66  .    /* Get buff
1e10: 65 72 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74  er */.    result
1e20: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Obj = Tcl_NewObj
1e30: 28 29 3b 0a 20 20 20 20 69 66 20 28 28 6f 75 74  ();.    if ((out
1e40: 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72   = Tcl_SetByteAr
1e50: 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74  rayLength(result
1e60: 4f 62 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  Obj, (Tcl_Size) 
1e70: 64 6b 5f 6c 65 6e 29 29 20 3d 3d 20 4e 55 4c 4c  dk_len)) == NULL
1e80: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
1e90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d  esult(interp, "M
1ea0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1eb0: 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a   error", (char *
1ec0: 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65  ) NULL);..goto e
1ed0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
1ee0: 6f 75 74 5f 6c 65 6e 20 3d 20 28 73 69 7a 65 5f  out_len = (size_
1ef0: 74 29 20 64 6b 5f 6c 65 6e 3b 0a 0a 20 20 20 20  t) dk_len;..    
1f00: 2f 2a 20 44 65 72 69 76 65 20 6b 65 79 20 2a 2f  /* Derive key */
1f10: 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45  .    if (EVP_PKE
1f20: 59 5f 64 65 72 69 76 65 28 70 63 74 78 2c 20 6f  Y_derive(pctx, o
1f30: 75 74 2c 20 26 6f 75 74 5f 6c 65 6e 29 20 3e 20  ut, &out_len) > 
1f40: 30 29 20 7b 0a 09 2f 2a 20 53 68 72 69 6e 6b 20  0) {../* Shrink 
1f50: 62 75 66 66 65 72 20 74 6f 20 61 63 74 75 61 6c  buffer to actual
1f60: 20 73 69 7a 65 20 2a 2f 0a 09 54 63 6c 5f 53 65   size */..Tcl_Se
1f70: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68  tByteArrayLength
1f80: 28 72 65 73 75 6c 74 4f 62 6a 2c 20 28 54 63 6c  (resultObj, (Tcl
1f90: 5f 53 69 7a 65 29 20 6f 75 74 5f 6c 65 6e 29 3b  _Size) out_len);
1fa0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
1fb0: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  lt(interp, resul
1fc0: 74 4f 62 6a 29 3b 0a 09 72 65 73 20 3d 20 54 43  tObj);..res = TC
1fd0: 4c 5f 4f 4b 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65  L_OK;..goto done
1fe0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1ff0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2000: 28 69 6e 74 65 72 70 2c 20 22 4b 65 79 20 64 65  (interp, "Key de
2010: 72 69 76 61 74 69 6f 6e 20 66 61 69 6c 65 64 3a  rivation failed:
2020: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
2030: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
2040: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52  ULL);..Tcl_DecrR
2050: 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62  efCount(resultOb
2060: 6a 29 3b 0a 20 20 20 20 7d 0a 0a 65 72 72 6f 72  j);.    }..error
2070: 3a 0a 20 20 20 20 72 65 73 20 3d 20 54 43 4c 5f  :.    res = TCL_
2080: 45 52 52 4f 52 3b 0a 64 6f 6e 65 3a 0a 20 20 20  ERROR;.done:.   
2090: 20 69 66 20 28 70 63 74 78 20 21 3d 20 4e 55 4c   if (pctx != NUL
20a0: 4c 29 20 7b 0a 09 45 56 50 5f 50 4b 45 59 5f 43  L) {..EVP_PKEY_C
20b0: 54 58 5f 66 72 65 65 28 70 63 74 78 29 3b 0a 20  TX_free(pctx);. 
20c0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
20d0: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  res;.}../*. *---
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2120: 0a 20 2a 0a 20 2a 20 4b 44 46 5f 53 63 72 79 70  . *. * KDF_Scryp
2130: 74 20 2d 2d 0a 20 2a 0a 20 2a 09 48 4d 41 43 2d  t --. *. *.HMAC-
2140: 62 61 73 65 64 20 45 78 74 72 61 63 74 2d 61 6e  based Extract-an
2150: 64 2d 45 78 70 61 6e 64 20 4b 65 79 20 44 65 72  d-Expand Key Der
2160: 69 76 61 74 69 6f 6e 20 46 75 6e 63 74 69 6f 6e  ivation Function
2170: 20 28 48 4b 44 46 29 2e 0a 20 2a 09 53 65 65 20   (HKDF).. *.See 
2180: 52 46 43 20 35 38 36 39 20 61 6e 64 20 52 46 43  RFC 5869 and RFC
2190: 20 37 39 31 34 2e 0a 20 2a 0a 20 2a 20 52 65 74   7914.. *. * Ret
21a0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
21b0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
21c0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
21d0: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20  . *.Sets result 
21e0: 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 6b 65 79  to a list of key
21f0: 20 61 6e 64 20 69 76 20 76 61 6c 75 65 73 2c 20   and iv values, 
2200: 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  or an error mess
2210: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  age. *. *-------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
2260: 0a 73 74 61 74 69 63 20 69 6e 74 20 4b 44 46 5f  .static int KDF_
2270: 53 63 72 79 70 74 28 43 6c 69 65 6e 74 44 61 74  Scrypt(ClientDat
2280: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
2290: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
22a0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
22b0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
22c0: 5d 29 20 7b 0a 20 20 20 20 45 56 50 5f 50 4b 45  ]) {.    EVP_PKE
22d0: 59 5f 43 54 58 20 2a 70 63 74 78 20 3d 20 4e 55  Y_CTX *pctx = NU
22e0: 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  LL;.    unsigned
22f0: 20 63 68 61 72 20 2a 73 61 6c 74 20 3d 20 4e 55   char *salt = NU
2300: 4c 4c 2c 20 2a 70 61 73 73 20 3d 20 4e 55 4c 4c  LL, *pass = NULL
2310: 2c 20 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 20  , *out = NULL;. 
2320: 20 20 20 54 63 6c 5f 53 69 7a 65 20 73 61 6c 74     Tcl_Size salt
2330: 5f 6c 65 6e 20 3d 20 30 2c 20 70 61 73 73 5f 6c  _len = 0, pass_l
2340: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  en = 0;.    int 
2350: 64 6b 5f 6c 65 6e 20 3d 20 36 34 2c 20 72 65 73  dk_len = 64, res
2360: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 54   = TCL_OK;.    T
2370: 63 6c 5f 53 69 7a 65 20 66 6e 3b 0a 20 20 20 20  cl_Size fn;.    
2380: 75 69 6e 74 36 34 5f 74 20 4e 20 3d 20 30 2c 20  uint64_t N = 0, 
2390: 70 20 3d 20 30 2c 20 72 20 3d 20 30 2c 20 6d 61  p = 0, r = 0, ma
23a0: 78 6d 65 6d 20 3d 20 30 3b 0a 20 20 20 20 73 69  xmem = 0;.    si
23b0: 7a 65 5f 74 20 6f 75 74 5f 6c 65 6e 3b 0a 20 20  ze_t out_len;.  
23c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
23d0: 74 4f 62 6a 3b 0a 20 20 20 20 28 76 6f 69 64 29  tObj;.    (void)
23e0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
23f0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
2400: 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65  d");..    /* Cle
2410: 61 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  ar errors */.   
2420: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
2430: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 52  (interp);.    ER
2440: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
2450: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74  ..    /* Validat
2460: 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20  e arg count */. 
2470: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 35 20     if (objc < 5 
2480: 7c 7c 20 6f 62 6a 63 20 3e 20 31 33 29 20 7b 0a  || objc > 13) {.
2490: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
24a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
24b0: 76 2c 20 22 2d 70 61 73 73 77 6f 72 64 20 73 74  v, "-password st
24c0: 72 69 6e 67 20 2d 73 61 6c 74 20 73 74 72 69 6e  ring -salt strin
24d0: 67 20 3f 2d 4e 20 63 6f 73 74 50 61 72 61 6d 65  g ?-N costParame
24e0: 74 65 72 3f 20 3f 2d 72 20 62 6c 6f 63 6b 53 69  ter? ?-r blockSi
24f0: 7a 65 3f 20 3f 2d 70 20 70 61 72 61 6c 6c 65 6c  ze? ?-p parallel
2500: 69 7a 61 74 69 6f 6e 3f 20 3f 2d 73 69 7a 65 20  ization? ?-size 
2510: 64 65 72 69 76 65 64 5f 6c 65 6e 67 74 68 3f 22  derived_length?"
2520: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
2530: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
2540: 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 20   /* Get options 
2550: 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 6e 74 20  */.    for (int 
2560: 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 6f  idx = 1; idx < o
2570: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 2f  bjc; idx++) {../
2580: 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a  * Get option */.
2590: 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65  .if (Tcl_GetInde
25a0: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
25b0: 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f 6d 6d   objv[idx], comm
25c0: 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74 69 6f  and_opts, "optio
25d0: 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20 54  n", 0, &fn) != T
25e0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65  CL_OK) {..    re
25f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2600: 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61 74 65  .}.../* Validate
2610: 20 61 72 67 20 68 61 73 20 61 20 76 61 6c 75 65   arg has a value
2620: 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20 3e   */..if (++idx >
2630: 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20 54  = objc) {..    T
2640: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2650: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c 75  interp, "No valu
2660: 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22 22  e for option \""
2670: 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66  , command_opts[f
2680: 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20  n], "\"", (char 
2690: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
26a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26b0: 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29  ..}...switch(fn)
26c0: 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65   {..case _opt_ke
26d0: 79 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 70 61  y:..case _opt_pa
26e0: 73 73 77 6f 72 64 3a 0a 09 20 20 20 20 47 45 54  ssword:..    GET
26f0: 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28  _OPT_BYTE_ARRAY(
2700: 6f 62 6a 76 5b 69 64 78 5d 2c 20 70 61 73 73 2c  objv[idx], pass,
2710: 20 26 70 61 73 73 5f 6c 65 6e 29 3b 0a 09 20 20   &pass_len);..  
2720: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
2730: 6f 70 74 5f 73 61 6c 74 3a 0a 09 20 20 20 20 47  opt_salt:..    G
2740: 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41  ET_OPT_BYTE_ARRA
2750: 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 61 6c  Y(objv[idx], sal
2760: 74 2c 20 26 73 61 6c 74 5f 6c 65 6e 29 3b 0a 09  t, &salt_len);..
2770: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
2780: 20 5f 6f 70 74 5f 6c 65 6e 67 74 68 3a 0a 09 63   _opt_length:..c
2790: 61 73 65 20 5f 6f 70 74 5f 73 69 7a 65 3a 0a 09  ase _opt_size:..
27a0: 20 20 20 20 69 66 20 28 55 74 69 6c 5f 47 65 74      if (Util_Get
27b0: 49 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Int(interp, objv
27c0: 5b 69 64 78 5d 2c 20 26 64 6b 5f 6c 65 6e 2c 20  [idx], &dk_len, 
27d0: 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d  command_opts[fn]
27e0: 2c 20 31 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f  , 1, 0) != TCL_O
27f0: 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 65 72 72 6f  K) {...goto erro
2800: 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62  r;..    }..    b
2810: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
2820: 5f 4e 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6e  _N:..case _opt_n
2830: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 57  :..    GET_OPT_W
2840: 49 44 45 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  IDE(objv[idx], &
2850: 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  N);..    break;.
2860: 09 63 61 73 65 20 5f 6f 70 74 5f 72 3a 0a 09 20  .case _opt_r:.. 
2870: 20 20 20 47 45 54 5f 4f 50 54 5f 57 49 44 45 28     GET_OPT_WIDE(
2880: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 72 29 3b 0a  objv[idx], &r);.
2890: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
28a0: 65 20 5f 6f 70 74 5f 70 3a 0a 09 20 20 20 20 47  e _opt_p:..    G
28b0: 45 54 5f 4f 50 54 5f 57 49 44 45 28 6f 62 6a 76  ET_OPT_WIDE(objv
28c0: 5b 69 64 78 5d 2c 20 26 70 29 3b 0a 09 20 20 20  [idx], &p);..   
28d0: 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d   break;..}.    }
28e0: 0a 0a 20 20 20 20 69 66 20 28 70 61 73 73 20 3d  ..    if (pass =
28f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
2900: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2910: 72 70 2c 20 22 6e 6f 20 70 61 73 73 77 6f 72 64  rp, "no password
2920: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
2930: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
2940: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
2950: 20 69 66 20 28 73 61 6c 74 20 3d 3d 20 4e 55 4c   if (salt == NUL
2960: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
2970: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2980: 6e 6f 20 73 61 6c 74 22 2c 20 28 63 68 61 72 20  no salt", (char 
2990: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
29a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
29b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
29c0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  e context */.   
29d0: 20 70 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59   pctx = EVP_PKEY
29e0: 5f 43 54 58 5f 6e 65 77 5f 69 64 28 45 56 50 5f  _CTX_new_id(EVP_
29f0: 50 4b 45 59 5f 53 43 52 59 50 54 2c 20 4e 55 4c  PKEY_SCRYPT, NUL
2a00: 4c 29 3b 0a 20 20 20 20 69 66 20 28 70 63 74 78  L);.    if (pctx
2a10: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
2a20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2a30: 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c  terp, "Memory al
2a40: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c  location error",
2a50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
2a60: 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20  ..goto error;.  
2a70: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 45 56 50    }..    if (EVP
2a80: 5f 50 4b 45 59 5f 64 65 72 69 76 65 5f 69 6e 69  _PKEY_derive_ini
2a90: 74 28 70 63 74 78 29 20 3c 20 31 29 20 7b 0a 09  t(pctx) < 1) {..
2aa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2ab0: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61  (interp, "Initia
2ac0: 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  lize failed: ", 
2ad0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
2ae0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
2af0: 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20  ;..goto error;. 
2b00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
2b10: 20 63 6f 6e 66 69 67 20 70 61 72 61 6d 65 74 65   config paramete
2b20: 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 56  rs */.    if (EV
2b30: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 31 5f  P_PKEY_CTX_set1_
2b40: 70 62 65 5f 70 61 73 73 28 70 63 74 78 2c 20 70  pbe_pass(pctx, p
2b50: 61 73 73 2c 20 28 69 6e 74 29 20 70 61 73 73 5f  ass, (int) pass_
2b60: 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c  len) < 1) {..Tcl
2b70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2b80: 74 65 72 70 2c 20 22 53 65 74 20 6b 65 79 20 66  terp, "Set key f
2b90: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
2ba0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
2bb0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74  r *) NULL);..got
2bc0: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  o error;.    }. 
2bd0: 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45 59 5f     if (EVP_PKEY_
2be0: 43 54 58 5f 73 65 74 31 5f 73 63 72 79 70 74 5f  CTX_set1_scrypt_
2bf0: 73 61 6c 74 28 70 63 74 78 2c 20 73 61 6c 74 2c  salt(pctx, salt,
2c00: 20 28 69 6e 74 29 20 73 61 6c 74 5f 6c 65 6e 29   (int) salt_len)
2c10: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70   < 1) {..Tcl_App
2c20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2c30: 2c 20 22 53 65 74 20 73 61 6c 74 20 66 61 69 6c  , "Set salt fail
2c40: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  ed: ", GET_ERR_R
2c50: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
2c60: 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65  ) NULL);..goto e
2c70: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
2c80: 69 66 20 28 4e 20 21 3d 20 30 20 26 26 20 45 56  if (N != 0 && EV
2c90: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73  P_PKEY_CTX_set_s
2ca0: 63 72 79 70 74 5f 4e 28 70 63 74 78 2c 20 4e 29  crypt_N(pctx, N)
2cb0: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70   < 1) {..Tcl_App
2cc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2cd0: 2c 20 22 53 65 74 20 63 6f 73 74 20 70 61 72 61  , "Set cost para
2ce0: 6d 65 74 65 72 20 28 4e 29 20 66 61 69 6c 65 64  meter (N) failed
2cf0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
2d00: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
2d10: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72  NULL);..goto err
2d20: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
2d30: 20 28 72 20 21 3d 20 30 20 26 26 20 45 56 50 5f   (r != 0 && EVP_
2d40: 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 63 72  PKEY_CTX_set_scr
2d50: 79 70 74 5f 72 28 70 63 74 78 2c 20 72 29 20 3c  ypt_r(pctx, r) <
2d60: 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e   1) {..Tcl_Appen
2d70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2d80: 22 53 65 74 20 6c 6f 63 6b 20 73 69 7a 65 20 70  "Set lock size p
2d90: 61 72 61 6d 65 74 65 72 20 28 72 29 20 66 61 69  arameter (r) fai
2da0: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
2db0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
2dc0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20  *) NULL);..goto 
2dd0: 65 72 72 6f 72 3b 0a 20 20 20 7d 0a 20 20 20 20  error;.   }.    
2de0: 69 66 20 28 70 20 21 3d 20 30 20 26 26 20 45 56  if (p != 0 && EV
2df0: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73  P_PKEY_CTX_set_s
2e00: 63 72 79 70 74 5f 70 28 70 63 74 78 2c 20 70 29  crypt_p(pctx, p)
2e10: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70   < 1) {..Tcl_App
2e20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2e30: 2c 20 22 53 65 74 20 50 61 72 61 6c 6c 65 6c 69  , "Set Paralleli
2e40: 7a 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  zation parameter
2e50: 20 28 70 29 20 66 61 69 6c 65 64 3a 20 22 2c 20   (p) failed: ", 
2e60: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
2e70: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
2e80: 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20  ;..goto error;. 
2e90: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6d 61 78     }.    if (max
2ea0: 6d 65 6d 20 21 3d 20 30 20 26 26 20 45 56 50 5f  mem != 0 && EVP_
2eb0: 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 63 72  PKEY_CTX_set_scr
2ec0: 79 70 74 5f 6d 61 78 6d 65 6d 5f 62 79 74 65 73  ypt_maxmem_bytes
2ed0: 28 70 63 74 78 2c 20 6d 61 78 6d 65 6d 29 20 3c  (pctx, maxmem) <
2ee0: 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e   1) {..Tcl_Appen
2ef0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2f00: 22 53 65 74 20 6d 61 78 20 6d 65 6d 6f 72 79 20  "Set max memory 
2f10: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
2f20: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
2f30: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f  ar *) NULL);..go
2f40: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to error;.    }.
2f50: 0a 20 20 20 20 2f 2a 20 47 65 74 20 62 75 66 66  .    /* Get buff
2f60: 65 72 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74  er */.    result
2f70: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Obj = Tcl_NewObj
2f80: 28 29 3b 0a 20 20 20 20 69 66 20 28 28 6f 75 74  ();.    if ((out
2f90: 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72   = Tcl_SetByteAr
2fa0: 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74  rayLength(result
2fb0: 4f 62 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  Obj, (Tcl_Size) 
2fc0: 64 6b 5f 6c 65 6e 29 29 20 3d 3d 20 4e 55 4c 4c  dk_len)) == NULL
2fd0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
2fe0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d  esult(interp, "M
2ff0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3000: 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a   error", (char *
3010: 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65  ) NULL);..goto e
3020: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
3030: 6f 75 74 5f 6c 65 6e 20 3d 20 28 73 69 7a 65 5f  out_len = (size_
3040: 74 29 20 64 6b 5f 6c 65 6e 3b 0a 0a 20 20 20 20  t) dk_len;..    
3050: 2f 2a 20 44 65 72 69 76 65 20 6b 65 79 20 2a 2f  /* Derive key */
3060: 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50 4b 45  .    if (EVP_PKE
3070: 59 5f 64 65 72 69 76 65 28 70 63 74 78 2c 20 6f  Y_derive(pctx, o
3080: 75 74 2c 20 26 6f 75 74 5f 6c 65 6e 29 20 3e 20  ut, &out_len) > 
3090: 30 29 20 7b 0a 09 2f 2a 20 53 68 72 69 6e 6b 20  0) {../* Shrink 
30a0: 62 75 66 66 65 72 20 74 6f 20 61 63 74 75 61 6c  buffer to actual
30b0: 20 73 69 7a 65 20 2a 2f 0a 09 54 63 6c 5f 53 65   size */..Tcl_Se
30c0: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68  tByteArrayLength
30d0: 28 72 65 73 75 6c 74 4f 62 6a 2c 20 28 54 63 6c  (resultObj, (Tcl
30e0: 5f 53 69 7a 65 29 20 6f 75 74 5f 6c 65 6e 29 3b  _Size) out_len);
30f0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
3100: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  lt(interp, resul
3110: 74 4f 62 6a 29 3b 0a 09 67 6f 74 6f 20 64 6f 6e  tObj);..goto don
3120: 65 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e;..    } else {
3130: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
3140: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4b 65 79 20  lt(interp, "Key 
3150: 64 65 72 69 76 61 74 69 6f 6e 20 66 61 69 6c 65  derivation faile
3160: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
3170: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
3180: 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 44 65 63   NULL);..Tcl_Dec
3190: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74  rRefCount(result
31a0: 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 0a 65 72 72  Obj);.    }..err
31b0: 6f 72 3a 0a 20 20 20 20 72 65 73 20 3d 20 54 43  or:.    res = TC
31c0: 4c 5f 45 52 52 4f 52 3b 0a 0a 64 6f 6e 65 3a 0a  L_ERROR;..done:.
31d0: 20 20 20 20 69 66 20 28 70 63 74 78 20 21 3d 20      if (pctx != 
31e0: 4e 55 4c 4c 29 20 7b 0a 09 45 56 50 5f 50 4b 45  NULL) {..EVP_PKE
31f0: 59 5f 43 54 58 5f 66 72 65 65 28 70 63 74 78 29  Y_CTX_free(pctx)
3200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
3210: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  rn res;.}../*. *
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3260: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 4b 65  ---. *. * Tls_Ke
3270: 79 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a  yCommands --. *.
3280: 20 2a 09 43 72 65 61 74 65 20 6b 65 79 20 63 6f   *.Create key co
3290: 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 74  mmands. *. * Ret
32a0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20  urns:. *.TCL_OK 
32b0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a  or TCL_ERROR. *.
32c0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
32d0: 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d 6d  . *.Creates comm
32e0: 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ands. *. *------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3330: 2f 0a 69 6e 74 20 54 6c 73 5f 4b 44 46 43 6f 6d  /.int Tls_KDFCom
3340: 6d 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65 72 70  mands(Tcl_Interp
3350: 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
3360: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
3370: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
3380: 73 3a 3a 68 6b 64 66 22 2c 20 4b 44 46 5f 48 4b  s::hkdf", KDF_HK
3390: 44 46 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  DF, (ClientData)
33a0: 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
33b0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
33c0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
33d0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
33e0: 65 72 70 2c 20 22 74 6c 73 3a 3a 70 62 6b 64 66  erp, "tls::pbkdf
33f0: 32 22 2c 20 4b 44 46 5f 50 42 4b 44 46 32 2c 20  2", KDF_PBKDF2, 
3400: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
3410: 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
3420: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
3430: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
3440: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
3450: 20 22 74 6c 73 3a 3a 73 63 72 79 70 74 22 2c 20   "tls::scrypt", 
3460: 4b 44 46 5f 53 63 72 79 70 74 2c 20 28 43 6c 69  KDF_Scrypt, (Cli
3470: 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
3480: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
3490: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
34a0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
34b0: 0a 0a                                            ..