Hex Artifact Content

Artifact f9e71c157f7b7296c181228130e8b85d8a1a0d984a4ecef2d41f4d7aed185cda:


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 72 61 6e  ude <openssl/ran
00c0: 64 2e 68 3e 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  d.h>../*********
00d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 0a 2f 2a 20  **********/../* 
0110: 4f 70 74 69 6f 6e 73 20 66 6f 72 20 52 61 6e 64  Options for Rand
0120: 6f 6d 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 0a  om commands */..
0130: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0140: 72 20 2a 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20  r *command_opts 
0150: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 2d 70 72 69  [] = {.    "-pri
0160: 76 61 74 65 22 2c 20 4e 55 4c 4c 7d 3b 0a 0a 65  vate", NULL};..e
0170: 6e 75 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f 70 74  num _command_opt
0180: 73 20 7b 0a 20 20 20 20 5f 6f 70 74 5f 70 72 69  s {.    _opt_pri
0190: 76 61 74 65 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d  vate.};../*. *--
01a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01e0: 2d 0a 20 2a 0a 20 2a 20 52 41 4e 44 5f 52 61 6e  -. *. * RAND_Ran
01f0: 64 6f 6d 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 6e  dom --. *. *.Gen
0200: 65 72 61 74 65 20 72 61 6e 64 6f 6d 20 62 79 65  erate random bye
0210: 73 20 75 73 69 6e 67 20 61 20 72 61 6e 64 6f 6d  s using a random
0220: 20 62 79 74 65 73 20 75 73 69 6e 67 20 61 20 63   bytes using a c
0230: 72 79 70 74 6f 67 72 61 70 68 69 63 61 6c 6c 79  ryptographically
0240: 0a 20 2a 09 73 65 63 75 72 65 20 70 73 65 75 64  . *.secure pseud
0250: 6f 20 72 61 6e 64 6f 6d 20 67 65 6e 65 72 61 74  o random generat
0260: 6f 72 20 28 43 53 50 52 4e 47 29 2e 0a 20 2a 0a  or (CSPRNG).. *.
0270: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
0280: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
0290: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
02a0: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72  fects:. *.Sets r
02b0: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 72 61 6e  esult to the ran
02c0: 64 6f 6d 20 62 79 74 65 73 2c 20 6f 72 20 61 6e  dom bytes, or an
02d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
02e0: 2a 0a 20 2a 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 2d 2d 2d 2d  ----------------
0300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0320: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
0330: 69 63 20 69 6e 74 20 52 41 4e 44 5f 52 61 6e 64  ic int RAND_Rand
0340: 6f 6d 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  om(ClientData cl
0350: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
0360: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
0370: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
0380: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
0390: 0a 20 20 20 20 69 6e 74 20 6f 75 74 5f 6c 65 6e  .    int out_len
03a0: 20 3d 20 30 2c 20 72 65 73 3b 0a 20 20 20 20 75   = 0, res;.    u
03b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
03c0: 74 5f 62 75 66 3b 0a 20 20 20 20 54 63 6c 5f 4f  t_buf;.    Tcl_O
03d0: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 0a  bj *resultObj;..
03e0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
03f0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  led");..    /* C
0400: 6c 65 61 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lear errors */. 
0410: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
0420: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
0430: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
0440: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64  );..    /* Valid
0450: 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f  ate arg count */
0460: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
0470: 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 29 20 7b  2 || objc > 3) {
0480: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
0490: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
04a0: 6a 76 2c 20 22 3f 2d 70 72 69 76 61 74 65 3f 20  jv, "?-private? 
04b0: 6c 65 6e 67 74 68 22 29 3b 0a 09 72 65 74 75 72  length");..retur
04c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
04d0: 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 62 6a 63   } else if (objc
04e0: 20 3d 3d 20 33 29 20 7b 0a 09 69 6e 74 20 66 6e   == 3) {..int fn
04f0: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  ;..if (Tcl_GetIn
0500: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
0510: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d  p, objv[1], comm
0520: 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74 69 6f  and_opts, "optio
0530: 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20 54  n", 0, &fn) != T
0540: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65  CL_OK) {..    re
0550: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0560: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
0570: 20 47 65 74 20 6c 65 6e 67 74 68 20 2a 2f 0a 20   Get length */. 
0580: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
0590: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
05a0: 20 6f 62 6a 76 5b 6f 62 6a 63 20 2d 20 31 5d 2c   objv[objc - 1],
05b0: 20 26 6f 75 74 5f 6c 65 6e 29 20 21 3d 20 54 43   &out_len) != TC
05c0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
05d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
05e0: 0a 20 20 20 20 69 66 20 28 6f 75 74 5f 6c 65 6e  .    if (out_len
05f0: 20 3c 20 30 29 20 7b 0a 09 54 63 6c 5f 53 65 74   < 0) {..Tcl_Set
0600: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
0610: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28  , Tcl_ObjPrintf(
0620: 22 62 61 64 20 63 6f 75 6e 74 20 5c 22 25 64 5c  "bad count \"%d\
0630: 22 3a 20 6d 75 73 74 20 62 65 20 69 6e 74 65 67  ": must be integ
0640: 65 72 20 3e 3d 20 30 22 2c 20 6f 75 74 5f 6c 65  er >= 0", out_le
0650: 6e 29 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  n));..return TCL
0660: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
0670: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73     /* Allocate s
0680: 74 6f 72 61 67 65 20 66 6f 72 20 72 65 73 75 6c  torage for resul
0690: 74 20 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 4f  t */.    resultO
06a0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  bj = Tcl_NewObj(
06b0: 29 3b 0a 20 20 20 20 6f 75 74 5f 62 75 66 20 3d  );.    out_buf =
06c0: 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61   Tcl_SetByteArra
06d0: 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62  yLength(resultOb
06e0: 6a 2c 20 6f 75 74 5f 6c 65 6e 29 3b 0a 20 20 20  j, out_len);.   
06f0: 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d   if (resultObj =
0700: 3d 20 4e 55 4c 4c 20 7c 7c 20 6f 75 74 5f 62 75  = NULL || out_bu
0710: 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  f == NULL) {..Tc
0720: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0730: 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61  nterp, "Memory a
0740: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22  llocation error"
0750: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
0760: 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  ;..Tcl_DecrRefCo
0770: 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a  unt(resultObj);.
0780: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
0790: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
07a0: 20 47 65 74 20 72 61 6e 64 6f 6d 20 62 79 74 65   Get random byte
07b0: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  s */.    if (obj
07c0: 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
07d0: 20 52 41 4e 44 5f 62 79 74 65 73 28 6f 75 74 5f   RAND_bytes(out_
07e0: 62 75 66 2c 20 6f 75 74 5f 6c 65 6e 29 3b 0a 20  buf, out_len);. 
07f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
0800: 20 3d 20 52 41 4e 44 5f 70 72 69 76 5f 62 79 74   = RAND_priv_byt
0810: 65 73 28 6f 75 74 5f 62 75 66 2c 20 6f 75 74 5f  es(out_buf, out_
0820: 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  len);.    }.    
0830: 69 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c  if (!res) {..Tcl
0840: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
0850: 74 65 72 70 2c 20 22 47 65 6e 65 72 61 74 65 20  terp, "Generate 
0860: 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f  failed: ", REASO
0870: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
0880: 4c 4c 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65  LL);..Tcl_DecrRe
0890: 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a  fCount(resultObj
08a0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
08b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
08c0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
08d0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  t(interp, result
08e0: 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Obj);.    return
08f0: 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
0900: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
0910: 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  a;.}../*. *-----
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0960: 2a 0a 20 2a 20 54 6c 73 5f 52 61 6e 64 43 6f 6d  *. * Tls_RandCom
0970: 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43  mands --. *. *.C
0980: 72 65 61 74 65 20 6b 65 79 20 63 6f 6d 6d 61 6e  reate key comman
0990: 64 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  ds. *. * Returns
09a0: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54  :. *.TCL_OK or T
09b0: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53  CL_ERROR. *. * S
09c0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
09d0: 43 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73  Creates commands
09e0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
0a30: 74 20 54 6c 73 5f 52 61 6e 64 43 6f 6d 6d 61 6e  t Tls_RandComman
0a40: 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ds(Tcl_Interp *i
0a50: 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c  nterp) {.    Tcl
0a60: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
0a70: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
0a80: 72 61 6e 64 6f 6d 22 2c 20 52 41 4e 44 5f 52 61  random", RAND_Ra
0a90: 6e 64 6f 6d 2c 20 28 43 6c 69 65 6e 74 44 61 74  ndom, (ClientDat
0aa0: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
0ab0: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
0ac0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
0ad0: 4c 5f 4f 4b 3b 0a 7d 0a 0a                       L_OK;.}..