Hex Artifact Content

Artifact 9456e8167ef9cfce7437b9a134907163de07b105dea9925e7e3a6dbca4fec94c:


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 0a 20 2a 20 47 65 74 20 63  **/../*. * Get c
0130: 69 70 68 65 72 0a 20 2a 2f 0a 45 56 50 5f 43 49  ipher. */.EVP_CI
0140: 50 48 45 52 20 2a 55 74 69 6c 5f 47 65 74 43 69  PHER *Util_GetCi
0150: 70 68 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20  pher(Tcl_Interp 
0160: 2a 69 6e 74 65 72 70 2c 20 63 68 61 72 20 2a 6e  *interp, char *n
0170: 61 6d 65 2c 20 69 6e 74 20 65 78 69 73 74 29 20  ame, int exist) 
0180: 7b 0a 20 20 20 20 45 56 50 5f 43 49 50 48 45 52  {.    EVP_CIPHER
0190: 20 2a 63 69 70 68 65 72 20 3d 20 4e 55 4c 4c 3b   *cipher = NULL;
01a0: 0a 0a 20 20 20 20 69 66 20 28 6e 61 6d 65 20 21  ..    if (name !
01b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 69 70 68 65  = NULL) {..ciphe
01c0: 72 20 3d 20 45 56 50 5f 67 65 74 5f 63 69 70 68  r = EVP_get_ciph
01d0: 65 72 62 79 6e 61 6d 65 28 6e 61 6d 65 29 3b 0a  erbyname(name);.
01e0: 09 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20 4e  .if (cipher == N
01f0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
0200: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0210: 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 63 69  erp, "Invalid ci
0220: 70 68 65 72 3a 20 5c 22 22 2c 20 6e 61 6d 65 2c  pher: \"", name,
0230: 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 7d   "\"", NULL);..}
0240: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
0250: 65 78 69 73 74 29 20 7b 0a 09 54 63 6c 5f 41 70  exist) {..Tcl_Ap
0260: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
0270: 70 2c 20 22 4e 6f 20 63 69 70 68 65 72 20 73 70  p, "No cipher sp
0280: 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b  ecified", NULL);
0290: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
02a0: 6e 20 63 69 70 68 65 72 3b 0a 7d 0a 0a 2f 2a 0a  n cipher;.}../*.
02b0: 20 2a 20 47 65 74 20 6d 65 73 73 61 67 65 20 64   * Get message d
02c0: 69 67 65 73 74 0a 20 2a 2f 0a 45 56 50 5f 4d 44  igest. */.EVP_MD
02d0: 20 2a 55 74 69 6c 5f 47 65 74 44 69 67 65 73 74   *Util_GetDigest
02e0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
02f0: 65 72 70 2c 20 63 68 61 72 20 2a 6e 61 6d 65 2c  erp, char *name,
0300: 20 69 6e 74 20 65 78 69 73 74 29 20 7b 0a 20 20   int exist) {.  
0310: 20 20 45 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e    EVP_MD *md = N
0320: 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 6e 61  ULL;..    if (na
0330: 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d  me != NULL) {..m
0340: 64 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65  d = EVP_get_dige
0350: 73 74 62 79 6e 61 6d 65 28 6e 61 6d 65 29 3b 0a  stbyname(name);.
0360: 09 69 66 20 28 6d 64 20 3d 3d 20 4e 55 4c 4c 29  .if (md == NULL)
0370: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
0380: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0390: 20 22 49 6e 76 61 6c 69 64 20 64 69 67 65 73 74   "Invalid digest
03a0: 3a 20 5c 22 22 2c 20 6e 61 6d 65 2c 20 22 5c 22  : \"", name, "\"
03b0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 20 20 20  ", NULL);..}.   
03c0: 20 7d 20 65 6c 73 65 20 69 66 20 28 65 78 69 73   } else if (exis
03d0: 74 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  t) {..Tcl_Append
03e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
03f0: 4e 6f 20 64 69 67 65 73 74 20 73 70 65 63 69 66  No digest specif
0400: 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ied", NULL);.   
0410: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 64   }.    return md
0420: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
0430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f  *********/../* O
0470: 70 74 69 6f 6e 73 20 66 6f 72 20 4b 44 46 20 63  ptions for KDF c
0480: 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 0a 73 74 61 74  ommands */..stat
0490: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
04a0: 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20 5b 5d 20 3d  ommand_opts [] =
04b0: 20 7b 0a 20 20 20 20 22 2d 63 69 70 68 65 72 22   {.    "-cipher"
04c0: 2c 20 22 2d 64 69 67 65 73 74 22 2c 20 22 2d 68  , "-digest", "-h
04d0: 61 73 68 22 2c 20 22 2d 69 6e 66 6f 22 2c 20 22  ash", "-info", "
04e0: 2d 69 74 65 72 61 74 69 6f 6e 73 22 2c 20 22 2d  -iterations", "-
04f0: 6b 65 79 22 2c 20 22 2d 6c 65 6e 67 74 68 22 2c  key", "-length",
0500: 20 22 2d 70 61 73 73 77 6f 72 64 22 2c 0a 20 20   "-password",.  
0510: 20 20 22 2d 73 61 6c 74 22 2c 20 22 2d 73 69 7a    "-salt", "-siz
0520: 65 22 2c 20 22 2d 4e 22 2c 20 22 2d 6e 22 2c 20  e", "-N", "-n", 
0530: 22 2d 72 22 2c 20 22 2d 70 22 2c 20 4e 55 4c 4c  "-r", "-p", NULL
0540: 7d 3b 0a 0a 65 6e 75 6d 20 5f 63 6f 6d 6d 61 6e  };..enum _comman
0550: 64 5f 6f 70 74 73 20 7b 0a 20 20 20 20 5f 6f 70  d_opts {.    _op
0560: 74 5f 63 69 70 68 65 72 2c 20 5f 6f 70 74 5f 64  t_cipher, _opt_d
0570: 69 67 65 73 74 2c 20 5f 6f 70 74 5f 68 61 73 68  igest, _opt_hash
0580: 2c 20 5f 6f 70 74 5f 69 6e 66 6f 2c 20 5f 6f 70  , _opt_info, _op
0590: 74 5f 69 74 65 72 2c 20 5f 6f 70 74 5f 6b 65 79  t_iter, _opt_key
05a0: 2c 20 5f 6f 70 74 5f 6c 65 6e 67 74 68 2c 0a 20  , _opt_length,. 
05b0: 20 20 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72 64     _opt_password
05c0: 2c 20 5f 6f 70 74 5f 73 61 6c 74 2c 20 5f 6f 70  , _opt_salt, _op
05d0: 74 5f 73 69 7a 65 2c 20 5f 6f 70 74 5f 4e 2c 20  t_size, _opt_N, 
05e0: 5f 6f 70 74 5f 6e 2c 20 5f 6f 70 74 5f 72 2c 20  _opt_n, _opt_r, 
05f0: 5f 6f 70 74 5f 70 0a 7d 3b 0a 0a 2f 2a 0a 20 2a  _opt_p.};../*. *
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0640: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 44 46 5f 50 42  ---. *. * KDF_PB
0650: 4b 44 46 32 20 2d 2d 0a 20 2a 0a 20 2a 09 50 4b  KDF2 --. *. *.PK
0660: 43 53 35 5f 50 42 4b 44 46 32 5f 48 4d 41 43 20  CS5_PBKDF2_HMAC 
0670: 6b 65 79 20 64 65 72 69 76 61 74 69 6f 6e 20 66  key derivation f
0680: 75 6e 63 74 69 6f 6e 20 28 4b 44 46 29 20 73 70  unction (KDF) sp
0690: 65 63 69 66 69 65 64 20 62 79 20 50 4b 43 53 20  ecified by PKCS 
06a0: 23 35 2e 0a 20 2a 09 4b 44 46 73 20 69 6e 63 6c  #5.. *.KDFs incl
06b0: 75 64 65 20 50 42 4b 44 46 32 20 66 72 6f 6d 20  ude PBKDF2 from 
06c0: 52 46 43 20 32 38 39 38 2f 38 30 31 38 20 61 6e  RFC 2898/8018 an
06d0: 64 20 53 63 72 79 70 74 20 66 72 6f 6d 20 52 46  d Scrypt from RF
06e0: 43 20 37 39 31 34 2e 0a 20 2a 0a 20 2a 20 52 65  C 7914.. *. * Re
06f0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
0700: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
0710: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
0720: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74  :. *.Sets result
0730: 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 6b 65   to a list of ke
0740: 79 20 61 6e 64 20 69 76 20 76 61 6c 75 65 73 2c  y and iv values,
0750: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   or an error mes
0760: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  sage. *. *------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
07b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 4b 44 46  /.static int KDF
07c0: 5f 50 42 4b 44 46 32 28 43 6c 69 65 6e 74 44 61  _PBKDF2(ClientDa
07d0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
07e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
07f0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
0800: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
0810: 5b 5d 29 20 7b 0a 20 20 20 20 69 6e 74 20 70 61  []) {.    int pa
0820: 73 73 5f 6c 65 6e 20 3d 20 30 2c 20 73 61 6c 74  ss_len = 0, salt
0830: 5f 6c 65 6e 20 3d 20 30 2c 20 66 6e 3b 0a 20 20  _len = 0, fn;.  
0840: 20 20 69 6e 74 20 69 6b 6c 65 6e 2c 20 69 76 6c    int iklen, ivl
0850: 65 6e 2c 20 69 74 65 72 20 3d 20 31 3b 0a 20 20  en, iter = 1;.  
0860: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0870: 2a 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c  *password = NULL
0880: 2c 20 2a 73 61 6c 74 20 3d 20 4e 55 4c 4c 3b 0a  , *salt = NULL;.
0890: 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44      const EVP_MD
08a0: 20 2a 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20   *md = NULL;.   
08b0: 20 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45   const EVP_CIPHE
08c0: 52 20 2a 63 69 70 68 65 72 20 3d 20 4e 55 4c 4c  R *cipher = NULL
08d0: 3b 0a 20 20 20 20 69 6e 74 20 62 75 66 5f 6c 65  ;.    int buf_le
08e0: 6e 20 3d 20 28 45 56 50 5f 4d 41 58 5f 4b 45 59  n = (EVP_MAX_KEY
08f0: 5f 4c 45 4e 47 54 48 20 2b 20 45 56 50 5f 4d 41  _LENGTH + EVP_MA
0900: 58 5f 49 56 5f 4c 45 4e 47 54 48 29 2a 34 2c 20  X_IV_LENGTH)*4, 
0910: 64 6b 5f 6c 65 6e 20 3d 20 62 75 66 5f 6c 65 6e  dk_len = buf_len
0920: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
0930: 68 61 72 20 74 6d 70 6b 65 79 69 76 5b 28 45 56  har tmpkeyiv[(EV
0940: 50 5f 4d 41 58 5f 4b 45 59 5f 4c 45 4e 47 54 48  P_MAX_KEY_LENGTH
0950: 20 2b 20 45 56 50 5f 4d 41 58 5f 49 56 5f 4c 45   + EVP_MAX_IV_LE
0960: 4e 47 54 48 29 2a 34 5d 3b 0a 20 20 20 20 63 68  NGTH)*4];.    ch
0970: 61 72 20 2a 63 69 70 68 65 72 4e 61 6d 65 20 3d  ar *cipherName =
0980: 20 4e 55 4c 4c 2c 20 2a 64 69 67 65 73 74 4e 61   NULL, *digestNa
0990: 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  me = NULL;..    
09a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
09b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72  );..    /* Clear
09c0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54   errors */.    T
09d0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
09e0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 52 52 5f  nterp);.    ERR_
09f0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
0a00: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20      /* Validate 
0a10: 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  arg count */.   
0a20: 20 69 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c 7c   if (objc < 3 ||
0a30: 20 6f 62 6a 63 20 3e 20 31 31 29 20 7b 0a 09 54   objc > 11) {..T
0a40: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
0a50: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
0a60: 20 22 5b 2d 63 69 70 68 65 72 20 63 69 70 68 65   "[-cipher ciphe
0a70: 72 20 7c 20 2d 73 69 7a 65 20 6c 65 6e 67 74 68  r | -size length
0a80: 5d 20 2d 64 69 67 65 73 74 20 64 69 67 65 73 74  ] -digest digest
0a90: 20 3f 2d 69 74 65 72 61 74 69 6f 6e 73 20 63 6f   ?-iterations co
0aa0: 75 6e 74 3f 20 3f 2d 70 61 73 73 77 6f 72 64 20  unt? ?-password 
0ab0: 73 74 72 69 6e 67 3f 20 3f 2d 73 61 6c 74 20 73  string? ?-salt s
0ac0: 74 72 69 6e 67 3f 22 29 3b 0a 09 72 65 74 75 72  tring?");..retur
0ad0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
0ae0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 20   }..    /* Init 
0af0: 62 75 66 66 65 72 73 20 2a 2f 0a 20 20 20 20 6d  buffers */.    m
0b00: 65 6d 73 65 74 28 74 6d 70 6b 65 79 69 76 2c 20  emset(tmpkeyiv, 
0b10: 30 2c 20 62 75 66 5f 6c 65 6e 29 3b 0a 0a 20 20  0, buf_len);..  
0b20: 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73    /* Get options
0b30: 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 6e 74   */.    for (int
0b40: 20 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20   idx = 1; idx < 
0b50: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  objc; idx++) {..
0b60: 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 2a 2f  /* Get option */
0b70: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64  ..if (Tcl_GetInd
0b80: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
0b90: 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f 6d  , objv[idx], com
0ba0: 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74 69  mand_opts, "opti
0bb0: 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20  on", 0, &fn) != 
0bc0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72  TCL_OK) {..    r
0bd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0be0: 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61 74  ..}.../* Validat
0bf0: 65 20 61 72 67 20 68 61 73 20 61 20 76 61 6c 75  e arg has a valu
0c00: 65 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20  e */..if (++idx 
0c10: 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20  >= objc) {..    
0c20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0c30: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c  (interp, "No val
0c40: 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22  ue for option \"
0c50: 22 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b  ", command_opts[
0c60: 66 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72  fn], "\"", (char
0c70: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
0c80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0c90: 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e  ;..}...switch(fn
0ca0: 29 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63  ) {..case _opt_c
0cb0: 69 70 68 65 72 3a 0a 09 20 20 20 20 47 45 54 5f  ipher:..    GET_
0cc0: 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b  OPT_STRING(objv[
0cd0: 69 64 78 5d 2c 20 63 69 70 68 65 72 4e 61 6d 65  idx], cipherName
0ce0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72  , NULL);..    br
0cf0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
0d00: 64 69 67 65 73 74 3a 0a 09 63 61 73 65 20 5f 6f  digest:..case _o
0d10: 70 74 5f 68 61 73 68 3a 0a 09 20 20 20 20 47 45  pt_hash:..    GE
0d20: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a  T_OPT_STRING(obj
0d30: 76 5b 69 64 78 5d 2c 20 64 69 67 65 73 74 4e 61  v[idx], digestNa
0d40: 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  me, NULL);..    
0d50: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
0d60: 74 5f 69 74 65 72 3a 0a 09 20 20 20 20 47 45 54  t_iter:..    GET
0d70: 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64  _OPT_INT(objv[id
0d80: 78 5d 2c 20 26 69 74 65 72 29 3b 0a 09 20 20 20  x], &iter);..   
0d90: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
0da0: 70 74 5f 6b 65 79 3a 0a 09 63 61 73 65 20 5f 6f  pt_key:..case _o
0db0: 70 74 5f 70 61 73 73 77 6f 72 64 3a 0a 09 20 20  pt_password:..  
0dc0: 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41    GET_OPT_BYTE_A
0dd0: 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RRAY(objv[idx], 
0de0: 70 61 73 73 77 6f 72 64 2c 20 26 70 61 73 73 5f  password, &pass_
0df0: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  len);..    break
0e00: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 61 6c  ;..case _opt_sal
0e10: 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  t:..    GET_OPT_
0e20: 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b  BYTE_ARRAY(objv[
0e30: 69 64 78 5d 2c 20 73 61 6c 74 2c 20 26 73 61 6c  idx], salt, &sal
0e40: 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65  t_len);..    bre
0e50: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6c  ak;..case _opt_l
0e60: 65 6e 67 74 68 3a 0a 09 63 61 73 65 20 5f 6f 70  ength:..case _op
0e70: 74 5f 73 69 7a 65 3a 0a 09 20 20 20 20 47 45 54  t_size:..    GET
0e80: 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64  _OPT_INT(objv[id
0e90: 78 5d 2c 20 26 64 6b 5f 6c 65 6e 29 3b 0a 09 20  x], &dk_len);.. 
0ea0: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20     break;..}.   
0eb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64   }..    /* Valid
0ec0: 61 74 65 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20  ate options */. 
0ed0: 20 20 20 69 66 20 28 63 69 70 68 65 72 4e 61 6d     if (cipherNam
0ee0: 65 20 21 3d 20 4e 55 4c 4c 20 26 26 20 28 63 69  e != NULL && (ci
0ef0: 70 68 65 72 20 3d 20 55 74 69 6c 5f 47 65 74 43  pher = Util_GetC
0f00: 69 70 68 65 72 28 69 6e 74 65 72 70 2c 20 63 69  ipher(interp, ci
0f10: 70 68 65 72 4e 61 6d 65 2c 20 30 29 29 20 3d 3d  pherName, 0)) ==
0f20: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
0f30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
0f40: 7d 0a 0a 20 20 20 20 69 66 20 28 28 6d 64 20 3d  }..    if ((md =
0f50: 20 55 74 69 6c 5f 47 65 74 44 69 67 65 73 74 28   Util_GetDigest(
0f60: 69 6e 74 65 72 70 2c 20 64 69 67 65 73 74 4e 61  interp, digestNa
0f70: 6d 65 2c 20 54 52 55 45 29 29 20 3d 3d 20 4e 55  me, TRUE)) == NU
0f80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
0f90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
0fa0: 20 20 20 20 69 66 20 28 69 74 65 72 20 3c 20 31      if (iter < 1
0fb0: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52  ) {..Tcl_SetObjR
0fc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
0fd0: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 49 6e 76  l_ObjPrintf("Inv
0fe0: 61 6c 69 64 20 69 74 65 72 61 74 69 6f 6e 73 20  alid iterations 
0ff0: 63 6f 75 6e 74 20 25 64 3a 20 6d 75 73 74 20 62  count %d: must b
1000: 65 20 3e 20 30 22 2c 20 69 74 65 72 29 29 3b 0a  e > 0", iter));.
1010: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
1020: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
1030: 20 28 64 6b 5f 6c 65 6e 20 3c 20 31 20 7c 7c 20   (dk_len < 1 || 
1040: 64 6b 5f 6c 65 6e 20 3e 20 62 75 66 5f 6c 65 6e  dk_len > buf_len
1050: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52  ) {..Tcl_SetObjR
1060: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1070: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 49 6e 76  l_ObjPrintf("Inv
1080: 61 6c 69 64 20 64 65 72 69 76 65 64 20 6b 65 79  alid derived key
1090: 20 6c 65 6e 67 74 68 20 25 64 3a 20 6d 75 73 74   length %d: must
10a0: 20 62 65 20 30 20 3c 20 73 69 7a 65 20 3c 3d 20   be 0 < size <= 
10b0: 25 64 22 2c 20 64 6b 5f 6c 65 6e 2c 20 62 75 66  %d", dk_len, buf
10c0: 5f 6c 65 6e 29 29 3b 0a 09 72 65 74 75 72 6e 20  _len));..return 
10d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10e0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 6f 75 74  ..    /* Set out
10f0: 70 75 74 20 74 79 70 65 20 73 69 7a 65 73 20 2a  put type sizes *
1100: 2f 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72  /.    if (cipher
1110: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   == NULL) {..if 
1120: 28 64 6b 5f 6c 65 6e 20 3e 20 62 75 66 5f 6c 65  (dk_len > buf_le
1130: 6e 29 20 64 6b 5f 6c 65 6e 20 3d 20 62 75 66 5f  n) dk_len = buf_
1140: 6c 65 6e 3b 0a 09 69 6b 6c 65 6e 20 3d 20 64 6b  len;..iklen = dk
1150: 5f 6c 65 6e 3b 0a 09 69 76 6c 65 6e 20 3d 20 30  _len;..ivlen = 0
1160: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1170: 69 6b 6c 65 6e 20 3d 20 45 56 50 5f 43 49 50 48  iklen = EVP_CIPH
1180: 45 52 5f 6b 65 79 5f 6c 65 6e 67 74 68 28 63 69  ER_key_length(ci
1190: 70 68 65 72 29 3b 0a 09 69 76 6c 65 6e 20 3d 20  pher);..ivlen = 
11a0: 45 56 50 5f 43 49 50 48 45 52 5f 69 76 5f 6c 65  EVP_CIPHER_iv_le
11b0: 6e 67 74 68 28 63 69 70 68 65 72 29 3b 0a 09 64  ngth(cipher);..d
11c0: 6b 5f 6c 65 6e 20 3d 20 69 6b 6c 65 6e 2b 69 76  k_len = iklen+iv
11d0: 6c 65 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  len;.    }..    
11e0: 2f 2a 20 44 65 72 69 76 65 20 6b 65 79 20 2a 2f  /* Derive key */
11f0: 0a 20 20 20 20 69 66 20 28 21 50 4b 43 53 35 5f  .    if (!PKCS5_
1200: 50 42 4b 44 46 32 5f 48 4d 41 43 28 70 61 73 73  PBKDF2_HMAC(pass
1210: 77 6f 72 64 2c 20 70 61 73 73 5f 6c 65 6e 2c 20  word, pass_len, 
1220: 73 61 6c 74 2c 20 73 61 6c 74 5f 6c 65 6e 2c 20  salt, salt_len, 
1230: 69 74 65 72 2c 20 6d 64 2c 20 64 6b 5f 6c 65 6e  iter, md, dk_len
1240: 2c 20 74 6d 70 6b 65 79 69 76 29 29 20 7b 0a 09  , tmpkeyiv)) {..
1250: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1260: 28 69 6e 74 65 72 70 2c 20 22 4b 65 79 20 64 65  (interp, "Key de
1270: 72 69 76 61 74 69 6f 6e 20 66 61 69 6c 65 64 3a  rivation failed:
1280: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55   ", REASON(), NU
1290: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
12a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
12b0: 20 20 2f 2a 20 53 65 74 20 72 65 73 75 6c 74 20    /* Set result 
12c0: 74 6f 20 6b 65 79 20 61 6e 64 20 69 76 20 2a 2f  to key and iv */
12d0: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20  .    if (cipher 
12e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
12f0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1300: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
1310: 41 72 72 61 79 4f 62 6a 28 74 6d 70 6b 65 79 69  ArrayObj(tmpkeyi
1320: 76 2c 20 64 6b 5f 6c 65 6e 29 29 3b 0a 20 20 20  v, dk_len));.   
1330: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f   } else {..Tcl_O
1340: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20  bj *resultObj = 
1350: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
1360: 2c 20 4e 55 4c 4c 29 3b 0a 09 4c 41 50 50 45 4e  , NULL);..LAPPEN
1370: 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
1380: 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6b 65 79   resultObj, "key
1390: 22 2c 20 74 6d 70 6b 65 79 69 76 2c 20 69 6b 6c  ", tmpkeyiv, ikl
13a0: 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  en);..LAPPEND_BA
13b0: 52 52 41 59 28 69 6e 74 65 72 70 2c 20 72 65 73  RRAY(interp, res
13c0: 75 6c 74 4f 62 6a 2c 20 22 69 76 22 2c 20 74 6d  ultObj, "iv", tm
13d0: 70 6b 65 79 69 76 2b 69 6b 6c 65 6e 2c 20 69 76  pkeyiv+iklen, iv
13e0: 6c 65 6e 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62  len);..Tcl_SetOb
13f0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1400: 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20  resultObj);.    
1410: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 20  }..    /* Clear 
1420: 64 61 74 61 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  data */.    mems
1430: 65 74 28 74 6d 70 6b 65 79 69 76 2c 20 30 2c 20  et(tmpkeyiv, 0, 
1440: 62 75 66 5f 6c 65 6e 29 3b 0a 20 20 20 20 72 65  buf_len);.    re
1450: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1460: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
1470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b  --------. *. * K
14b0: 44 46 5f 48 4b 44 46 20 2d 2d 0a 20 2a 0a 20 2a  DF_HKDF --. *. *
14c0: 09 48 4d 41 43 2d 62 61 73 65 64 20 45 78 74 72  .HMAC-based Extr
14d0: 61 63 74 2d 61 6e 64 2d 45 78 70 61 6e 64 20 4b  act-and-Expand K
14e0: 65 79 20 44 65 72 69 76 61 74 69 6f 6e 20 46 75  ey Derivation Fu
14f0: 6e 63 74 69 6f 6e 20 28 48 4b 44 46 29 2e 0a 20  nction (HKDF).. 
1500: 2a 09 53 65 65 20 52 46 43 20 35 38 36 39 2e 0a  *.See RFC 5869..
1510: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
1520: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
1530: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
1540: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74   effects:. *.Set
1550: 73 20 72 65 73 75 6c 74 20 74 6f 20 61 20 6b 65  s result to a ke
1560: 79 20 6f 66 20 73 70 65 63 69 66 69 65 64 20 6c  y of specified l
1570: 65 6e 67 74 68 2c 20 6f 72 20 61 6e 20 65 72 72  ength, or an err
1580: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a  or message. *. *
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
15e0: 6e 74 20 4b 44 46 5f 48 4b 44 46 28 43 6c 69 65  nt KDF_HKDF(Clie
15f0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
1600: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
1610: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
1620: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
1630: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 45 56  objv[]) {.    EV
1640: 50 5f 50 4b 45 59 5f 43 54 58 20 2a 70 63 74 78  P_PKEY_CTX *pctx
1650: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
1660: 4d 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20  MD *md = NULL;. 
1670: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
1680: 20 2a 73 61 6c 74 20 3d 20 4e 55 4c 4c 2c 20 2a   *salt = NULL, *
1690: 6b 65 79 20 3d 20 4e 55 4c 4c 2c 20 2a 69 6e 66  key = NULL, *inf
16a0: 6f 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 75 74 20 3d  o = NULL, *out =
16b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73   NULL;.    int s
16c0: 61 6c 74 5f 6c 65 6e 20 3d 20 30 2c 20 6b 65 79  alt_len = 0, key
16d0: 5f 6c 65 6e 20 3d 20 30 2c 20 69 6e 66 6f 5f 6c  _len = 0, info_l
16e0: 65 6e 20 3d 20 30 2c 20 64 6b 5f 6c 65 6e 20 3d  en = 0, dk_len =
16f0: 20 31 30 32 34 2c 20 72 65 73 20 3d 20 54 43 4c   1024, res = TCL
1700: 5f 4f 4b 2c 20 66 6e 3b 0a 20 20 20 20 63 68 61  _OK, fn;.    cha
1710: 72 20 2a 64 69 67 65 73 74 4e 61 6d 65 3b 0a 20  r *digestName;. 
1720: 20 20 20 73 69 7a 65 5f 74 20 6f 75 74 5f 6c 65     size_t out_le
1730: 6e 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  n;.    Tcl_Obj *
1740: 72 65 73 75 6c 74 4f 62 6a 3b 0a 0a 20 20 20 20  resultObj;..    
1750: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
1760: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72  );..    /* Clear
1770: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 54   errors */.    T
1780: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
1790: 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 52 52 5f  nterp);.    ERR_
17a0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
17b0: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20      /* Validate 
17c0: 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  arg count */.   
17d0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c 7c   if (objc < 3 ||
17e0: 20 6f 62 6a 63 20 3e 20 31 31 29 20 7b 0a 09 54   objc > 11) {..T
17f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1800: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1810: 20 22 2d 64 69 67 65 73 74 20 64 69 67 65 73 74   "-digest digest
1820: 20 2d 6b 65 79 20 73 74 72 69 6e 67 20 3f 2d 69   -key string ?-i
1830: 6e 66 6f 20 73 74 72 69 6e 67 3f 20 3f 2d 73 61  nfo string? ?-sa
1840: 6c 74 20 73 74 72 69 6e 67 3f 20 3f 2d 73 69 7a  lt string? ?-siz
1850: 65 20 64 65 72 69 76 65 64 5f 6c 65 6e 67 74 68  e derived_length
1860: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
1870: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
1880: 20 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e     /* Get option
1890: 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 6e  s */.    for (in
18a0: 74 20 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c  t idx = 1; idx <
18b0: 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a   objc; idx++) {.
18c0: 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 2a  ./* Get option *
18d0: 2f 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  /..if (Tcl_GetIn
18e0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
18f0: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f  p, objv[idx], co
1900: 6d 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74  mmand_opts, "opt
1910: 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d  ion", 0, &fn) !=
1920: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
1930: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1940: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61  ;..}.../* Valida
1950: 74 65 20 61 72 67 20 68 61 73 20 61 20 76 61 6c  te arg has a val
1960: 75 65 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78  ue */..if (++idx
1970: 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20   >= objc) {..   
1980: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1990: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61  t(interp, "No va
19a0: 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c  lue for option \
19b0: 22 22 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73  "", command_opts
19c0: 5b 66 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61  [fn], "\"", (cha
19d0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
19e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19f0: 52 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66  R;..}...switch(f
1a00: 6e 29 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  n) {..case _opt_
1a10: 64 69 67 65 73 74 3a 0a 09 63 61 73 65 20 5f 6f  digest:..case _o
1a20: 70 74 5f 68 61 73 68 3a 0a 09 20 20 20 20 47 45  pt_hash:..    GE
1a30: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a  T_OPT_STRING(obj
1a40: 76 5b 69 64 78 5d 2c 20 64 69 67 65 73 74 4e 61  v[idx], digestNa
1a50: 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  me, NULL);..    
1a60: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
1a70: 74 5f 69 6e 66 6f 3a 0a 09 20 20 20 20 2f 2a 20  t_info:..    /* 
1a80: 4d 61 78 20 31 30 32 34 2f 32 30 34 38 20 2a 2f  Max 1024/2048 */
1a90: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59  ..    GET_OPT_BY
1aa0: 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64  TE_ARRAY(objv[id
1ab0: 78 5d 2c 20 69 6e 66 6f 2c 20 26 69 6e 66 6f 5f  x], info, &info_
1ac0: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  len);..    break
1ad0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79  ;..case _opt_key
1ae0: 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 70 61 73  :..case _opt_pas
1af0: 73 77 6f 72 64 3a 0a 09 20 20 20 20 47 45 54 5f  sword:..    GET_
1b00: 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f  OPT_BYTE_ARRAY(o
1b10: 62 6a 76 5b 69 64 78 5d 2c 20 6b 65 79 2c 20 26  bjv[idx], key, &
1b20: 6b 65 79 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62  key_len);..    b
1b30: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
1b40: 5f 73 61 6c 74 3a 0a 09 20 20 20 20 47 45 54 5f  _salt:..    GET_
1b50: 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f  OPT_BYTE_ARRAY(o
1b60: 62 6a 76 5b 69 64 78 5d 2c 20 73 61 6c 74 2c 20  bjv[idx], salt, 
1b70: 26 73 61 6c 74 5f 6c 65 6e 29 3b 0a 09 20 20 20  &salt_len);..   
1b80: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
1b90: 70 74 5f 6c 65 6e 67 74 68 3a 0a 09 63 61 73 65  pt_length:..case
1ba0: 20 5f 6f 70 74 5f 73 69 7a 65 3a 0a 09 20 20 20   _opt_size:..   
1bb0: 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a   GET_OPT_INT(obj
1bc0: 76 5b 69 64 78 5d 2c 20 26 64 6b 5f 6c 65 6e 29  v[idx], &dk_len)
1bd0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  ;..    break;..}
1be0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1bf0: 65 74 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20  et digest */.   
1c00: 20 69 66 20 28 28 6d 64 20 3d 20 55 74 69 6c 5f   if ((md = Util_
1c10: 47 65 74 44 69 67 65 73 74 28 69 6e 74 65 72 70  GetDigest(interp
1c20: 2c 20 64 69 67 65 73 74 4e 61 6d 65 2c 20 54 52  , digestName, TR
1c30: 55 45 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  UE)) == NULL) {.
1c40: 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20  .goto error;.   
1c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
1c60: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  e context */.   
1c70: 20 70 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59   pctx = EVP_PKEY
1c80: 5f 43 54 58 5f 6e 65 77 5f 69 64 28 45 56 50 5f  _CTX_new_id(EVP_
1c90: 50 4b 45 59 5f 48 4b 44 46 2c 20 4e 55 4c 4c 29  PKEY_HKDF, NULL)
1ca0: 3b 0a 20 20 20 20 69 66 20 28 70 63 74 78 20 3d  ;.    if (pctx =
1cb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
1cc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1cd0: 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f  rp, "Memory allo
1ce0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28  cation error", (
1cf0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
1d00: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20  goto error;.    
1d10: 7d 0a 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50  }..    if (EVP_P
1d20: 4b 45 59 5f 64 65 72 69 76 65 5f 69 6e 69 74 28  KEY_derive_init(
1d30: 70 63 74 78 29 20 3c 20 31 29 20 7b 0a 09 54 63  pctx) < 1) {..Tc
1d40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d50: 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69  nterp, "Initiali
1d60: 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  ze failed: ", RE
1d70: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
1d80: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20  goto error;.    
1d90: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 63 6f  }..    /* Set co
1da0: 6e 66 69 67 20 70 61 72 61 6d 65 74 65 72 73 20  nfig parameters 
1db0: 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50  */.    if (EVP_P
1dc0: 4b 45 59 5f 43 54 58 5f 73 65 74 5f 68 6b 64 66  KEY_CTX_set_hkdf
1dd0: 5f 6d 64 28 70 63 74 78 2c 20 6d 64 29 20 3c 20  _md(pctx, md) < 
1de0: 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  1) {..Tcl_Append
1df0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e00: 53 65 74 20 64 69 67 65 73 74 20 66 61 69 6c 65  Set digest faile
1e10: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  d: ", REASON(), 
1e20: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72  NULL);..goto err
1e30: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
1e40: 20 28 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73   (EVP_PKEY_CTX_s
1e50: 65 74 31 5f 68 6b 64 66 5f 6b 65 79 28 70 63 74  et1_hkdf_key(pct
1e60: 78 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29  x, key, key_len)
1e70: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70   < 1) {..Tcl_App
1e80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1e90: 2c 20 22 53 65 74 20 6b 65 79 20 66 61 69 6c 65  , "Set key faile
1ea0: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  d: ", REASON(), 
1eb0: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72  NULL);..goto err
1ec0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
1ed0: 20 28 73 61 6c 74 20 21 3d 20 4e 55 4c 4c 20 26   (salt != NULL &
1ee0: 26 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73  & EVP_PKEY_CTX_s
1ef0: 65 74 31 5f 68 6b 64 66 5f 73 61 6c 74 28 70 63  et1_hkdf_salt(pc
1f00: 74 78 2c 20 73 61 6c 74 2c 20 73 61 6c 74 5f 6c  tx, salt, salt_l
1f10: 65 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f  en) < 1) {..Tcl_
1f20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1f30: 65 72 70 2c 20 22 53 65 74 20 73 61 6c 74 20 66  erp, "Set salt f
1f40: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e  ailed: ", REASON
1f50: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f  (), NULL);..goto
1f60: 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20   error;.    }.  
1f70: 20 20 69 66 20 28 69 6e 66 6f 20 21 3d 20 4e 55    if (info != NU
1f80: 4c 4c 20 26 26 20 45 56 50 5f 50 4b 45 59 5f 43  LL && EVP_PKEY_C
1f90: 54 58 5f 61 64 64 31 5f 68 6b 64 66 5f 69 6e 66  TX_add1_hkdf_inf
1fa0: 6f 28 70 63 74 78 2c 20 69 6e 66 6f 2c 20 69 6e  o(pctx, info, in
1fb0: 66 6f 5f 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09  fo_len) < 1) {..
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 53 65 74 20 69 6e  (interp, "Set in
1fe0: 66 6f 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  fo failed: ", RE
1ff0: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
2000: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20  goto error;.    
2010: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 62 75  }..    /* Get bu
2020: 66 66 65 72 20 2a 2f 0a 20 20 20 20 72 65 73 75  ffer */.    resu
2030: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f  ltObj = Tcl_NewO
2040: 62 6a 28 29 3b 0a 20 20 20 20 69 66 20 28 28 6f  bj();.    if ((o
2050: 75 74 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65  ut = Tcl_SetByte
2060: 41 72 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75  ArrayLength(resu
2070: 6c 74 4f 62 6a 2c 20 64 6b 5f 6c 65 6e 29 29 20  ltObj, dk_len)) 
2080: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
2090: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
20a0: 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c  erp, "Memory all
20b0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20  ocation error", 
20c0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
20d0: 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20  .goto error;.   
20e0: 20 7d 0a 20 20 20 20 6f 75 74 5f 6c 65 6e 20 3d   }.    out_len =
20f0: 20 28 73 69 7a 65 5f 74 29 20 64 6b 5f 6c 65 6e   (size_t) dk_len
2100: 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 72 69 76 65  ;..    /* Derive
2110: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28   key */.    if (
2120: 45 56 50 5f 50 4b 45 59 5f 64 65 72 69 76 65 28  EVP_PKEY_derive(
2130: 70 63 74 78 2c 20 6f 75 74 2c 20 26 6f 75 74 5f  pctx, out, &out_
2140: 6c 65 6e 29 20 3e 20 30 29 20 7b 0a 09 2f 2a 20  len) > 0) {../* 
2150: 53 68 72 69 6e 6b 20 62 75 66 66 65 72 20 74 6f  Shrink buffer to
2160: 20 61 63 74 75 61 6c 20 73 69 7a 65 20 2a 2f 0a   actual size */.
2170: 09 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61  .Tcl_SetByteArra
2180: 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62  yLength(resultOb
2190: 6a 2c 20 28 69 6e 74 29 20 6f 75 74 5f 6c 65 6e  j, (int) out_len
21a0: 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  );..Tcl_SetObjRe
21b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73  sult(interp, res
21c0: 75 6c 74 4f 62 6a 29 3b 0a 09 67 6f 74 6f 20 64  ultObj);..goto d
21d0: 6f 6e 65 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  one;.    } else 
21e0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
21f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 65 72  ult(interp, "Der
2200: 69 76 65 20 6b 65 79 20 66 61 69 6c 65 64 3a 20  ive key failed: 
2210: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c  ", REASON(), NUL
2220: 4c 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  L);..Tcl_DecrRef
2230: 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29  Count(resultObj)
2240: 3b 0a 20 20 20 20 7d 0a 0a 65 72 72 6f 72 3a 0a  ;.    }..error:.
2250: 20 20 20 20 72 65 73 20 3d 20 54 43 4c 5f 45 52      res = TCL_ER
2260: 52 4f 52 3b 0a 64 6f 6e 65 3a 0a 20 20 20 20 69  ROR;.done:.    i
2270: 66 20 28 70 63 74 78 20 21 3d 20 4e 55 4c 4c 29  f (pctx != NULL)
2280: 20 7b 0a 09 45 56 50 5f 50 4b 45 59 5f 43 54 58   {..EVP_PKEY_CTX
2290: 5f 66 72 65 65 28 70 63 74 78 29 3b 0a 20 20 20  _free(pctx);.   
22a0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
22b0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  L_OK;.}../*. *--
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 0a 20 2a 0a 20 2a 20 4b 44 46 5f 53 63 72 79  -. *. * KDF_Scry
2310: 70 74 20 2d 2d 0a 20 2a 0a 20 2a 09 48 4d 41 43  pt --. *. *.HMAC
2320: 2d 62 61 73 65 64 20 45 78 74 72 61 63 74 2d 61  -based Extract-a
2330: 6e 64 2d 45 78 70 61 6e 64 20 4b 65 79 20 44 65  nd-Expand Key De
2340: 72 69 76 61 74 69 6f 6e 20 46 75 6e 63 74 69 6f  rivation Functio
2350: 6e 20 28 48 4b 44 46 29 2e 0a 20 2a 09 53 65 65  n (HKDF).. *.See
2360: 20 52 46 43 20 35 38 36 39 20 61 6e 64 20 52 46   RFC 5869 and RF
2370: 43 20 37 39 31 34 2e 0a 20 2a 0a 20 2a 20 52 65  C 7914.. *. * Re
2380: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
2390: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
23a0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
23b0: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74  :. *.Sets result
23c0: 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 6b 65   to a list of ke
23d0: 79 20 61 6e 64 20 69 76 20 76 61 6c 75 65 73 2c  y and iv values,
23e0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   or an error mes
23f0: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  sage. *. *------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 4b 44 46  /.static int KDF
2450: 5f 53 63 72 79 70 74 28 43 6c 69 65 6e 74 44 61  _Scrypt(ClientDa
2460: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
2470: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2480: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
2490: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
24a0: 5b 5d 29 20 7b 0a 20 20 20 20 45 56 50 5f 50 4b  []) {.    EVP_PK
24b0: 45 59 5f 43 54 58 20 2a 70 63 74 78 3b 0a 20 20  EY_CTX *pctx;.  
24c0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
24d0: 2a 73 61 6c 74 20 3d 20 4e 55 4c 4c 2c 20 2a 70  *salt = NULL, *p
24e0: 61 73 73 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 75 74  ass = NULL, *out
24f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
2500: 20 73 61 6c 74 5f 6c 65 6e 20 3d 20 30 2c 20 70   salt_len = 0, p
2510: 61 73 73 5f 6c 65 6e 20 3d 20 30 2c 20 64 6b 5f  ass_len = 0, dk_
2520: 6c 65 6e 20 3d 20 36 34 2c 20 72 65 73 20 3d 20  len = 64, res = 
2530: 54 43 4c 5f 4f 4b 2c 20 66 6e 3b 0a 20 20 20 20  TCL_OK, fn;.    
2540: 75 69 6e 74 36 34 5f 74 20 4e 20 3d 20 30 2c 20  uint64_t N = 0, 
2550: 70 20 3d 20 30 2c 20 72 20 3d 20 30 2c 20 6d 61  p = 0, r = 0, ma
2560: 78 6d 65 6d 20 3d 20 30 3b 0a 20 20 20 20 73 69  xmem = 0;.    si
2570: 7a 65 5f 74 20 6f 75 74 5f 6c 65 6e 3b 0a 20 20  ze_t out_len;.  
2580: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
2590: 74 4f 62 6a 3b 0a 0a 20 20 20 20 64 70 72 69 6e  tObj;..    dprin
25a0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
25b0: 20 20 20 2f 2a 20 43 6c 65 61 72 20 65 72 72 6f     /* Clear erro
25c0: 72 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65  rs */.    Tcl_Re
25d0: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
25e0: 29 3b 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  );.    ERR_clear
25f0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 2f  _error();..    /
2600: 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63  * Validate arg c
2610: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  ount */.    if (
2620: 6f 62 6a 63 20 3c 20 35 20 7c 7c 20 6f 62 6a 63  objc < 5 || objc
2630: 20 3e 20 31 33 29 20 7b 0a 09 54 63 6c 5f 57 72   > 13) {..Tcl_Wr
2640: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2650: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 2d 70 61  p, 1, objv, "-pa
2660: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 2d 73  ssword string -s
2670: 61 6c 74 20 73 74 72 69 6e 67 20 3f 2d 4e 20 63  alt string ?-N c
2680: 6f 73 74 50 61 72 61 6d 65 74 65 72 3f 20 3f 2d  ostParameter? ?-
2690: 72 20 62 6c 6f 63 6b 53 69 7a 65 3f 20 3f 2d 70  r blockSize? ?-p
26a0: 20 70 61 72 61 6c 6c 65 6c 69 7a 61 74 69 6f 6e   parallelization
26b0: 3f 20 3f 2d 73 69 7a 65 20 64 65 72 69 76 65 64  ? ?-size derived
26c0: 5f 6c 65 6e 67 74 68 3f 22 29 3b 0a 09 72 65 74  _length?");..ret
26d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
26f0: 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20   options */.    
2700: 66 6f 72 20 28 69 6e 74 20 69 64 78 20 3d 20 31  for (int idx = 1
2710: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64  ; idx < objc; id
2720: 78 2b 2b 29 20 7b 0a 09 2f 2a 20 47 65 74 20 6f  x++) {../* Get o
2730: 70 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 54 63  ption */..if (Tc
2740: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
2750: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
2760: 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74  dx], command_opt
2770: 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20  s, "option", 0, 
2780: 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  &fn) != TCL_OK) 
2790: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
27a0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
27b0: 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 68 61   Validate arg ha
27c0: 73 20 61 20 76 61 6c 75 65 20 2a 2f 0a 09 69 66  s a value */..if
27d0: 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a 63 29   (++idx >= objc)
27e0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
27f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2800: 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72 20 6f   "No value for o
2810: 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d 6d 61  ption \"", comma
2820: 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22 5c 22  nd_opts[fn], "\"
2830: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
2840: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
2850: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 73  CL_ERROR;..}...s
2860: 77 69 74 63 68 28 66 6e 29 20 7b 0a 09 63 61 73  witch(fn) {..cas
2870: 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a 09 63 61 73  e _opt_key:..cas
2880: 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72 64 3a  e _opt_password:
2890: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59  ..    GET_OPT_BY
28a0: 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64  TE_ARRAY(objv[id
28b0: 78 5d 2c 20 70 61 73 73 2c 20 26 70 61 73 73 5f  x], pass, &pass_
28c0: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  len);..    break
28d0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 61 6c  ;..case _opt_sal
28e0: 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  t:..    GET_OPT_
28f0: 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b  BYTE_ARRAY(objv[
2900: 69 64 78 5d 2c 20 73 61 6c 74 2c 20 26 73 61 6c  idx], salt, &sal
2910: 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65  t_len);..    bre
2920: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6c  ak;..case _opt_l
2930: 65 6e 67 74 68 3a 0a 09 63 61 73 65 20 5f 6f 70  ength:..case _op
2940: 74 5f 73 69 7a 65 3a 0a 09 20 20 20 20 47 45 54  t_size:..    GET
2950: 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64  _OPT_INT(objv[id
2960: 78 5d 2c 20 26 64 6b 5f 6c 65 6e 29 3b 0a 09 20  x], &dk_len);.. 
2970: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
2980: 5f 6f 70 74 5f 4e 3a 0a 09 63 61 73 65 20 5f 6f  _opt_N:..case _o
2990: 70 74 5f 6e 3a 0a 09 20 20 20 20 47 45 54 5f 4f  pt_n:..    GET_O
29a0: 50 54 5f 57 49 44 45 28 6f 62 6a 76 5b 69 64 78  PT_WIDE(objv[idx
29b0: 5d 2c 20 26 4e 29 3b 0a 09 20 20 20 20 62 72 65  ], &N);..    bre
29c0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 72  ak;..case _opt_r
29d0: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 57  :..    GET_OPT_W
29e0: 49 44 45 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  IDE(objv[idx], &
29f0: 72 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  r);..    break;.
2a00: 09 63 61 73 65 20 5f 6f 70 74 5f 70 3a 0a 09 20  .case _opt_p:.. 
2a10: 20 20 20 47 45 54 5f 4f 50 54 5f 57 49 44 45 28     GET_OPT_WIDE(
2a20: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 70 29 3b 0a  objv[idx], &p);.
2a30: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20  .    break;..}. 
2a40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
2a50: 61 74 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ate context */. 
2a60: 20 20 20 70 63 74 78 20 3d 20 45 56 50 5f 50 4b     pctx = EVP_PK
2a70: 45 59 5f 43 54 58 5f 6e 65 77 5f 69 64 28 45 56  EY_CTX_new_id(EV
2a80: 50 5f 50 4b 45 59 5f 53 43 52 59 50 54 2c 20 4e  P_PKEY_SCRYPT, N
2a90: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 70 63  ULL);.    if (pc
2aa0: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  tx == NULL) {..T
2ab0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2ac0: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20  interp, "Memory 
2ad0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
2ae0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
2af0: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a  );..goto error;.
2b00: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 45      }..    if (E
2b10: 56 50 5f 50 4b 45 59 5f 64 65 72 69 76 65 5f 69  VP_PKEY_derive_i
2b20: 6e 69 74 28 70 63 74 78 29 20 3c 20 31 29 20 7b  nit(pctx) < 1) {
2b30: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
2b40: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74  lt(interp, "Init
2b50: 69 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22  ialize failed: "
2b60: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c  , REASON(), NULL
2b70: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a  );..goto error;.
2b80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
2b90: 74 20 63 6f 6e 66 69 67 20 70 61 72 61 6d 65 74  t config paramet
2ba0: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 45  ers */.    if (E
2bb0: 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 31  VP_PKEY_CTX_set1
2bc0: 5f 70 62 65 5f 70 61 73 73 28 70 63 74 78 2c 20  _pbe_pass(pctx, 
2bd0: 70 61 73 73 2c 20 70 61 73 73 5f 6c 65 6e 29 20  pass, pass_len) 
2be0: 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  < 1) {..Tcl_Appe
2bf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2c00: 20 22 53 65 74 20 6b 65 79 20 66 61 69 6c 65 64   "Set key failed
2c10: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e  : ", REASON(), N
2c20: 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f  ULL);..goto erro
2c30: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  r;.    }.    if 
2c40: 28 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65  (EVP_PKEY_CTX_se
2c50: 74 31 5f 73 63 72 79 70 74 5f 73 61 6c 74 28 70  t1_scrypt_salt(p
2c60: 63 74 78 2c 20 73 61 6c 74 2c 20 73 61 6c 74 5f  ctx, salt, salt_
2c70: 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c  len) < 1) {..Tcl
2c80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2c90: 74 65 72 70 2c 20 22 53 65 74 20 73 61 6c 74 20  terp, "Set salt 
2ca0: 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f  failed: ", REASO
2cb0: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74  N(), NULL);..got
2cc0: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  o error;.    }. 
2cd0: 20 20 20 69 66 20 28 4e 20 21 3d 20 30 20 26 26     if (N != 0 &&
2ce0: 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65   EVP_PKEY_CTX_se
2cf0: 74 5f 73 63 72 79 70 74 5f 4e 28 70 63 74 78 2c  t_scrypt_N(pctx,
2d00: 20 4e 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f   N) < 1) {..Tcl_
2d10: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2d20: 65 72 70 2c 20 22 53 65 74 20 63 6f 73 74 20 70  erp, "Set cost p
2d30: 61 72 61 6d 65 74 65 72 20 28 4e 29 20 66 61 69  arameter (N) fai
2d40: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  led: ", REASON()
2d50: 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65  , NULL);..goto e
2d60: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
2d70: 69 66 20 28 72 20 21 3d 20 30 20 26 26 20 45 56  if (r != 0 && EV
2d80: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73  P_PKEY_CTX_set_s
2d90: 63 72 79 70 74 5f 72 28 70 63 74 78 2c 20 72 29  crypt_r(pctx, r)
2da0: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70   < 1) {..Tcl_App
2db0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2dc0: 2c 20 22 53 65 74 20 6c 6f 63 6b 20 73 69 7a 65  , "Set lock size
2dd0: 20 70 61 72 61 6d 65 74 65 72 20 28 72 29 20 66   parameter (r) f
2de0: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e  ailed: ", REASON
2df0: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f  (), NULL);..goto
2e00: 20 65 72 72 6f 72 3b 0a 20 20 20 7d 0a 20 20 20   error;.   }.   
2e10: 20 69 66 20 28 70 20 21 3d 20 30 20 26 26 20 45   if (p != 0 && E
2e20: 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f  VP_PKEY_CTX_set_
2e30: 73 63 72 79 70 74 5f 70 28 70 63 74 78 2c 20 70  scrypt_p(pctx, p
2e40: 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70  ) < 1) {..Tcl_Ap
2e50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2e60: 70 2c 20 22 53 65 74 20 50 61 72 61 6c 6c 65 6c  p, "Set Parallel
2e70: 69 7a 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  ization paramete
2e80: 72 20 28 70 29 20 66 61 69 6c 65 64 3a 20 22 2c  r (p) failed: ",
2e90: 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29   REASON(), NULL)
2ea0: 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20  ;..goto error;. 
2eb0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6d 61 78     }.    if (max
2ec0: 6d 65 6d 20 21 3d 20 30 20 26 26 20 45 56 50 5f  mem != 0 && EVP_
2ed0: 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 63 72  PKEY_CTX_set_scr
2ee0: 79 70 74 5f 6d 61 78 6d 65 6d 5f 62 79 74 65 73  ypt_maxmem_bytes
2ef0: 28 70 63 74 78 2c 20 6d 61 78 6d 65 6d 29 20 3c  (pctx, maxmem) <
2f00: 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e   1) {..Tcl_Appen
2f10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2f20: 22 53 65 74 20 6d 61 78 20 6d 65 6d 6f 72 79 20  "Set max memory 
2f30: 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f  failed: ", REASO
2f40: 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74  N(), NULL);..got
2f50: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a  o error;.    }..
2f60: 20 20 20 20 2f 2a 20 47 65 74 20 62 75 66 66 65      /* Get buffe
2f70: 72 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 4f  r */.    resultO
2f80: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  bj = Tcl_NewObj(
2f90: 29 3b 0a 20 20 20 20 69 66 20 28 28 6f 75 74 20  );.    if ((out 
2fa0: 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72  = Tcl_SetByteArr
2fb0: 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f  ayLength(resultO
2fc0: 62 6a 2c 20 64 6b 5f 6c 65 6e 29 29 20 3d 3d 20  bj, dk_len)) == 
2fd0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
2fe0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2ff0: 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  , "Memory alloca
3000: 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68  tion error", (ch
3010: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f  ar *) NULL);..go
3020: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to error;.    }.
3030: 20 20 20 20 6f 75 74 5f 6c 65 6e 20 3d 20 28 73      out_len = (s
3040: 69 7a 65 5f 74 29 20 64 6b 5f 6c 65 6e 3b 0a 0a  ize_t) dk_len;..
3050: 20 20 20 20 2f 2a 20 44 65 72 69 76 65 20 6b 65      /* Derive ke
3060: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 50  y */.    if (EVP
3070: 5f 50 4b 45 59 5f 64 65 72 69 76 65 28 70 63 74  _PKEY_derive(pct
3080: 78 2c 20 6f 75 74 2c 20 26 6f 75 74 5f 6c 65 6e  x, out, &out_len
3090: 29 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 53 68 72  ) > 0) {../* Shr
30a0: 69 6e 6b 20 62 75 66 66 65 72 20 74 6f 20 61 63  ink buffer to ac
30b0: 74 75 61 6c 20 73 69 7a 65 20 2a 2f 0a 09 54 63  tual size */..Tc
30c0: 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65  l_SetByteArrayLe
30d0: 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20  ngth(resultObj, 
30e0: 28 69 6e 74 29 20 6f 75 74 5f 6c 65 6e 29 3b 0a  (int) out_len);.
30f0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
3100: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  t(interp, result
3110: 4f 62 6a 29 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65  Obj);..goto done
3120: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
3130: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3140: 28 69 6e 74 65 72 70 2c 20 22 44 65 72 69 76 65  (interp, "Derive
3150: 20 6b 65 79 20 66 61 69 6c 65 64 3a 20 22 2c 20   key failed: ", 
3160: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
3170: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
3180: 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20  nt(resultObj);. 
3190: 20 20 20 7d 0a 0a 65 72 72 6f 72 3a 0a 20 20 20     }..error:.   
31a0: 20 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52   res = TCL_ERROR
31b0: 3b 0a 64 6f 6e 65 3a 0a 20 20 20 20 69 66 20 28  ;.done:.    if (
31c0: 70 63 74 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  pctx != NULL) {.
31d0: 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72  .EVP_PKEY_CTX_fr
31e0: 65 65 28 70 63 74 78 29 3b 0a 20 20 20 20 7d 0a  ee(pctx);.    }.
31f0: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
3200: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20  -----------. *. 
3250: 2a 20 54 6c 73 5f 4b 65 79 43 6f 6d 6d 61 6e 64  * Tls_KeyCommand
3260: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74  s --. *. *.Creat
3270: 65 20 6b 65 79 20 63 6f 6d 6d 61 6e 64 73 0a 20  e key commands. 
3280: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
3290: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
32a0: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
32b0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61  effects:. *.Crea
32c0: 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a  tes commands. *.
32d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
32e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 69 6e 74 20 54 6c  -----. */.int Tl
3320: 73 5f 4b 65 79 43 6f 6d 6d 61 6e 64 73 28 54 63  s_KeyCommands(Tc
3330: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3340: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  ) {.    Tcl_Crea
3350: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
3360: 65 72 70 2c 20 22 74 6c 73 3a 3a 68 6b 64 66 22  erp, "tls::hkdf"
3370: 2c 20 4b 44 46 5f 48 4b 44 46 2c 20 28 43 6c 69  , KDF_HKDF, (Cli
3380: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
3390: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
33a0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
33b0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
33c0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
33d0: 70 62 6b 64 66 32 22 2c 20 4b 44 46 5f 50 42 4b  pbkdf2", KDF_PBK
33e0: 44 46 32 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  DF2, (ClientData
33f0: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
3400: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
3410: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
3420: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
3430: 70 2c 20 22 74 6c 73 3a 3a 73 63 72 79 70 74 22  p, "tls::scrypt"
3440: 2c 20 4b 44 46 5f 53 63 72 79 70 74 2c 20 28 43  , KDF_Scrypt, (C
3450: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
3460: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
3470: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72   *) NULL);.    r
3480: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3490: 0a                                               .