Hex Artifact Content

Artifact 77db2d7c663fe0a2d24b3b3de8b4f0e7d27e347d019f359b137fdf30b5567079:


0000: 2f 2a 0a 20 2a 20 44 69 67 65 73 74 20 43 6f 6d  /*. * Digest Com
0010: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 43 6f 70 79  mands. *. * Copy
0020: 72 69 67 68 74 20 28 43 29 20 32 30 32 33 20 42  right (C) 2023 B
0030: 72 69 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a  rian O'Hagan. *.
0040: 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74   */..#include "t
0050: 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  lsInt.h".#includ
0060: 65 20 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69  e "tclOpts.h".#i
0070: 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23  nclude <tcl.h>.#
0080: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
0090: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
00a0: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
00b0: 6f 70 65 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 0a  openssl/evp.h>..
00c0: 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  /* Constants */.
00d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 65 78 20  const char *hex 
00e0: 3d 20 22 30 31 32 33 34 35 36 37 38 39 41 42 43  = "0123456789ABC
00f0: 44 45 46 22 3b 0a 23 64 65 66 69 6e 65 20 52 45  DEF";.#define RE
0100: 41 53 4f 4e 28 29 09 45 52 52 5f 72 65 61 73 6f  ASON().ERR_reaso
0110: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 45  n_error_string(E
0120: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 0a  RR_get_error()).
0130: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
0180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 69  -. *. * DigestFi
01d0: 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75  le --. *. *.Retu
01e0: 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  rn message diges
01f0: 74 20 66 6f 72 20 66 69 6c 65 20 75 73 69 6e 67  t for file using
0200: 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20   user specified 
0210: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  hash function.. 
0220: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
0230: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45  .TCL_OK or TCL_E
0240: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20  RROR. *. * Side 
0250: 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 75  effects:. *.Resu
0260: 6c 74 20 69 73 20 6d 65 73 73 61 67 65 20 64 69  lt is message di
0270: 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65  gest or error me
0280: 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ssage. *. *-----
0290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
02d0: 2a 2f 0a 69 6e 74 0a 44 69 67 65 73 74 46 69 6c  */.int.DigestFil
02e0: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
02f0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 66  terp, Tcl_Obj *f
0300: 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 45  ilename, const E
0310: 56 50 5f 4d 44 20 2a 6d 64 2c 20 69 6e 74 20 66  VP_MD *md, int f
0320: 6f 72 6d 61 74 29 20 7b 0a 20 20 20 20 45 56 50  ormat) {.    EVP
0330: 5f 4d 44 5f 43 54 58 20 2a 63 74 78 3b 0a 20 20  _MD_CTX *ctx;.  
0340: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
0350: 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66  an;.    char buf
0360: 5b 33 32 37 36 38 5d 3b 0a 20 20 20 20 75 6e 73  [32768];.    uns
0370: 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75  igned char md_bu
0380: 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a  f[EVP_MAX_MD_SIZ
0390: 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  E];.    unsigned
03a0: 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 0a 20 20   int md_len;..  
03b0: 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63    /* Open file c
03c0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
03d0: 61 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46  an = Tcl_FSOpenF
03e0: 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ileChannel(inter
03f0: 70 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 22 72 62  p, filename, "rb
0400: 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69 66  ", 0444);.    if
0410: 20 28 63 68 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20   (chan == NULL) 
0420: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
0430: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
0440: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61  /* Configure cha
0450: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  nnel */.    if (
0460: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
0470: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
0480: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
0490: 22 2c 20 22 62 69 6e 61 72 79 22 29 20 3d 3d 20  ", "binary") == 
04a0: 54 43 4c 5f 45 52 52 4f 52 20 7c 7c 0a 09 54 63  TCL_ERROR ||..Tc
04b0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
04c0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
04d0: 20 22 2d 62 75 66 66 65 72 73 69 7a 65 22 2c 20   "-buffersize", 
04e0: 22 33 32 37 36 38 22 29 20 3d 3d 20 54 43 4c 5f  "32768") == TCL_
04f0: 45 52 52 4f 52 29 20 7b 0a 09 54 63 6c 5f 43 6c  ERROR) {..Tcl_Cl
0500: 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ose(interp, chan
0510: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
0520: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
0530: 20 2f 2a 20 43 72 65 61 74 65 20 6d 65 73 73 61   /* Create messa
0540: 67 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78  ge digest contex
0550: 74 20 2a 2f 0a 20 20 20 20 63 74 78 20 3d 20 45  t */.    ctx = E
0560: 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 28 29 3b  VP_MD_CTX_new();
0570: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20  .    if (ctx == 
0580: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
0590: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
05a0: 2c 20 22 43 72 65 61 74 65 20 64 69 67 65 73 74  , "Create digest
05b0: 20 63 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 3a   context failed:
05c0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55   ", REASON(), NU
05d0: 4c 4c 29 3b 0a 09 54 63 6c 5f 43 6c 6f 73 65 28  LL);..Tcl_Close(
05e0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a 09  interp, chan);..
05f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0600: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
0610: 49 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20  Initialize hash 
0620: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 20  function */.#if 
0630: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
0640: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
0650: 30 30 30 4c 0a 20 20 20 20 69 66 20 28 21 45 56  000L.    if (!EV
0660: 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 78 28  P_DigestInit_ex(
0670: 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 29 0a  ctx, md, NULL)).
0680: 23 65 6c 73 65 0a 20 20 20 20 69 66 20 28 21 45  #else.    if (!E
0690: 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 78  VP_DigestInit_ex
06a0: 32 28 63 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29  2(ctx, md, NULL)
06b0: 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 09  ).#endif.    {..
06c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
06d0: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61  (interp, "Initia
06e0: 6c 69 7a 65 20 64 69 67 65 73 74 20 66 61 69 6c  lize digest fail
06f0: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ed: ", REASON(),
0700: 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 43 6c 6f   NULL);..Tcl_Clo
0710: 73 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  se(interp, chan)
0720: 3b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72  ;..EVP_MD_CTX_fr
0730: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
0740: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
0750: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 66  }..    /* Read f
0760: 69 6c 65 20 64 61 74 61 20 61 6e 64 20 75 70 64  ile data and upd
0770: 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ate hash functio
0780: 6e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 20 28  n */.    while (
0790: 21 54 63 6c 5f 45 6f 66 28 63 68 61 6e 29 29 20  !Tcl_Eof(chan)) 
07a0: 7b 0a 09 69 6e 74 20 6c 65 6e 20 3d 20 54 63 6c  {..int len = Tcl
07b0: 5f 52 65 61 64 52 61 77 28 63 68 61 6e 2c 20 62  _ReadRaw(chan, b
07c0: 75 66 2c 20 33 32 37 36 38 29 3b 0a 09 69 66 20  uf, 32768);..if 
07d0: 28 21 45 56 50 5f 44 69 67 65 73 74 55 70 64 61  (!EVP_DigestUpda
07e0: 74 65 28 63 74 78 2c 20 26 62 75 66 2c 20 28 73  te(ctx, &buf, (s
07f0: 69 7a 65 5f 74 29 20 6c 65 6e 29 29 20 7b 0a 09  ize_t) len)) {..
0800: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
0810: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 70  sult(interp, "Up
0820: 64 61 74 65 20 64 69 67 65 73 74 20 66 61 69 6c  date digest fail
0830: 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  ed: ", REASON(),
0840: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
0850: 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63  _Close(interp, c
0860: 68 61 6e 29 3b 0a 09 20 20 20 20 45 56 50 5f 4d  han);..    EVP_M
0870: 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  D_CTX_free(ctx);
0880: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
0890: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
08a0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 63  ..    /* Close c
08b0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66  hannel */.    if
08c0: 20 28 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 65   (Tcl_Close(inte
08d0: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c  rp, chan) == TCL
08e0: 5f 45 52 52 4f 52 29 20 7b 0a 09 45 56 50 5f 4d  _ERROR) {..EVP_M
08f0: 44 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  D_CTX_free(ctx);
0900: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
0910: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
0920: 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20  * Finalize hash 
0930: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c  function and cal
0940: 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64  culate message d
0950: 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 69 66 20  igest */.    if 
0960: 28 21 45 56 50 5f 44 69 67 65 73 74 46 69 6e 61  (!EVP_DigestFina
0970: 6c 5f 65 78 28 63 74 78 2c 20 6d 64 5f 62 75 66  l_ex(ctx, md_buf
0980: 2c 20 26 6d 64 5f 6c 65 6e 29 29 20 7b 0a 09 54  , &md_len)) {..T
0990: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
09a0: 69 6e 74 65 72 70 2c 20 22 46 69 6e 61 6c 69 7a  interp, "Finaliz
09b0: 65 20 64 69 67 65 73 74 20 66 61 69 6c 65 64 3a  e digest failed:
09c0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55   ", REASON(), NU
09d0: 4c 4c 29 3b 0a 09 45 56 50 5f 4d 44 5f 43 54 58  LL);..EVP_MD_CTX
09e0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
09f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0a00: 20 20 20 7d 0a 20 20 20 20 45 56 50 5f 4d 44 5f     }.    EVP_MD_
0a10: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a  CTX_free(ctx);..
0a20: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65      /* Return me
0a30: 73 73 61 67 65 20 64 69 67 65 73 74 20 61 73 20  ssage digest as 
0a40: 65 69 74 68 65 72 20 61 20 62 69 6e 61 72 79 20  either a binary 
0a50: 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20 2a 2f  or hex string */
0a60: 0a 20 20 20 20 69 66 20 28 66 6f 72 6d 61 74 20  .    if (format 
0a70: 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 53 65 74  == 0) {..Tcl_Set
0a80: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
0a90: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
0aa0: 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64  ayObj(md_buf, md
0ab0: 5f 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 7d 20 65  _len));..    } e
0ac0: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  lse {..Tcl_Obj *
0ad0: 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f  resultObj = Tcl_
0ae0: 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73 69 67  NewObj();..unsig
0af0: 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20  ned char *ptr = 
0b00: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79  Tcl_SetByteArray
0b10: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a  Length(resultObj
0b20: 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 66  , md_len*2);...f
0b30: 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  or (unsigned int
0b40: 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c   i = 0; i < md_l
0b50: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  en; i++) {..    
0b60: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64  *ptr++ = hex[(md
0b70: 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20  _buf[i] >> 4) & 
0b80: 30 78 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72  0x0F];..    *ptr
0b90: 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b  ++ = hex[md_buf[
0ba0: 69 5d 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 09  i] & 0x0F];..}..
0bb0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
0bc0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
0bd0: 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  bj);.    }.    r
0be0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
0bf0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
0c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c30: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  *****/../*. *---
0c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c80: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 48 61 73  . *. * DigestHas
0c90: 68 46 75 6e 63 74 69 6f 6e 20 2d 2d 0a 20 2a 0a  hFunction --. *.
0ca0: 20 2a 09 20 43 61 6c 63 75 6c 61 74 65 20 6d 65   *. Calculate me
0cb0: 73 73 61 67 65 20 64 69 67 65 73 74 20 75 73 69  ssage digest usi
0cc0: 6e 67 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e  ng hash function
0cd0: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
0ce0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43  . *.TCL_OK or TC
0cf0: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69  L_ERROR. *. * Si
0d00: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
0d10: 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65  ets result to me
0d20: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20  ssage digest or 
0d30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a  error message. *
0d40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 0a 44  ------. */.int.D
0d90: 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f  igestHashFunctio
0da0: 6e 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  n(Tcl_Interp *in
0db0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
0dc0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
0dd0: 62 6a 76 5b 5d 2c 20 63 6f 6e 73 74 20 45 56 50  bjv[], const EVP
0de0: 5f 4d 44 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72  _MD *md, int for
0df0: 6d 61 74 29 20 7b 0a 20 20 20 20 63 68 61 72 20  mat) {.    char 
0e00: 2a 64 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6c  *data;.    int l
0e10: 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  en;.    unsigned
0e20: 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20   int md_len;.   
0e30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
0e40: 64 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44  d_buf[EVP_MAX_MD
0e50: 5f 53 49 5a 45 5d 3b 0a 0a 20 20 20 20 69 66 20  _SIZE];..    if 
0e60: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
0e70: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
0e80: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
0e90: 20 22 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72   "data");..retur
0ea0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
0eb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64   }..    /* Get d
0ec0: 61 74 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20  ata */.    data 
0ed0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
0ee0: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ayFromObj(objv[1
0ef0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66  ], &len);.    if
0f00: 20 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c   (data == NULL |
0f10: 7c 20 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54  | len == 0) {..T
0f20: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
0f30: 65 72 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20  erp, "No data", 
0f40: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
0f50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
0f60: 0a 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  .    /* Calculat
0f70: 65 20 68 61 73 68 20 76 61 6c 75 65 2c 20 63 72  e hash value, cr
0f80: 65 61 74 65 20 62 69 6e 2f 68 65 78 20 72 65 70  eate bin/hex rep
0f90: 72 65 73 65 6e 74 61 74 69 6f 6e 2c 20 61 6e 64  resentation, and
0fa0: 20 77 72 69 74 65 20 74 6f 20 72 65 73 75 6c 74   write to result
0fb0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 50 5f   */.    if (EVP_
0fc0: 44 69 67 65 73 74 28 64 61 74 61 2c 20 28 73 69  Digest(data, (si
0fd0: 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 75  ze_t) len, md_bu
0fe0: 66 2c 20 26 6d 64 5f 6c 65 6e 2c 20 6d 64 2c 20  f, &md_len, md, 
0ff0: 4e 55 4c 4c 29 29 20 7b 0a 09 69 66 20 28 66 6f  NULL)) {..if (fo
1000: 72 6d 61 74 20 3d 3d 20 30 29 20 7b 0a 09 20 20  rmat == 0) {..  
1010: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1020: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1030: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d  ewByteArrayObj(m
1040: 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b  d_buf, md_len));
1050: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ...} else {..   
1060: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74   Tcl_Obj *result
1070: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Obj = Tcl_NewObj
1080: 28 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65  ();..    unsigne
1090: 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54 63  d char *ptr = Tc
10a0: 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65  l_SetByteArrayLe
10b0: 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20  ngth(resultObj, 
10c0: 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20 20 20  md_len*2);...   
10d0: 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69   for (unsigned i
10e0: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64  nt i = 0; i < md
10f0: 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 2a  _len; i++) {...*
1100: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f  ptr++ = hex[(md_
1110: 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30  buf[i] >> 4) & 0
1120: 78 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20 3d  x0F];...*ptr++ =
1130: 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26   hex[md_buf[i] &
1140: 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d 0a 09   0x0F];..    }..
1150: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1160: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f  (interp, resultO
1170: 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65  bj);..}..    } e
1180: 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  lse {..Tcl_Appen
1190: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11a0: 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69 6f  "Hash calculatio
11b0: 6e 20 65 72 72 6f 72 3a 22 2c 20 52 45 41 53 4f  n error:", REASO
11c0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
11d0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
11e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1200: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
1210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
1250: 20 2a 20 44 69 67 65 73 74 4f 62 6a 43 6d 64 20   * DigestObjCmd 
1260: 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20  --. *. *.Return 
1270: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 75  message digest u
1280: 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69 66  sing user specif
1290: 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f  ied hash functio
12a0: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  n.. *. * Returns
12b0: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54  :. *.TCL_OK or T
12c0: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53  CL_ERROR. *. * S
12d0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
12e0: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d  Sets result to m
12f0: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72  essage digest or
1300: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
1310: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1350: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
1360: 69 63 20 69 6e 74 0a 44 69 67 65 73 74 4f 62 6a  ic int.DigestObj
1370: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
1380: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
1390: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
13a0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
13b0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
13c0: 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c  {.    int idx, l
13d0: 65 6e 2c 20 66 6f 72 6d 61 74 20 3d 20 31 2c 20  en, format = 1, 
13e0: 6b 65 79 5f 6c 65 6e 20 3d 20 30 2c 20 64 61 74  key_len = 0, dat
13f0: 61 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 63  a_len = 0;.    c
1400: 6f 6e 73 74 20 63 68 61 72 20 2a 64 69 67 65 73  onst char *diges
1410: 74 6e 61 6d 65 3b 0a 20 20 20 20 54 63 6c 5f 4f  tname;.    Tcl_O
1420: 62 6a 20 2a 64 61 74 61 4f 62 6a 20 3d 20 4e 55  bj *dataObj = NU
1430: 4c 4c 2c 20 2a 66 69 6c 65 4f 62 6a 20 3d 20 4e  LL, *fileObj = N
1440: 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ULL;.    unsigne
1450: 64 20 63 68 61 72 20 2a 6b 65 79 20 3d 20 4e 55  d char *key = NU
1460: 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56  LL;.    const EV
1470: 50 5f 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 54  P_MD *md;..    T
1480: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
1490: 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20  nterp);..    if 
14a0: 28 6f 62 6a 63 20 3c 20 33 20 7c 7c 20 6f 62 6a  (objc < 3 || obj
14b0: 63 20 3e 20 35 29 20 7b 0a 09 54 63 6c 5f 57 72  c > 5) {..Tcl_Wr
14c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14d0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 74 79 70  p, 1, objv, "typ
14e0: 65 20 3f 2d 62 69 6e 7c 2d 68 65 78 3f 20 5b 2d  e ?-bin|-hex? [-
14f0: 63 68 61 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 2d  channel chan | -
1500: 66 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20  file filename | 
1510: 3f 2d 64 61 74 61 3f 20 64 61 74 61 5d 22 29 3b  ?-data? data]");
1520: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
1530: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
1540: 2a 20 47 65 74 20 64 69 67 65 73 74 20 2a 2f 0a  * Get digest */.
1550: 20 20 20 20 64 69 67 65 73 74 6e 61 6d 65 20 3d      digestname =
1560: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
1570: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26  omObj(objv[1], &
1580: 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 64 69  len);.    if (di
1590: 67 65 73 74 6e 61 6d 65 20 3d 3d 20 4e 55 4c 4c  gestname == NULL
15a0: 20 7c 7c 20 28 6d 64 20 3d 20 45 56 50 5f 67 65   || (md = EVP_ge
15b0: 74 5f 64 69 67 65 73 74 62 79 6e 61 6d 65 28 64  t_digestbyname(d
15c0: 69 67 65 73 74 6e 61 6d 65 29 29 20 3d 3d 20 4e  igestname)) == N
15d0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
15e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15f0: 20 22 49 6e 76 61 6c 69 64 20 64 69 67 65 73 74   "Invalid digest
1600: 20 74 79 70 65 20 5c 22 22 2c 20 64 69 67 65 73   type \"", diges
1610: 74 6e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c  tname, "\"", NUL
1620: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
1630: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
1640: 20 20 2f 2a 20 4f 70 74 69 6d 61 6c 20 63 61 73    /* Optimal cas
1650: 65 20 66 6f 72 20 62 6c 6f 62 20 6f 66 20 64 61  e for blob of da
1660: 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62  ta */.    if (ob
1670: 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 72 65 74 75  jc == 3) {..retu
1680: 72 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e  rn DigestHashFun
1690: 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 2d 2d  ction(interp, --
16a0: 6f 62 6a 63 2c 20 2b 2b 6f 62 6a 76 2c 20 6d 64  objc, ++objv, md
16b0: 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 7d  , format);.    }
16c0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74  ..    /* Get opt
16d0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20  ions */.    for 
16e0: 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20  (idx = 2; idx < 
16f0: 6f 62 6a 63 2d 31 3b 20 69 64 78 2b 2b 29 20 7b  objc-1; idx++) {
1700: 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63  ..char *opt = Tc
1710: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1720: 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55  bj(objv[idx], NU
1730: 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30  LL);...if (opt[0
1740: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62  ] != '-')..    b
1750: 72 65 61 6b 3b 0a 0a 09 4f 50 54 46 4c 41 47 28  reak;...OPTFLAG(
1760: 22 2d 62 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20  "-bin", format, 
1770: 30 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62  0);..OPTFLAG("-b
1780: 69 6e 61 72 79 22 2c 20 66 6f 72 6d 61 74 2c 20  inary", format, 
1790: 30 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68  0);..OPTFLAG("-h
17a0: 65 78 22 2c 20 66 6f 72 6d 61 74 2c 20 31 29 3b  ex", format, 1);
17b0: 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 61  ..OPTFLAG("-hexa
17c0: 64 65 63 69 6d 61 6c 22 2c 20 66 6f 72 6d 61 74  decimal", format
17d0: 2c 20 31 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  , 1);..OPTOBJ("-
17e0: 64 61 74 61 22 2c 20 64 61 74 61 4f 62 6a 29 3b  data", dataObj);
17f0: 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 22  ..OPTOBJ("-file"
1800: 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54  , fileObj);..OPT
1810: 4f 42 4a 28 22 2d 66 69 6c 65 6e 61 6d 65 22 2c  OBJ("-filename",
1820: 20 66 69 6c 65 4f 62 6a 29 3b 0a 0a 09 4f 50 54   fileObj);...OPT
1830: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d  BAD("option", "-
1840: 62 69 6e 2c 20 2d 64 61 74 61 2c 20 2d 66 69 6c  bin, -data, -fil
1850: 65 2c 20 2d 66 69 6c 65 6e 61 6d 65 2c 20 2d 6b  e, -filename, -k
1860: 65 79 2c 20 6f 72 20 2d 68 65 78 22 29 3b 0a 09  ey, or -hex");..
1870: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1880: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1890: 49 66 20 6e 6f 20 6f 70 74 69 6f 6e 20 66 6f 72  If no option for
18a0: 20 6c 61 73 74 20 61 72 67 2c 20 74 68 65 6e 20   last arg, then 
18b0: 69 74 73 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  its the data */.
18c0: 20 20 20 20 69 66 20 28 69 64 78 20 3c 20 6f 62      if (idx < ob
18d0: 6a 63 29 20 7b 0a 09 64 61 74 61 4f 62 6a 20 3d  jc) {..dataObj =
18e0: 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 20 20 20 20   objv[idx];.    
18f0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 64  }..    /* Calc d
1900: 69 67 65 73 74 20 6f 6e 20 66 69 6c 65 20 6f 72  igest on file or
1910: 20 64 61 74 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   data blob */.  
1920: 20 20 69 66 20 28 66 69 6c 65 4f 62 6a 20 21 3d    if (fileObj !=
1930: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
1940: 20 44 69 67 65 73 74 46 69 6c 65 28 69 6e 74 65   DigestFile(inte
1950: 72 70 2c 20 66 69 6c 65 4f 62 6a 2c 20 6d 64 2c  rp, fileObj, md,
1960: 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 7d 20   format);.    } 
1970: 65 6c 73 65 20 69 66 20 28 64 61 74 61 4f 62 6a  else if (dataObj
1980: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
1990: 5f 4f 62 6a 20 2a 6f 62 6a 73 5b 32 5d 3b 0a 09  _Obj *objs[2];..
19a0: 6f 62 6a 73 5b 30 5d 20 3d 20 4e 55 4c 4c 3b 0a  objs[0] = NULL;.
19b0: 09 6f 62 6a 73 5b 31 5d 20 3d 20 64 61 74 61 4f  .objs[1] = dataO
19c0: 62 6a 3b 0a 09 72 65 74 75 72 6e 20 44 69 67 65  bj;..return Dige
19d0: 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e 28 69  stHashFunction(i
19e0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 73 2c 20  nterp, 2, objs, 
19f0: 6d 64 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20  md, format);.   
1a00: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   }..    Tcl_Appe
1a10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a20: 20 22 4e 6f 20 64 61 74 61 20 73 70 65 63 69 66   "No data specif
1a30: 69 65 64 2e 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20  ied.", NULL);.  
1a40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a50: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  OR;.}../*. *----
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1aa0: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69   *. * Message Di
1ab0: 67 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65  gest Convenience
1ac0: 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a   Commands --. *.
1ad0: 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63   *.Convenience c
1ae0: 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 6d 65 73 73  ommands for mess
1af0: 61 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a  age digests.. *.
1b00: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
1b10: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52  CL_OK or TCL_ERR
1b20: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OR. *. * Side ef
1b30: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72  fects:. *.Sets r
1b40: 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65  esult to message
1b50: 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72   digest or error
1b60: 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d   message. *. *--
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74  -. */.int Digest
1bc0: 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  MD4Cmd(ClientDat
1bd0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
1be0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1bf0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
1c00: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
1c10: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]) {.    return 
1c20: 44 69 67 65 73 74 48 61 73 68 46 75 6e 63 74 69  DigestHashFuncti
1c30: 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  on(interp, objc,
1c40: 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 34 28 29   objv, EVP_md4()
1c50: 2c 20 31 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67  , 1);.}..int Dig
1c60: 65 73 74 4d 44 35 43 6d 64 28 43 6c 69 65 6e 74  estMD5Cmd(Client
1c70: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1c80: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1c90: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
1ca0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
1cb0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75  jv[]) {.    retu
1cc0: 72 6e 20 44 69 67 65 73 74 48 61 73 68 46 75 6e  rn DigestHashFun
1cd0: 63 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62  ction(interp, ob
1ce0: 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64  jc, objv, EVP_md
1cf0: 35 28 29 2c 20 31 29 3b 0a 7d 0a 0a 69 6e 74 20  5(), 1);.}..int 
1d00: 44 69 67 65 73 74 53 48 41 31 43 6d 64 28 43 6c  DigestSHA1Cmd(Cl
1d10: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
1d20: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
1d30: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
1d40: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
1d50: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
1d60: 72 65 74 75 72 6e 20 44 69 67 65 73 74 48 61 73  return DigestHas
1d70: 68 46 75 6e 63 74 69 6f 6e 28 69 6e 74 65 72 70  hFunction(interp
1d80: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56  , objc, objv, EV
1d90: 50 5f 73 68 61 31 28 29 2c 20 31 29 3b 0a 7d 0a  P_sha1(), 1);.}.
1da0: 0a 69 6e 74 20 44 69 67 65 73 74 53 48 41 32 35  .int DigestSHA25
1db0: 36 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  6Cmd(ClientData 
1dc0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
1dd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1de0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
1df0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
1e00: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69   {.    return Di
1e10: 67 65 73 74 48 61 73 68 46 75 6e 63 74 69 6f 6e  gestHashFunction
1e20: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f  (interp, objc, o
1e30: 62 6a 76 2c 20 45 56 50 5f 73 68 61 32 35 36 28  bjv, EVP_sha256(
1e40: 29 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  ), 1);.}../*. *-
1e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e90: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67  --. *. * Tls_Dig
1ea0: 65 73 74 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20  estCommands --. 
1eb0: 2a 0a 20 2a 09 43 72 65 61 74 65 20 64 69 67 65  *. *.Create dige
1ec0: 73 74 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20  st commands. *. 
1ed0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43  * Returns:. *.TC
1ee0: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  L_OK or TCL_ERRO
1ef0: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  R. *. * Side eff
1f00: 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73  ects:. *.Creates
1f10: 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d   commands. *. *-
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44  --. */.int Tls_D
1f70: 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 28 54 63  igestCommands(Tc
1f80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f90: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  ) {.    Tcl_Crea
1fa0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
1fb0: 65 72 70 2c 20 22 74 6c 73 3a 3a 64 69 67 65 73  erp, "tls::diges
1fc0: 74 22 2c 20 44 69 67 65 73 74 4f 62 6a 43 6d 64  t", DigestObjCmd
1fd0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
1fe0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
1ff0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
2000: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
2010: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
2020: 22 74 6c 73 3a 3a 6d 64 34 22 2c 20 44 69 67 65  "tls::md4", Dige
2030: 73 74 4d 44 34 43 6d 64 2c 20 28 43 6c 69 65 6e  stMD4Cmd, (Clien
2040: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
2050: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
2060: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
2070: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
2080: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64  interp, "tls::md
2090: 35 22 2c 20 44 69 67 65 73 74 4d 44 35 43 6d 64  5", DigestMD5Cmd
20a0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
20b0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
20c0: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
20d0: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
20e0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
20f0: 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 44 69 67  "tls::sha1", Dig
2100: 65 73 74 53 48 41 31 43 6d 64 2c 20 28 43 6c 69  estSHA1Cmd, (Cli
2110: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
2120: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
2130: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
2140: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
2150: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
2160: 73 68 61 32 35 36 22 2c 20 44 69 67 65 73 74 53  sha256", DigestS
2170: 48 41 32 35 36 43 6d 64 2c 20 28 43 6c 69 65 6e  HA256Cmd, (Clien
2180: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
2190: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
21a0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72  NULL);.    retur
21b0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a           n TCL_OK;.}..