Hex Artifact Content

Artifact 5a7f47946f4e0097e87f4d6f023f7490b643be15d91ec091e945127444710e41:


0000: 2f 2a 0a 20 2a 20 45 6e 63 72 79 70 74 69 6f 6e  /*. * Encryption
0010: 20 46 75 6e 63 74 69 6f 6e 73 20 4d 6f 64 75 6c   Functions Modul
0020: 65 0a 20 2a 0a 20 2a 20 54 68 69 73 20 6d 6f 64  e. *. * This mod
0030: 75 6c 65 20 70 72 6f 76 69 64 65 73 20 63 6f 6d  ule provides com
0040: 6d 61 6e 64 73 20 74 68 61 74 20 63 61 6e 20 62  mands that can b
0050: 65 20 75 73 65 64 20 74 6f 20 65 6e 63 72 79 70  e used to encryp
0060: 74 20 6f 72 20 64 65 63 72 79 70 74 20 64 61 74  t or decrypt dat
0070: 61 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67  a.. *. * Copyrig
0080: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61  ht (C) 2023 Bria
0090: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a 2f  n O'Hagan. *. */
00a0: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49  ..#include "tlsI
00b0: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
00c0: 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63 6c  tclOpts.h".#incl
00d0: 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e 63  ude <tcl.h>.#inc
00e0: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
00f0: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0100: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
0110: 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 23 69 66 20  nssl/evp.h>.#if 
0120: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
0130: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 30 30  NUMBER >= 0x3000
0140: 30 30 30 30 4c 0a 23 69 6e 63 6c 75 64 65 20 3c  0000L.#include <
0150: 6f 70 65 6e 73 73 6c 2f 70 61 72 61 6d 73 2e 68  openssl/params.h
0160: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4d 61 63  >.#endif../* Mac
0170: 72 6f 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  ros */.#define B
0180: 55 46 46 45 52 5f 53 49 5a 45 09 33 32 37 36 38  UFFER_SIZE.32768
0190: 0a 0a 2f 2a 20 45 6e 63 72 79 70 74 69 6f 6e 20  ../* Encryption 
01a0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 23 64 65  functions */.#de
01b0: 66 69 6e 65 20 54 59 50 45 5f 4d 44 09 09 30 78  fine TYPE_MD..0x
01c0: 30 31 30 0a 23 64 65 66 69 6e 65 20 54 59 50 45  010.#define TYPE
01d0: 5f 48 4d 41 43 09 30 78 30 32 30 0a 23 64 65 66  _HMAC.0x020.#def
01e0: 69 6e 65 20 54 59 50 45 5f 43 4d 41 43 09 30 78  ine TYPE_CMAC.0x
01f0: 30 34 30 0a 23 64 65 66 69 6e 65 20 54 59 50 45  040.#define TYPE
0200: 5f 4d 41 43 09 30 78 30 38 30 0a 23 64 65 66 69  _MAC.0x080.#defi
0210: 6e 65 20 54 59 50 45 5f 45 4e 43 52 59 50 54 09  ne TYPE_ENCRYPT.
0220: 30 78 31 30 30 0a 23 64 65 66 69 6e 65 20 54 59  0x100.#define TY
0230: 50 45 5f 44 45 43 52 59 50 54 09 30 78 32 30 30  PE_DECRYPT.0x200
0240: 0a 23 64 65 66 69 6e 65 20 54 59 50 45 5f 53 49  .#define TYPE_SI
0250: 47 4e 09 30 78 34 30 30 0a 23 64 65 66 69 6e 65  GN.0x400.#define
0260: 20 54 59 50 45 5f 56 45 52 49 46 59 09 30 78 38   TYPE_VERIFY.0x8
0270: 30 30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  00../***********
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
02c0: 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20   This structure 
02d0: 64 65 66 69 6e 65 73 20 74 68 65 20 70 65 72 2d  defines the per-
02e0: 69 6e 73 74 61 6e 63 65 20 73 74 61 74 65 20 6f  instance state o
02f0: 66 20 61 20 65 6e 63 72 79 70 74 20 6f 70 65 72  f a encrypt oper
0300: 61 74 69 6f 6e 2e 0a 20 2a 2f 0a 74 79 70 65 64  ation.. */.typed
0310: 65 66 20 73 74 72 75 63 74 20 45 6e 63 72 79 70  ef struct Encryp
0320: 74 53 74 61 74 65 20 7b 0a 09 69 6e 74 20 74 79  tState {..int ty
0330: 70 65 3b 09 09 2f 2a 20 4f 70 65 72 61 74 69 6f  pe;../* Operatio
0340: 6e 20 74 79 70 65 20 2a 2f 0a 0a 09 54 63 6c 5f  n type */...Tcl_
0350: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09  Interp *interp;.
0360: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72  /* Current inter
0370: 70 72 65 74 65 72 20 2a 2f 0a 09 45 56 50 5f 43  preter */..EVP_C
0380: 49 50 48 45 52 5f 43 54 58 20 2a 63 74 78 3b 09  IPHER_CTX *ctx;.
0390: 2f 2a 20 43 69 70 68 65 72 20 43 6f 6e 74 65 78  /* Cipher Contex
03a0: 74 20 2a 2f 0a 09 54 63 6c 5f 43 6f 6d 6d 61 6e  t */..Tcl_Comman
03b0: 64 20 74 6f 6b 65 6e 3b 09 2f 2a 20 43 6f 6d 6d  d token;./* Comm
03c0: 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a 7d 20 45  and token */.} E
03d0: 6e 63 72 79 70 74 53 74 61 74 65 3b 0a 0a 0a 2f  ncryptState;.../
03e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 6e  -------. *. * En
0430: 63 72 79 70 74 53 74 61 74 65 4e 65 77 20 2d 2d  cryptStateNew --
0440: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
0450: 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20 70  tion creates a p
0460: 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 61 74  er-instance stat
0470: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
0480: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
0490: 20 2a 09 53 74 61 74 65 20 73 74 72 75 63 74 75   *.State structu
04a0: 72 65 20 70 6f 69 6e 74 65 72 0a 20 2a 0a 20 2a  re pointer. *. *
04b0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
04c0: 2a 09 43 72 65 61 74 65 73 20 73 74 72 75 63 74  *.Creates struct
04d0: 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ure. *. *-------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
0520: 0a 45 6e 63 72 79 70 74 53 74 61 74 65 20 2a 45  .EncryptState *E
0530: 6e 63 72 79 70 74 53 74 61 74 65 4e 65 77 28 54  ncryptStateNew(T
0540: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0550: 70 2c 20 69 6e 74 20 74 79 70 65 29 20 7b 0a 20  p, int type) {. 
0560: 20 20 20 45 6e 63 72 79 70 74 53 74 61 74 65 20     EncryptState 
0570: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 45 6e 63  *statePtr = (Enc
0580: 72 79 70 74 53 74 61 74 65 20 2a 29 20 63 6b 61  ryptState *) cka
0590: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20  lloc((unsigned) 
05a0: 73 69 7a 65 6f 66 28 45 6e 63 72 79 70 74 53 74  sizeof(EncryptSt
05b0: 61 74 65 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  ate));..    if (
05c0: 73 74 61 74 65 50 74 72 20 21 3d 20 4e 55 4c 4c  statePtr != NULL
05d0: 29 20 7b 0a 09 6d 65 6d 73 65 74 28 73 74 61 74  ) {..memset(stat
05e0: 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ePtr, 0, sizeof(
05f0: 45 6e 63 72 79 70 74 53 74 61 74 65 29 29 3b 0a  EncryptState));.
0600: 09 73 74 61 74 65 50 74 72 2d 3e 74 79 70 65 20  .statePtr->type 
0610: 3d 20 74 79 70 65 3b 09 09 2f 2a 20 4f 70 65 72  = type;../* Oper
0620: 61 74 69 6f 6e 20 74 79 70 65 20 2a 2f 0a 09 73  ation type */..s
0630: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 20  tatePtr->interp 
0640: 3d 20 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72  = interp;./* Cur
0650: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
0660: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63   */..statePtr->c
0670: 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43  tx = NULL;../* C
0680: 69 70 68 65 72 20 43 6f 6e 74 65 78 74 20 2a 2f  ipher Context */
0690: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65  ..statePtr->toke
06a0: 6e 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43 6f  n = NULL;../* Co
06b0: 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20  mmand token */. 
06c0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
06d0: 73 74 61 74 65 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a  statePtr;.}../*.
06e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 6e 63 72  -----. *. * Encr
0730: 79 70 74 53 74 61 74 65 46 72 65 65 20 2d 2d 0a  yptStateFree --.
0740: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
0750: 69 6f 6e 20 64 65 6c 65 74 65 73 20 61 20 73 74  ion deletes a st
0760: 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ate data structu
0770: 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  re. *. * Returns
0780: 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a  :. *.Nothing. *.
0790: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
07a0: 0a 20 2a 09 52 65 6d 6f 76 65 73 20 73 74 72 75  . *.Removes stru
07b0: 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  cture. *. *-----
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0800: 2a 2f 0a 76 6f 69 64 20 45 6e 63 72 79 70 74 53  */.void EncryptS
0810: 74 61 74 65 46 72 65 65 28 45 6e 63 72 79 70 74  tateFree(Encrypt
0820: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29  State *statePtr)
0830: 20 7b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   {.    if (state
0840: 50 74 72 20 3d 3d 20 28 45 6e 63 72 79 70 74 53  Ptr == (EncryptS
0850: 74 61 74 65 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a  tate *) NULL) {.
0860: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a  .return;.    }..
0870: 20 20 20 20 2f 2a 20 46 72 65 65 20 63 6f 6e 74      /* Free cont
0880: 65 78 74 20 73 74 72 75 63 74 75 72 65 73 20 2a  ext structures *
0890: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
08a0: 74 72 2d 3e 63 74 78 20 21 3d 20 28 45 56 50 5f  tr->ctx != (EVP_
08b0: 43 49 50 48 45 52 5f 43 54 58 20 2a 29 20 4e 55  CIPHER_CTX *) NU
08c0: 4c 4c 29 20 7b 0a 09 45 56 50 5f 43 49 50 48 45  LL) {..EVP_CIPHE
08d0: 52 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65  R_CTX_free(state
08e0: 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 7d  Ptr->ctx);.    }
08f0: 0a 20 20 20 20 63 6b 66 72 65 65 28 73 74 61 74  .    ckfree(stat
0900: 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  ePtr);.}../*****
0910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0950: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
09a0: 45 6e 63 72 79 70 74 49 6e 69 74 69 61 6c 69 7a  EncryptInitializ
09b0: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69  e --. *. *.Initi
09c0: 61 6c 69 7a 65 20 61 6e 20 65 6e 63 72 79 70 74  alize an encrypt
09d0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 20 2a 0a  ion function. *.
09e0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54   * Returns:. *.T
09f0: 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  CL_OK if success
0a00: 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  ful or TCL_ERROR
0a10: 20 66 6f 72 20 66 61 69 6c 75 72 65 20 77 69 74   for failure wit
0a20: 68 20 72 65 73 75 6c 74 20 73 65 74 0a 20 2a 09  h result set. *.
0a30: 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  to error message
0a40: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
0a50: 65 63 74 73 3a 0a 20 2a 09 4e 6f 20 72 65 73 75  ects:. *.No resu
0a60: 6c 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  lt or error mess
0a70: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  age. *. *-------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
0ac0: 0a 69 6e 74 20 45 6e 63 72 79 70 74 49 6e 69 74  .int EncryptInit
0ad0: 69 61 6c 69 7a 65 28 54 63 6c 5f 49 6e 74 65 72  ialize(Tcl_Inter
0ae0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 74  p *interp, int t
0af0: 79 70 65 2c 20 45 56 50 5f 43 49 50 48 45 52 5f  ype, EVP_CIPHER_
0b00: 43 54 58 20 2a 2a 63 74 78 2c 0a 09 54 63 6c 5f  CTX **ctx,..Tcl_
0b10: 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20  Obj *cipherObj, 
0b20: 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c  Tcl_Obj *keyObj,
0b30: 20 54 63 6c 5f 4f 62 6a 20 2a 69 76 4f 62 6a 29   Tcl_Obj *ivObj)
0b40: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50   {.    const EVP
0b50: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b  _CIPHER *cipher;
0b60: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65  .    char *ciphe
0b70: 72 4e 61 6d 65 20 3d 20 20 4e 55 4c 4c 2c 20 2a  rName =  NULL, *
0b80: 6b 65 79 20 3d 20 4e 55 4c 4c 2c 20 2a 69 76 20  key = NULL, *iv 
0b90: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
0ba0: 63 69 70 68 65 72 5f 6c 65 6e 20 3d 20 30 2c 20  cipher_len = 0, 
0bb0: 64 61 74 61 5f 6c 65 6e 20 3d 20 30 2c 20 6b 65  data_len = 0, ke
0bc0: 79 5f 6c 65 6e 20 3d 20 30 2c 20 69 76 5f 6c 65  y_len = 0, iv_le
0bd0: 6e 20 3d 20 30 2c 20 72 65 73 3b 0a 0a 20 20 20  n = 0, res;..   
0be0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
0bf0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  ");..    /* Get 
0c00: 65 6e 63 72 79 70 74 69 6f 6e 20 70 61 72 61 6d  encryption param
0c10: 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20  eters */.    if 
0c20: 28 63 69 70 68 65 72 4f 62 6a 20 21 3d 20 4e 55  (cipherObj != NU
0c30: 4c 4c 29 20 7b 0a 09 63 69 70 68 65 72 4e 61 6d  LL) {..cipherNam
0c40: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
0c50: 67 46 72 6f 6d 4f 62 6a 28 63 69 70 68 65 72 4f  gFromObj(cipherO
0c60: 62 6a 2c 20 26 63 69 70 68 65 72 5f 6c 65 6e 29  bj, &cipher_len)
0c70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
0c80: 6b 65 79 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20  keyObj != NULL) 
0c90: 7b 0a 09 6b 65 79 20 3d 20 54 63 6c 5f 47 65 74  {..key = Tcl_Get
0ca0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6b 65  StringFromObj(ke
0cb0: 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b  yObj, &key_len);
0cc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 69  .    }.    if (i
0cd0: 76 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  vObj != NULL) {.
0ce0: 09 69 76 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  .iv = Tcl_GetStr
0cf0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 69 76 4f 62 6a  ingFromObj(ivObj
0d00: 2c 20 26 69 76 5f 6c 65 6e 29 3b 0a 20 20 20 20  , &iv_len);.    
0d10: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 69  }..    /* Get ci
0d20: 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 23 69 66  pher name */.#if
0d30: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
0d40: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
0d50: 30 30 30 30 4c 0a 20 20 20 20 63 69 70 68 65 72  0000L.    cipher
0d60: 20 3d 20 45 56 50 5f 67 65 74 5f 63 69 70 68 65   = EVP_get_ciphe
0d70: 72 62 79 6e 61 6d 65 28 63 69 70 68 65 72 4e 61  rbyname(cipherNa
0d80: 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63  me);.#else.    c
0d90: 69 70 68 65 72 20 3d 20 45 56 50 5f 43 49 50 48  ipher = EVP_CIPH
0da0: 45 52 5f 66 65 74 63 68 28 4e 55 4c 4c 2c 20 63  ER_fetch(NULL, c
0db0: 69 70 68 65 72 4e 61 6d 65 2c 20 4e 55 4c 4c 29  ipherName, NULL)
0dc0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20  ;.#endif.    if 
0dd0: 28 63 69 70 68 65 72 20 3d 3d 20 4e 55 4c 4c 29  (cipher == NULL)
0de0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
0df0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e  sult(interp, "In
0e00: 76 61 6c 69 64 20 63 69 70 68 65 72 3a 20 5c 22  valid cipher: \"
0e10: 22 2c 20 63 69 70 68 65 72 4e 61 6d 65 2c 20 22  ", cipherName, "
0e20: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  \"", NULL);..ret
0e30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0e40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
0e50: 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
0e60: 7a 65 20 74 68 65 20 63 6f 6e 74 65 78 74 20 2a  ze the context *
0e70: 2f 0a 20 20 20 20 69 66 28 28 2a 63 74 78 20 3d  /.    if((*ctx =
0e80: 20 45 56 50 5f 43 49 50 48 45 52 5f 43 54 58 5f   EVP_CIPHER_CTX_
0e90: 6e 65 77 28 29 29 20 3d 3d 20 4e 55 4c 4c 29 20  new()) == NULL) 
0ea0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
0eb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d  ult(interp, "Mem
0ec0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
0ed0: 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20  rror", (char *) 
0ee0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
0ef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
0f00: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
0f10: 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  ze the operation
0f20: 2e 20 4e 65 65 64 20 61 70 70 72 6f 70 72 69 61  . Need appropria
0f30: 74 65 20 6b 65 79 20 61 6e 64 20 69 76 20 73 69  te key and iv si
0f40: 7a 65 2e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  ze. */.#if OPENS
0f50: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
0f60: 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
0f70: 20 20 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20      if (type == 
0f80: 54 59 50 45 5f 45 4e 43 52 59 50 54 29 20 7b 0a  TYPE_ENCRYPT) {.
0f90: 09 72 65 73 20 3d 20 45 56 50 5f 45 6e 63 72 79  .res = EVP_Encry
0fa0: 70 74 49 6e 69 74 5f 65 78 28 2a 63 74 78 2c 20  ptInit_ex(*ctx, 
0fb0: 63 69 70 68 65 72 2c 20 4e 55 4c 4c 2c 20 6b 65  cipher, NULL, ke
0fc0: 79 2c 20 69 76 29 3b 0a 20 20 20 20 7d 20 65 6c  y, iv);.    } el
0fd0: 73 65 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f  se {..res = EVP_
0fe0: 44 65 63 72 79 70 74 49 6e 69 74 5f 65 78 28 2a  DecryptInit_ex(*
0ff0: 63 74 78 2c 20 63 69 70 68 65 72 2c 20 4e 55 4c  ctx, cipher, NUL
1000: 4c 2c 20 6b 65 79 2c 20 69 76 29 3b 0a 20 20 20  L, key, iv);.   
1010: 20 7d 0a 23 65 6c 73 65 0a 09 4f 53 53 4c 5f 50   }.#else..OSSL_P
1020: 41 52 41 4d 20 70 61 72 61 6d 73 5b 32 5d 3b 0a  ARAM params[2];.
1030: 09 69 6e 74 20 69 6e 64 65 78 20 3d 20 30 3b 0a  .int index = 0;.
1040: 0a 09 69 66 20 28 69 76 20 21 3d 20 4e 55 4c 4c  ..if (iv != NULL
1050: 29 20 7b 0a 09 20 20 20 20 70 61 72 61 6d 73 5b  ) {..    params[
1060: 69 6e 64 65 78 2b 2b 5d 20 3d 20 4f 53 53 4c 5f  index++] = OSSL_
1070: 50 41 52 41 4d 5f 63 6f 6e 73 74 72 75 63 74 5f  PARAM_construct_
1080: 6f 63 74 65 74 5f 73 74 72 69 6e 67 28 4f 53 53  octet_string(OSS
1090: 4c 5f 43 49 50 48 45 52 5f 50 41 52 41 4d 5f 49  L_CIPHER_PARAM_I
10a0: 56 2c 20 28 76 6f 69 64 20 2a 29 20 69 76 2c 20  V, (void *) iv, 
10b0: 28 73 69 7a 65 5f 74 29 20 69 76 5f 6c 65 6e 29  (size_t) iv_len)
10c0: 3b 0a 09 7d 0a 09 70 61 72 61 6d 73 5b 69 6e 64  ;..}..params[ind
10d0: 65 78 5d 20 3d 20 4f 53 53 4c 5f 50 41 52 41 4d  ex] = OSSL_PARAM
10e0: 5f 63 6f 6e 73 74 72 75 63 74 5f 65 6e 64 28 29  _construct_end()
10f0: 3b 0a 0a 20 20 20 20 69 66 20 28 74 79 70 65 20  ;..    if (type 
1100: 3d 3d 20 54 59 50 45 5f 45 4e 43 52 59 50 54 29  == TYPE_ENCRYPT)
1110: 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 45 6e   {..res = EVP_En
1120: 63 72 79 70 74 49 6e 69 74 5f 65 78 32 28 63 74  cryptInit_ex2(ct
1130: 78 2c 20 63 69 70 68 65 72 2c 20 6b 65 79 2c 20  x, cipher, key, 
1140: 69 76 2c 20 70 61 72 61 6d 73 29 3b 0a 20 20 20  iv, params);.   
1150: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
1160: 20 45 56 50 5f 44 65 63 72 79 70 74 49 6e 69 74   EVP_DecryptInit
1170: 5f 65 78 32 28 63 74 78 2c 20 63 69 70 68 65 72  _ex2(ctx, cipher
1180: 2c 20 6b 65 79 2c 20 69 76 2c 20 70 61 72 61 6d  , key, iv, param
1190: 73 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  s);.    }.#endif
11a0: 0a 0a 20 20 20 20 69 66 28 21 72 65 73 29 20 7b  ..    if(!res) {
11b0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
11c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74  lt(interp, "Init
11d0: 69 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22  ialize failed: "
11e0: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c  , REASON(), NULL
11f0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
1200: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
1210: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1220: 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d  ----------------
1250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
1270: 20 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 2d   EncryptUpdate -
1280: 2d 0a 20 2a 0a 20 2a 09 55 70 64 61 74 65 20 61  -. *. *.Update a
1290: 6e 20 65 6e 63 72 79 70 74 69 6f 6e 20 66 75 6e  n encryption fun
12a0: 63 74 69 6f 6e 20 77 69 74 68 20 64 61 74 61 0a  ction with data.
12b0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
12c0: 2a 09 31 20 69 66 20 73 75 63 63 65 73 73 66 75  *.1 if successfu
12d0: 6c 20 6f 72 20 30 20 66 6f 72 20 66 61 69 6c 75  l or 0 for failu
12e0: 72 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  re. *. * Side ef
12f0: 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 20 65  fects:. *.Adds e
1300: 6e 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f  ncrypted data to
1310: 20 62 75 66 66 65 72 20 6f 72 20 73 65 74 73 20   buffer or sets 
1320: 72 65 73 75 6c 74 20 74 6f 20 65 72 72 6f 72 20  result to error 
1330: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d  message. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1380: 0a 20 2a 2f 0a 69 6e 74 20 45 6e 63 72 79 70 74  . */.int Encrypt
1390: 55 70 64 61 74 65 28 54 63 6c 5f 49 6e 74 65 72  Update(Tcl_Inter
13a0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 74  p *interp, int t
13b0: 79 70 65 2c 20 45 56 50 5f 43 49 50 48 45 52 5f  ype, EVP_CIPHER_
13c0: 43 54 58 20 2a 63 74 78 2c 20 75 6e 73 69 67 6e  CTX *ctx, unsign
13d0: 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c  ed char *outbuf,
13e0: 0a 09 69 6e 74 20 2a 6f 75 74 5f 6c 65 6e 2c 20  ..int *out_len, 
13f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
1400: 61 74 61 2c 20 69 6e 74 20 64 61 74 61 5f 6c 65  ata, int data_le
1410: 6e 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  n) {.    int res
1420: 2c 20 6c 65 6e 20 3d 20 30 3b 0a 0a 20 20 20 20  , len = 0;..    
1430: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
1440: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 63 72 79  );..    /* Encry
1450: 70 74 2f 64 65 63 72 79 70 74 20 64 61 74 61 20  pt/decrypt data 
1460: 2a 2f 0a 20 20 20 20 69 66 20 28 74 79 70 65 20  */.    if (type 
1470: 3d 3d 20 54 59 50 45 5f 45 4e 43 52 59 50 54 29  == TYPE_ENCRYPT)
1480: 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 45 6e   {..res = EVP_En
1490: 63 72 79 70 74 55 70 64 61 74 65 28 63 74 78 2c  cryptUpdate(ctx,
14a0: 20 6f 75 74 62 75 66 2c 20 6f 75 74 5f 6c 65 6e   outbuf, out_len
14b0: 2c 20 64 61 74 61 2c 20 64 61 74 61 5f 6c 65 6e  , data, data_len
14c0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
14d0: 09 72 65 73 20 3d 20 45 56 50 5f 44 65 63 72 79  .res = EVP_Decry
14e0: 70 74 55 70 64 61 74 65 28 63 74 78 2c 20 6f 75  ptUpdate(ctx, ou
14f0: 74 62 75 66 2c 20 6f 75 74 5f 6c 65 6e 2c 20 64  tbuf, out_len, d
1500: 61 74 61 2c 20 64 61 74 61 5f 6c 65 6e 29 3b 0a  ata, data_len);.
1510: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 72      }..    if (r
1520: 65 73 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  es) {..return TC
1530: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  L_OK;.    } else
1540: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
1550: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 70  sult(interp, "Up
1560: 64 61 74 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  date failed: ", 
1570: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
1580: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
1590: 4f 52 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a  OR;.    }.}../*.
15a0: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 6e 63 72  -----. *. * Encr
15f0: 79 70 74 46 69 6e 61 6c 69 7a 65 20 2d 2d 0a 20  yptFinalize --. 
1600: 2a 0a 20 2a 09 46 69 6e 61 6c 69 7a 65 20 61 6e  *. *.Finalize an
1610: 20 65 6e 63 72 79 70 74 69 6f 6e 20 66 75 6e 63   encryption func
1620: 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 74 75 72  tion. *. * Retur
1630: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66  ns:. *.TCL_OK if
1640: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54   successful or T
1650: 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 69  CL_ERROR for fai
1660: 6c 75 72 65 20 77 69 74 68 20 72 65 73 75 6c 74  lure with result
1670: 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72   set. *.to error
1680: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20   message.. *. * 
1690: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
16a0: 09 41 64 64 73 20 65 6e 63 72 79 70 74 65 64 20  .Adds encrypted 
16b0: 64 61 74 61 20 74 6f 20 62 75 66 66 65 72 20 6f  data to buffer o
16c0: 72 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f  r sets result to
16d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
16e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20  -------. */.int 
1730: 45 6e 63 72 79 70 74 46 69 6e 61 6c 69 7a 65 28  EncryptFinalize(
1740: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1750: 72 70 2c 20 69 6e 74 20 74 79 70 65 2c 20 45 56  rp, int type, EV
1760: 50 5f 43 49 50 48 45 52 5f 43 54 58 20 2a 63 74  P_CIPHER_CTX *ct
1770: 78 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  x, unsigned char
1780: 20 2a 6f 75 74 62 75 66 2c 0a 09 69 6e 74 20 2a   *outbuf,..int *
1790: 6f 75 74 5f 6c 65 6e 29 20 7b 0a 20 20 20 20 69  out_len) {.    i
17a0: 6e 74 20 72 65 73 2c 20 6c 65 6e 20 3d 20 30 3b  nt res, len = 0;
17b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
17c0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
17d0: 20 46 69 6e 61 6c 69 7a 65 20 64 61 74 61 20 2a   Finalize data *
17e0: 2f 0a 20 20 20 20 69 66 20 28 74 79 70 65 20 3d  /.    if (type =
17f0: 3d 20 54 59 50 45 5f 45 4e 43 52 59 50 54 29 20  = TYPE_ENCRYPT) 
1800: 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 45 6e 63  {..res = EVP_Enc
1810: 72 79 70 74 46 69 6e 61 6c 5f 65 78 28 63 74 78  ryptFinal_ex(ctx
1820: 2c 20 6f 75 74 62 75 66 2c 20 6f 75 74 5f 6c 65  , outbuf, out_le
1830: 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  n);.    } else {
1840: 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 65 63 72  ..res = EVP_Decr
1850: 79 70 74 46 69 6e 61 6c 5f 65 78 28 63 74 78 2c  yptFinal_ex(ctx,
1860: 20 6f 75 74 62 75 66 2c 20 6f 75 74 5f 6c 65 6e   outbuf, out_len
1870: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1880: 20 28 72 65 73 29 20 7b 0a 09 72 65 74 75 72 6e   (res) {..return
1890: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65   TCL_OK;.    } e
18a0: 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  lse {..Tcl_Appen
18b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18c0: 22 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64  "Finalize failed
18d0: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e  : ", REASON(), N
18e0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
18f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 7d  L_ERROR;.    }.}
1900: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1940: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d  ******/../*. *--
1950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1990: 2d 0a 20 2a 0a 20 2a 20 45 6e 63 72 79 70 74 49  -. *. * EncryptI
19a0: 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 20 2d 2d  nstanceObjCmd --
19b0: 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72 20 66  . *. *.Handler f
19c0: 6f 72 20 65 6e 63 72 79 70 74 2f 64 65 63 72 79  or encrypt/decry
19d0: 70 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 73 74 61  pt command insta
19e0: 6e 63 65 73 2e 20 55 73 65 64 20 74 6f 20 75 70  nces. Used to up
19f0: 64 61 74 65 0a 20 2a 09 61 6e 64 20 66 69 6e 61  date. *.and fina
1a00: 6c 69 7a 65 20 64 61 74 61 20 66 6f 72 20 65 6e  lize data for en
1a10: 63 72 79 70 74 2f 64 65 63 72 79 70 74 20 66 75  crypt/decrypt fu
1a20: 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65  nction.. *. * Re
1a30: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
1a40: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
1a50: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
1a60: 3a 0a 20 2a 09 41 64 64 73 20 64 61 74 61 20 74  :. *.Adds data t
1a70: 6f 20 65 6e 63 72 79 70 74 2f 64 65 63 72 79 70  o encrypt/decryp
1a80: 74 20 66 75 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a  t function. *. *
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ad0: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 45 6e 63 72  ---. */.int Encr
1ae0: 79 70 74 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d  yptInstanceObjCm
1af0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
1b00: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
1b10: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
1b20: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
1b30: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
1b40: 20 20 20 20 45 6e 63 72 79 70 74 53 74 61 74 65      EncryptState
1b50: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 45 6e   *statePtr = (En
1b60: 63 72 79 70 74 53 74 61 74 65 20 2a 29 20 63 6c  cryptState *) cl
1b70: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 69 6e  ientData;.    in
1b80: 74 20 66 6e 2c 20 64 61 74 61 5f 6c 65 6e 20 3d  t fn, data_len =
1b90: 20 30 2c 20 6f 75 74 5f 6c 65 6e 3b 0a 20 20 20   0, out_len;.   
1ba0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 4e 55   char *data = NU
1bb0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
1bc0: 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 20 20 20 20  *resultObj;.    
1bd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
1be0: 75 74 62 75 66 3b 0a 20 20 20 20 73 74 61 74 69  utbuf;.    stati
1bf0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e  c const char *in
1c00: 73 74 61 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d 20  stance_fns [] = 
1c10: 7b 20 22 66 69 6e 61 6c 69 7a 65 22 2c 20 22 75  { "finalize", "u
1c20: 70 64 61 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b 0a  pdate", NULL };.
1c30: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
1c40: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
1c50: 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75  Validate arg cou
1c60: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62  nt */.    if (ob
1c70: 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e  jc < 2 || objc >
1c80: 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   3) {..Tcl_Wrong
1c90: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1ca0: 31 2c 20 6f 62 6a 76 2c 20 22 66 75 6e 63 74 69  1, objv, "functi
1cb0: 6f 6e 20 3f 64 61 74 61 3f 22 29 3b 0a 09 72 65  on ?data?");..re
1cc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
1ce0: 74 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  t function */.  
1cf0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
1d00: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
1d10: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 69 6e 73 74 61  , objv[1], insta
1d20: 6e 63 65 5f 66 6e 73 2c 20 22 66 75 6e 63 74 69  nce_fns, "functi
1d30: 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20  on", 0, &fn) != 
1d40: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
1d50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1d60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63   }..    /* Alloc
1d70: 61 74 65 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ate storage for 
1d80: 72 65 73 75 6c 74 2e 20 53 69 7a 65 20 73 68 6f  result. Size sho
1d90: 75 6c 64 20 62 65 20 64 61 74 61 20 73 69 7a 65  uld be data size
1da0: 20 2b 20 62 6c 6f 63 6b 20 73 69 7a 65 2e 20 2a   + block size. *
1db0: 2f 0a 20 20 20 20 72 65 73 75 6c 74 4f 62 6a 20  /.    resultObj 
1dc0: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
1dd0: 20 20 20 20 6f 75 74 62 75 66 20 3d 20 54 63 6c      outbuf = Tcl
1de0: 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e  _SetByteArrayLen
1df0: 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 64  gth(resultObj, d
1e00: 61 74 61 5f 6c 65 6e 2b 45 56 50 5f 4d 41 58 5f  ata_len+EVP_MAX_
1e10: 42 4c 4f 43 4b 5f 4c 45 4e 47 54 48 29 3b 0a 20  BLOCK_LENGTH);. 
1e20: 20 20 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a     if (resultObj
1e30: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 6f 75 74 62   == NULL || outb
1e40: 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  uf == NULL) {..T
1e50: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1e60: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20  interp, "Memory 
1e70: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
1e80: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
1e90: 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43  );..Tcl_DecrRefC
1ea0: 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b  ount(resultObj);
1eb0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
1ec0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
1ed0: 2a 20 44 6f 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  * Do function */
1ee0: 0a 20 20 20 20 69 66 20 28 66 6e 29 20 7b 0a 09  .    if (fn) {..
1ef0: 2f 2a 20 47 65 74 20 64 61 74 61 20 6f 72 20 72  /* Get data or r
1f00: 65 74 75 72 6e 20 65 72 72 6f 72 20 69 66 20 6e  eturn error if n
1f10: 6f 6e 65 20 2a 2f 0a 09 69 66 20 28 6f 62 6a 63  one */..if (objc
1f20: 20 3d 3d 20 33 29 20 7b 0a 09 20 20 20 20 64 61   == 3) {..    da
1f30: 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ta = Tcl_GetByte
1f40: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1f50: 76 5b 32 5d 2c 20 26 64 61 74 61 5f 6c 65 6e 29  v[2], &data_len)
1f60: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
1f70: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1f80: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1f90: 76 2c 20 22 75 70 64 61 74 65 20 64 61 74 61 22  v, "update data"
1fa0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72  );..    Tcl_Decr
1fb0: 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f  RefCount(resultO
1fc0: 62 6a 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  bj);..    return
1fd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
1fe0: 09 2f 2a 20 55 70 64 61 74 65 20 66 75 6e 63 74  ./* Update funct
1ff0: 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 45 6e 63 72  ion */..if (Encr
2000: 79 70 74 55 70 64 61 74 65 28 69 6e 74 65 72 70  yptUpdate(interp
2010: 2c 20 73 74 61 74 65 50 74 72 2d 3e 74 79 70 65  , statePtr->type
2020: 2c 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  , statePtr->ctx,
2030: 20 6f 75 74 62 75 66 2c 20 26 6f 75 74 5f 6c 65   outbuf, &out_le
2040: 6e 2c 20 64 61 74 61 2c 20 64 61 74 61 5f 6c 65  n, data, data_le
2050: 6e 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  n) == TCL_OK) {.
2060: 09 20 20 20 20 6f 75 74 62 75 66 20 3d 20 54 63  .    outbuf = Tc
2070: 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65  l_SetByteArrayLe
2080: 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20  ngth(resultObj, 
2090: 6f 75 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 54  out_len);..    T
20a0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
20b0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
20c0: 6a 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  j);..} else {.. 
20d0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
20e0: 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a  unt(resultObj);.
20f0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2100: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 7d  ERROR;..}..    }
2110: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 46 69 6e 61   else {../* Fina
2120: 6c 69 7a 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  lize function */
2130: 0a 09 69 66 20 28 45 6e 63 72 79 70 74 46 69 6e  ..if (EncryptFin
2140: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74  alize(interp, st
2150: 61 74 65 50 74 72 2d 3e 74 79 70 65 2c 20 73 74  atePtr->type, st
2160: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6f 75 74  atePtr->ctx, out
2170: 62 75 66 2c 20 26 6f 75 74 5f 6c 65 6e 29 20 3d  buf, &out_len) =
2180: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
2190: 20 6f 75 74 62 75 66 20 3d 20 54 63 6c 5f 53 65   outbuf = Tcl_Se
21a0: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68  tByteArrayLength
21b0: 28 72 65 73 75 6c 74 4f 62 6a 2c 20 6f 75 74 5f  (resultObj, out_
21c0: 6c 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  len);..    Tcl_S
21d0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
21e0: 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a  rp, resultObj);.
21f0: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54  .} else {..    T
2200: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2210: 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 20 20 20  resultObj);..   
2220: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2230: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 6e  R;..}.../* Clean
2240: 2d 75 70 20 2a 2f 0a 09 54 63 6c 5f 44 65 6c 65  -up */..Tcl_Dele
2250: 74 65 43 6f 6d 6d 61 6e 64 46 72 6f 6d 54 6f 6b  teCommandFromTok
2260: 65 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  en(interp, state
2270: 50 74 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  Ptr->token);.   
2280: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
2290: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  L_OK;.}../*. *--
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 45 6e 63 72 79 70 74 43  -. *. * EncryptC
22f0: 6f 6d 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e 64  ommandDeleteHand
2300: 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61  ler --. *. *. Ca
2310: 6c 6c 62 61 63 6b 20 74 6f 20 63 6c 65 61 6e 2d  llback to clean-
2320: 75 70 20 77 68 65 6e 20 65 6e 63 72 79 70 74 2f  up when encrypt/
2330: 64 65 63 72 79 70 74 20 63 6f 6d 6d 61 6e 64 20  decrypt command 
2340: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20  is deleted.. *. 
2350: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f  * Returns:. *.No
2360: 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65  thing. *. * Side
2370: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 73   effects:. *.Des
2380: 74 72 6f 79 73 20 73 74 61 74 65 20 69 6e 66 6f  troys state info
2390: 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a   structure. *. *
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 45 6e 63  ---. */.void Enc
23f0: 72 79 70 74 43 6f 6d 6d 61 6e 64 44 65 6c 65 74  ryptCommandDelet
2400: 65 48 61 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44  eHandler(ClientD
2410: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20  ata clientData) 
2420: 7b 0a 20 20 20 20 45 6e 63 72 79 70 74 53 74 61  {.    EncryptSta
2430: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
2440: 45 6e 63 72 79 70 74 53 74 61 74 65 20 2a 29 20  EncryptState *) 
2450: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
2460: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a   /* Clean-up */.
2470: 20 20 20 20 45 6e 63 72 79 70 74 53 74 61 74 65      EncryptState
2480: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a  Free(statePtr);.
2490: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  }../*. *--------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
24e0: 2a 20 45 6e 63 72 79 70 74 43 6f 6d 6d 61 6e 64  * EncryptCommand
24f0: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a  Handler --. *. *
2500: 09 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  . Create command
2510: 20 74 6f 20 61 64 64 20 64 61 74 61 20 74 6f 20   to add data to 
2520: 65 6e 63 72 79 70 74 2f 64 65 63 72 79 70 74 20  encrypt/decrypt 
2530: 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20  function.. *. * 
2540: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f  Returns:. *.TCL_
2550: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a  OK or TCL_ERROR.
2560: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2570: 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63  ts:. *.Creates c
2580: 6f 6d 6d 61 6e 64 20 6f 72 20 65 72 72 6f 72 20  ommand or error 
2590: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d  message. *. *---
25a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25e0: 0a 20 2a 2f 0a 69 6e 74 20 45 6e 63 72 79 70 74  . */.int Encrypt
25f0: 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 28 54  CommandHandler(T
2600: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2610: 70 2c 20 69 6e 74 20 74 79 70 65 2c 20 54 63 6c  p, int type, Tcl
2620: 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 2c 0a 09 54  _Obj *cmdObj,..T
2630: 63 6c 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62  cl_Obj *cipherOb
2640: 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64 69 67 65  j, Tcl_Obj *dige
2650: 73 74 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a  stObj, Tcl_Obj *
2660: 6b 65 79 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20  keyObj, Tcl_Obj 
2670: 2a 69 76 4f 62 6a 29 20 7b 0a 20 20 20 20 45 6e  *ivObj) {.    En
2680: 63 72 79 70 74 53 74 61 74 65 20 2a 73 74 61 74  cryptState *stat
2690: 65 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  ePtr;.    char *
26a0: 63 6d 64 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  cmdName = Tcl_Ge
26b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 63  tStringFromObj(c
26c0: 6d 64 4f 62 6a 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  mdObj, NULL);.. 
26d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
26e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28  ed");..    if ((
26f0: 73 74 61 74 65 50 74 72 20 3d 20 45 6e 63 72 79  statePtr = Encry
2700: 70 74 53 74 61 74 65 4e 65 77 28 69 6e 74 65 72  ptStateNew(inter
2710: 70 2c 20 74 79 70 65 29 29 20 3d 3d 20 4e 55 4c  p, type)) == NUL
2720: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
2730: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2740: 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  Memory allocatio
2750: 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20  n error", (char 
2760: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
2770: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2780: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   }..    /* Initi
2790: 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f 6e 20 2a  alize function *
27a0: 2f 0a 20 20 20 20 69 66 20 28 45 6e 63 72 79 70  /.    if (Encryp
27b0: 74 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 65  tInitialize(inte
27c0: 72 70 2c 20 74 79 70 65 2c 20 26 73 74 61 74 65  rp, type, &state
27d0: 50 74 72 2d 3e 63 74 78 2c 20 63 69 70 68 65 72  Ptr->ctx, cipher
27e0: 4f 62 6a 2c 20 6b 65 79 4f 62 6a 2c 20 69 76 4f  Obj, keyObj, ivO
27f0: 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  bj) != TCL_OK) {
2800: 0a 09 45 6e 63 72 79 70 74 53 74 61 74 65 46 72  ..EncryptStateFr
2810: 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72  ee(statePtr);..r
2820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2830: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2840: 72 65 61 74 65 20 69 6e 73 74 61 6e 63 65 20 63  reate instance c
2850: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 73 74  ommand */.    st
2860: 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20  atePtr->token = 
2870: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
2880: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 63 6d 64  mand(interp, cmd
2890: 4e 61 6d 65 2c 20 45 6e 63 72 79 70 74 49 6e 73  Name, EncryptIns
28a0: 74 61 6e 63 65 4f 62 6a 43 6d 64 2c 0a 09 28 43  tanceObjCmd,..(C
28b0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
28c0: 50 74 72 2c 20 45 6e 63 72 79 70 74 43 6f 6d 6d  Ptr, EncryptComm
28d0: 61 6e 64 44 65 6c 65 74 65 48 61 6e 64 6c 65 72  andDeleteHandler
28e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72  );..    /* Retur
28f0: 6e 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a  n command name *
2900: 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  /.    Tcl_SetObj
2910: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 63  Result(interp, c
2920: 6d 64 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75  mdObj);.    retu
2930: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2980: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
29d0: 0a 20 2a 20 45 6e 63 72 79 70 74 44 61 74 61 48  . * EncryptDataH
29e0: 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09  andler --. *. *.
29f0: 50 65 72 66 6f 72 6d 20 65 6e 63 72 79 70 74 69  Perform encrypti
2a00: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 61  on function on a
2a10: 20 62 6c 6f 63 6b 20 6f 66 20 64 61 74 61 20 61   block of data a
2a20: 6e 64 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74  nd return result
2a30: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
2a40: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43  . *.TCL_OK or TC
2a50: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69  L_ERROR. *. * Si
2a60: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
2a70: 65 74 73 20 72 65 73 75 6c 74 20 6f 72 20 65 72  ets result or er
2a80: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20  ror message. *. 
2a90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ad0: 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 45 6e 63  ----. */.int Enc
2ae0: 72 79 70 74 44 61 74 61 48 61 6e 64 6c 65 72 28  ryptDataHandler(
2af0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2b00: 72 70 2c 20 69 6e 74 20 74 79 70 65 2c 20 54 63  rp, int type, Tc
2b10: 6c 5f 4f 62 6a 20 2a 64 61 74 61 4f 62 6a 2c 20  l_Obj *dataObj, 
2b20: 54 63 6c 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f  Tcl_Obj *cipherO
2b30: 62 6a 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 64 69  bj,..Tcl_Obj *di
2b40: 67 65 73 74 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a  gestObj, Tcl_Obj
2b50: 20 2a 6b 65 79 4f 62 6a 2c 20 54 63 6c 5f 4f 62   *keyObj, Tcl_Ob
2b60: 6a 20 2a 69 76 4f 62 6a 29 20 7b 0a 20 20 20 20  j *ivObj) {.    
2b70: 45 56 50 5f 43 49 50 48 45 52 5f 43 54 58 20 2a  EVP_CIPHER_CTX *
2b80: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
2b90: 69 6e 74 20 64 61 74 61 5f 6c 65 6e 20 3d 20 30  int data_len = 0
2ba0: 2c 20 6f 75 74 5f 6c 65 6e 20 3d 20 30 2c 20 6c  , out_len = 0, l
2bb0: 65 6e 20 3d 20 30 2c 20 72 65 73 20 3d 20 54 43  en = 0, res = TC
2bc0: 4c 5f 4f 4b 3b 0a 20 20 20 20 75 6e 73 69 67 6e  L_OK;.    unsign
2bd0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 2a  ed char *data, *
2be0: 6f 75 74 62 75 66 3b 0a 20 20 20 20 54 63 6c 5f  outbuf;.    Tcl_
2bf0: 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a  Obj *resultObj;.
2c00: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
2c10: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
2c20: 47 65 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  Get data */.    
2c30: 69 66 20 28 64 61 74 61 4f 62 6a 20 21 3d 20 4e  if (dataObj != N
2c40: 55 4c 4c 29 20 7b 0a 09 64 61 74 61 20 3d 20 54  ULL) {..data = T
2c50: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
2c60: 72 6f 6d 4f 62 6a 28 64 61 74 61 4f 62 6a 2c 20  romObj(dataObj, 
2c70: 26 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 20 20 20  &data_len);.    
2c80: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70  } else {..Tcl_Ap
2c90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2ca0: 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55  p, "No data", NU
2cb0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
2cc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
2cd0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73     /* Allocate s
2ce0: 74 6f 72 61 67 65 20 66 6f 72 20 72 65 73 75 6c  torage for resul
2cf0: 74 2e 20 53 69 7a 65 20 73 68 6f 75 6c 64 20 62  t. Size should b
2d00: 65 20 64 61 74 61 20 73 69 7a 65 20 2b 20 62 6c  e data size + bl
2d10: 6f 63 6b 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20  ock size. */.   
2d20: 20 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c   resultObj = Tcl
2d30: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 6f  _NewObj();.    o
2d40: 75 74 62 75 66 20 3d 20 54 63 6c 5f 53 65 74 42  utbuf = Tcl_SetB
2d50: 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 72  yteArrayLength(r
2d60: 65 73 75 6c 74 4f 62 6a 2c 20 64 61 74 61 5f 6c  esultObj, data_l
2d70: 65 6e 2b 45 56 50 5f 4d 41 58 5f 42 4c 4f 43 4b  en+EVP_MAX_BLOCK
2d80: 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 20 20 69 66  _LENGTH);.    if
2d90: 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e   (resultObj == N
2da0: 55 4c 4c 20 7c 7c 20 6f 75 74 62 75 66 20 3d 3d  ULL || outbuf ==
2db0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
2dc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2dd0: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63  p, "Memory alloc
2de0: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63  ation error", (c
2df0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
2e00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
2e20: 65 72 66 6f 72 6d 20 6f 70 65 72 61 74 69 6f 6e  erform operation
2e30: 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 6e 63 72   */.    if (Encr
2e40: 79 70 74 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e  yptInitialize(in
2e50: 74 65 72 70 2c 20 74 79 70 65 2c 20 26 63 74 78  terp, type, &ctx
2e60: 2c 20 63 69 70 68 65 72 4f 62 6a 2c 20 6b 65 79  , cipherObj, key
2e70: 4f 62 6a 2c 20 69 76 4f 62 6a 29 20 21 3d 20 54  Obj, ivObj) != T
2e80: 43 4c 5f 4f 4b 20 7c 7c 0a 09 45 6e 63 72 79 70  CL_OK ||..Encryp
2e90: 74 55 70 64 61 74 65 28 69 6e 74 65 72 70 2c 20  tUpdate(interp, 
2ea0: 74 79 70 65 2c 20 63 74 78 2c 20 6f 75 74 62 75  type, ctx, outbu
2eb0: 66 2c 20 26 6f 75 74 5f 6c 65 6e 2c 20 64 61 74  f, &out_len, dat
2ec0: 61 2c 20 64 61 74 61 5f 6c 65 6e 29 20 21 3d 20  a, data_len) != 
2ed0: 54 43 4c 5f 4f 4b 20 7c 7c 0a 09 45 6e 63 72 79  TCL_OK ||..Encry
2ee0: 70 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65 72  ptFinalize(inter
2ef0: 70 2c 20 74 79 70 65 2c 20 63 74 78 2c 20 6f 75  p, type, ctx, ou
2f00: 74 62 75 66 2b 6f 75 74 5f 6c 65 6e 2c 20 26 6c  tbuf+out_len, &l
2f10: 65 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  en) != TCL_OK) {
2f20: 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f  ..res = TCL_ERRO
2f30: 52 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20  R;..goto done;. 
2f40: 20 20 20 7d 0a 20 20 20 20 6f 75 74 5f 6c 65 6e     }.    out_len
2f50: 20 2b 3d 20 6c 65 6e 3b 0a 0a 64 6f 6e 65 3a 0a   += len;..done:.
2f60: 20 20 20 20 2f 2a 20 53 65 74 20 6f 75 74 70 75      /* Set outpu
2f70: 74 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  t result */.    
2f80: 69 66 20 28 72 65 73 20 3d 3d 20 54 43 4c 5f 4f  if (res == TCL_O
2f90: 4b 29 20 7b 0a 09 6f 75 74 62 75 66 20 3d 20 54  K) {..outbuf = T
2fa0: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c  cl_SetByteArrayL
2fb0: 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c  ength(resultObj,
2fc0: 20 6f 75 74 5f 6c 65 6e 29 3b 0a 09 54 63 6c 5f   out_len);..Tcl_
2fd0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2fe0: 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b  erp, resultObj);
2ff0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
3000: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3010: 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 2f 2a 20  resultObj);../* 
3020: 52 65 73 75 6c 74 20 69 73 20 65 72 72 6f 72 20  Result is error 
3030: 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 7d  message */.    }
3040: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 20 75  ..    /* Clean u
3050: 70 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 74 78  p */.    if (ctx
3060: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 45 56 50   != NULL) {..EVP
3070: 5f 43 49 50 48 45 52 5f 43 54 58 5f 66 72 65 65  _CIPHER_CTX_free
3080: 28 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (ctx);.    }.   
3090: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
30a0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
30b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3130: 20 2a 0a 20 2a 20 45 6e 63 72 79 70 74 46 69 6c   *. * EncryptFil
3140: 65 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20  eHandler --. *. 
3150: 2a 09 50 65 72 66 6f 72 6d 20 65 6e 63 72 79 70  *.Perform encryp
3160: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  tion function on
3170: 20 61 20 62 6c 6f 63 6b 20 6f 66 20 64 61 74 61   a block of data
3180: 20 61 6e 64 20 72 65 74 75 72 6e 20 72 65 73 75   and return resu
3190: 6c 74 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  lt.. *. * Return
31a0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20  s:. *.TCL_OK or 
31b0: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20  TCL_ERROR. *. * 
31c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
31d0: 09 45 6e 63 72 79 70 74 73 20 6f 72 20 64 65 63  .Encrypts or dec
31e0: 72 79 70 74 73 20 69 6e 46 69 6c 65 20 64 61 74  rypts inFile dat
31f0: 61 20 74 6f 20 6f 75 74 46 69 6c 65 20 61 6e 64  a to outFile and
3200: 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 0a   sets result to.
3210: 20 2a 09 73 69 7a 65 20 6f 66 20 6f 75 74 46 69   *.size of outFi
3220: 6c 65 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  le, or an error 
3230: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d  message.. *. *--
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3280: 2d 0a 20 2a 2f 0a 69 6e 74 20 45 6e 63 72 79 70  -. */.int Encryp
3290: 74 46 69 6c 65 48 61 6e 64 6c 65 72 28 54 63 6c  tFileHandler(Tcl
32a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
32b0: 20 69 6e 74 20 74 79 70 65 2c 20 54 63 6c 5f 4f   int type, Tcl_O
32c0: 62 6a 20 2a 69 6e 46 69 6c 65 4f 62 6a 2c 20 54  bj *inFileObj, T
32d0: 63 6c 5f 4f 62 6a 20 2a 6f 75 74 46 69 6c 65 4f  cl_Obj *outFileO
32e0: 62 6a 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 69  bj,..Tcl_Obj *ci
32f0: 70 68 65 72 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a  pherObj, Tcl_Obj
3300: 20 2a 64 69 67 65 73 74 4f 62 6a 2c 20 54 63 6c   *digestObj, Tcl
3310: 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63  _Obj *keyObj, Tc
3320: 6c 5f 4f 62 6a 20 2a 69 76 4f 62 6a 29 20 7b 0a  l_Obj *ivObj) {.
3330: 20 20 20 20 45 56 50 5f 43 49 50 48 45 52 5f 43      EVP_CIPHER_C
3340: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
3350: 20 20 20 20 69 6e 74 20 74 6f 74 61 6c 20 3d 20      int total = 
3360: 30 2c 20 72 65 73 2c 20 6f 75 74 5f 6c 65 6e 20  0, res, out_len 
3370: 3d 20 30 2c 20 6c 65 6e 3b 0a 20 20 20 20 54 63  = 0, len;.    Tc
3380: 6c 5f 43 68 61 6e 6e 65 6c 20 69 6e 20 3d 20 4e  l_Channel in = N
3390: 55 4c 4c 2c 20 6f 75 74 20 3d 20 4e 55 4c 4c 3b  ULL, out = NULL;
33a0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
33b0: 61 72 20 69 6e 5f 62 75 66 5b 42 55 46 46 45 52  ar in_buf[BUFFER
33c0: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69  _SIZE];.    unsi
33d0: 67 6e 65 64 20 63 68 61 72 20 6f 75 74 5f 62 75  gned char out_bu
33e0: 66 5b 42 55 46 46 45 52 5f 53 49 5a 45 2b 45 56  f[BUFFER_SIZE+EV
33f0: 50 5f 4d 41 58 5f 42 4c 4f 43 4b 5f 4c 45 4e 47  P_MAX_BLOCK_LENG
3400: 54 48 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  TH];..    dprint
3410: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
3420: 20 20 2f 2a 20 4f 70 65 6e 20 69 6e 70 75 74 20    /* Open input 
3430: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  file */.    if (
3440: 28 69 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e  (in = Tcl_FSOpen
3450: 46 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65  FileChannel(inte
3460: 72 70 2c 20 69 6e 46 69 6c 65 4f 62 6a 2c 20 22  rp, inFileObj, "
3470: 72 62 22 2c 20 30 34 34 34 29 29 20 3d 3d 20 28  rb", 0444)) == (
3480: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
3490: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
34a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
34b0: 20 20 20 2f 2a 20 4f 70 65 6e 20 6f 75 74 70 75     /* Open outpu
34c0: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66  t file */.    if
34d0: 20 28 28 6f 75 74 20 3d 20 54 63 6c 5f 46 53 4f   ((out = Tcl_FSO
34e0: 70 65 6e 46 69 6c 65 43 68 61 6e 6e 65 6c 28 69  penFileChannel(i
34f0: 6e 74 65 72 70 2c 20 6f 75 74 46 69 6c 65 4f 62  nterp, outFileOb
3500: 6a 2c 20 22 77 62 22 2c 20 30 36 34 34 29 29 20  j, "wb", 0644)) 
3510: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
3520: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 43 6c   NULL) {..Tcl_Cl
3530: 6f 73 65 28 69 6e 74 65 72 70 2c 20 69 6e 29 3b  ose(interp, in);
3540: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
3550: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
3560: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6f 70 65  * Initialize ope
3570: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  ration */.    if
3580: 20 28 28 72 65 73 20 3d 20 45 6e 63 72 79 70 74   ((res = Encrypt
3590: 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 72  Initialize(inter
35a0: 70 2c 20 74 79 70 65 2c 20 26 63 74 78 2c 20 63  p, type, &ctx, c
35b0: 69 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62 6a  ipherObj, keyObj
35c0: 2c 20 69 76 4f 62 6a 29 29 20 21 3d 20 54 43 4c  , ivObj)) != TCL
35d0: 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 64 6f 6e  _OK) {..goto don
35e0: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
35f0: 20 52 65 61 64 20 66 69 6c 65 20 64 61 74 61 20   Read file data 
3600: 66 72 6f 6d 20 69 6e 46 69 6c 65 2c 20 65 6e 63  from inFile, enc
3610: 72 79 70 74 2f 64 65 63 72 79 70 74 20 69 74 2c  rypt/decrypt it,
3620: 20 74 68 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   then output to 
3630: 6f 75 74 46 69 6c 65 20 2a 2f 0a 20 20 20 20 77  outFile */.    w
3640: 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f 66 28 69  hile (!Tcl_Eof(i
3650: 6e 29 29 20 7b 0a 09 69 6e 74 20 72 65 61 64 20  n)) {..int read 
3660: 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 69 6e  = Tcl_ReadRaw(in
3670: 2c 20 28 63 68 61 72 20 2a 29 20 69 6e 5f 62 75  , (char *) in_bu
3680: 66 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b  f, BUFFER_SIZE);
3690: 0a 09 69 66 20 28 72 65 61 64 20 3e 20 30 29 20  ..if (read > 0) 
36a0: 7b 0a 09 20 20 20 20 69 66 20 28 28 72 65 73 20  {..    if ((res 
36b0: 3d 20 45 6e 63 72 79 70 74 55 70 64 61 74 65 28  = EncryptUpdate(
36c0: 69 6e 74 65 72 70 2c 20 74 79 70 65 2c 20 63 74  interp, type, ct
36d0: 78 2c 20 6f 75 74 5f 62 75 66 2c 20 26 6f 75 74  x, out_buf, &out
36e0: 5f 6c 65 6e 2c 20 69 6e 5f 62 75 66 2c 20 72 65  _len, in_buf, re
36f0: 61 64 29 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20  ad)) == TCL_OK) 
3700: 7b 0a 09 09 69 66 20 28 6f 75 74 5f 6c 65 6e 20  {...if (out_len 
3710: 3e 20 30 29 20 7b 0a 09 09 20 20 20 20 6c 65 6e  > 0) {...    len
3720: 20 3d 20 54 63 6c 5f 57 72 69 74 65 52 61 77 28   = Tcl_WriteRaw(
3730: 6f 75 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  out, (const char
3740: 20 2a 29 20 6f 75 74 5f 62 75 66 2c 20 6f 75 74   *) out_buf, out
3750: 5f 6c 65 6e 29 3b 0a 09 09 20 20 20 20 69 66 20  _len);...    if 
3760: 28 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  (len >= 0) {....
3770: 74 6f 74 61 6c 20 2b 3d 20 6c 65 6e 3b 0a 09 09  total += len;...
3780: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
3790: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
37a0: 28 69 6e 74 65 72 70 2c 20 22 57 72 69 74 65 20  (interp, "Write 
37b0: 65 72 72 6f 72 3a 20 22 2c 20 54 63 6c 5f 45 72  error: ", Tcl_Er
37c0: 72 6e 6f 4d 73 67 28 54 63 6c 5f 47 65 74 45 72  rnoMsg(Tcl_GetEr
37d0: 72 6e 6f 28 29 29 2c 20 28 63 68 61 72 20 2a 29  rno()), (char *)
37e0: 20 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 73 20 3d   NULL);....res =
37f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 67   TCL_ERROR;....g
3800: 6f 74 6f 20 64 6f 6e 65 3b 0a 09 09 20 20 20 20  oto done;...    
3810: 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73  }...}..    } els
3820: 65 20 7b 0a 09 09 67 6f 74 6f 20 64 6f 6e 65 3b  e {...goto done;
3830: 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20  ..    }..} else 
3840: 69 66 20 28 72 65 61 64 20 3c 20 30 29 20 7b 0a  if (read < 0) {.
3850: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3860: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52  esult(interp, "R
3870: 65 61 64 20 65 72 72 6f 72 3a 20 22 2c 20 54 63  ead error: ", Tc
3880: 6c 5f 45 72 72 6e 6f 4d 73 67 28 54 63 6c 5f 47  l_ErrnoMsg(Tcl_G
3890: 65 74 45 72 72 6e 6f 28 29 29 2c 20 28 63 68 61  etErrno()), (cha
38a0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
38b0: 20 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52   res = TCL_ERROR
38c0: 3b 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65  ;..    goto done
38d0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
38e0: 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 64 61 74 61  /* Finalize data
38f0: 20 61 6e 64 20 77 72 69 74 65 20 61 6e 79 20 72   and write any r
3900: 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 20 69 6e  emaining data in
3910: 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 66   block */.    if
3920: 20 28 28 72 65 73 20 3d 20 45 6e 63 72 79 70 74   ((res = Encrypt
3930: 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c  Finalize(interp,
3940: 20 74 79 70 65 2c 20 63 74 78 2c 20 6f 75 74 5f   type, ctx, out_
3950: 62 75 66 2c 20 26 6f 75 74 5f 6c 65 6e 29 29 20  buf, &out_len)) 
3960: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 69 66  == TCL_OK) {..if
3970: 20 28 6f 75 74 5f 6c 65 6e 20 3e 20 30 29 20 7b   (out_len > 0) {
3980: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 54 63 6c 5f  ..    len = Tcl_
3990: 57 72 69 74 65 52 61 77 28 6f 75 74 2c 20 28 63  WriteRaw(out, (c
39a0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6f 75 74  onst char *) out
39b0: 5f 62 75 66 2c 20 6f 75 74 5f 6c 65 6e 29 3b 0a  _buf, out_len);.
39c0: 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 3d 20  .    if (len >= 
39d0: 30 29 20 7b 0a 09 09 74 6f 74 61 6c 20 2b 3d 20  0) {...total += 
39e0: 6c 65 6e 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  len;..    } else
39f0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
3a00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 57  esult(interp, "W
3a10: 72 69 74 65 20 65 72 72 6f 72 3a 20 22 2c 20 54  rite error: ", T
3a20: 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 54 63 6c 5f  cl_ErrnoMsg(Tcl_
3a30: 47 65 74 45 72 72 6e 6f 28 29 29 2c 20 28 63 68  GetErrno()), (ch
3a40: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 72  ar *) NULL);...r
3a50: 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  es = TCL_ERROR;.
3a60: 09 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 20 20  ..goto done;..  
3a70: 20 20 7d 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 4f    }..}..Tcl_SetO
3a80: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
3a90: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 74   Tcl_NewIntObj(t
3aa0: 6f 74 61 6c 29 29 3b 0a 20 20 20 20 7d 20 65 6c  otal));.    } el
3ab0: 73 65 20 7b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b  se {..goto done;
3ac0: 0a 20 20 20 20 7d 0a 0a 64 6f 6e 65 3a 0a 20 20  .    }..done:.  
3ad0: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 2a 2f    /* Clean up */
3ae0: 0a 20 20 20 20 69 66 20 28 69 6e 20 21 3d 20 4e  .    if (in != N
3af0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 43 6c 6f 73  ULL) {..Tcl_Clos
3b00: 65 28 69 6e 74 65 72 70 2c 20 69 6e 29 3b 0a 20  e(interp, in);. 
3b10: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 75 74     }.    if (out
3b20: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
3b30: 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 6f  _Close(interp, o
3b40: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ut);.    }.    i
3b50: 66 20 28 63 74 78 20 21 3d 20 4e 55 4c 4c 29 20  f (ctx != NULL) 
3b60: 7b 0a 09 45 56 50 5f 43 49 50 48 45 52 5f 43 54  {..EVP_CIPHER_CT
3b70: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 20 20 20  X_free(ctx);.   
3b80: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65   }.    return re
3b90: 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  s;.}../*********
3ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
3be0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c20: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 6e 63 72  -----. *. * Encr
3c30: 79 70 74 4d 61 69 6e 20 2d 2d 0a 20 2a 0a 20 2a  yptMain --. *. *
3c40: 09 50 65 72 66 6f 72 6d 20 65 6e 63 72 79 70 74  .Perform encrypt
3c50: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  ion function and
3c60: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 0a   return result..
3c70: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
3c80: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
3c90: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
3ca0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74   effects:. *.Set
3cb0: 73 20 72 65 73 75 6c 74 20 6f 72 20 65 72 72 6f  s result or erro
3cc0: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d  r message. *. *-
3cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d10: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
3d20: 74 20 45 6e 63 72 79 70 74 4d 61 69 6e 28 69 6e  t EncryptMain(in
3d30: 74 20 74 79 70 65 2c 20 54 63 6c 5f 49 6e 74 65  t type, Tcl_Inte
3d40: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
3d50: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
3d60: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
3d70: 20 20 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c     int res = TCL
3d80: 5f 4f 4b 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  _OK;.    Tcl_Obj
3d90: 20 2a 63 69 70 68 65 72 4f 62 6a 20 3d 20 4e 55   *cipherObj = NU
3da0: 4c 4c 2c 20 2a 63 6d 64 4f 62 6a 20 3d 20 4e 55  LL, *cmdObj = NU
3db0: 4c 4c 2c 20 2a 64 61 74 61 4f 62 6a 20 3d 20 4e  LL, *dataObj = N
3dc0: 55 4c 4c 2c 20 2a 64 69 67 65 73 74 4f 62 6a 20  ULL, *digestObj 
3dd0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
3de0: 4f 62 6a 20 2a 69 6e 46 69 6c 65 4f 62 6a 20 3d  Obj *inFileObj =
3df0: 20 4e 55 4c 4c 2c 20 2a 6f 75 74 46 69 6c 65 4f   NULL, *outFileO
3e00: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79 4f  bj = NULL, *keyO
3e10: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 69 76 4f 62  bj = NULL, *ivOb
3e20: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6d 61 63 4f 62  j = NULL, *macOb
3e30: 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f  j = NULL;.    co
3e40: 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e 65  nst char *channe
3e50: 6c 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 70 74 3b 0a  l = NULL, *opt;.
3e60: 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44      const EVP_MD
3e70: 20 2a 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20   *md = NULL;.   
3e80: 20 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45   const EVP_CIPHE
3e90: 52 20 2a 63 69 70 68 65 72 20 3d 20 4e 55 4c 4c  R *cipher = NULL
3ea0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
3eb0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
3ec0: 2a 20 43 6c 65 61 72 20 69 6e 74 65 72 70 20 72  * Clear interp r
3ed0: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 54 63 6c  esult */.    Tcl
3ee0: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
3ef0: 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61  erp);..    /* Va
3f00: 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74  lidate arg count
3f10: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63   */.    if (objc
3f20: 20 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 31   < 3 || objc > 1
3f30: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
3f40: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
3f50: 2c 20 6f 62 6a 76 2c 20 22 2d 63 69 70 68 65 72  , objv, "-cipher
3f60: 20 6e 61 6d 65 20 3f 2d 64 69 67 65 73 74 20 6e   name ?-digest n
3f70: 61 6d 65 3f 20 2d 6b 65 79 20 6b 65 79 20 3f 2d  ame? -key key ?-
3f80: 69 76 20 73 74 72 69 6e 67 3f 20 5b 2d 63 6f 6d  iv string? [-com
3f90: 6d 61 6e 64 20 63 6d 64 4e 61 6d 65 20 7c 20 2d  mand cmdName | -
3fa0: 69 6e 66 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20  infile filename 
3fb0: 2d 6f 75 74 66 69 6c 65 20 66 69 6c 65 6e 61 6d  -outfile filenam
3fc0: 65 20 7c 20 2d 64 61 74 61 20 64 61 74 61 5d 22  e | -data data]"
3fd0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
3fe0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
3ff0: 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 20   /* Get options 
4000: 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 6e 74 20  */.    for (int 
4010: 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 6f  idx = 1; idx < o
4020: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 6f  bjc; idx++) {..o
4030: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
4040: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69  ngFromObj(objv[i
4050: 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66  dx], NULL);...if
4060: 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29   (opt[0] != '-')
4070: 20 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09   {..    break;..
4080: 7d 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 69 70  }...OPTOBJ("-cip
4090: 68 65 72 22 2c 20 63 69 70 68 65 72 4f 62 6a 29  her", cipherObj)
40a0: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d  ;..OPTOBJ("-comm
40b0: 61 6e 64 22 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09  and", cmdObj);..
40c0: 4f 50 54 4f 42 4a 28 22 2d 64 61 74 61 22 2c 20  OPTOBJ("-data", 
40d0: 64 61 74 61 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42  dataObj);..OPTOB
40e0: 4a 28 22 2d 64 69 67 65 73 74 22 2c 20 64 69 67  J("-digest", dig
40f0: 65 73 74 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a  estObj);..OPTOBJ
4100: 28 22 2d 69 6e 66 69 6c 65 22 2c 20 69 6e 46 69  ("-infile", inFi
4110: 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28  leObj);..OPTOBJ(
4120: 22 2d 6f 75 74 66 69 6c 65 22 2c 20 6f 75 74 46  "-outfile", outF
4130: 69 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a  ileObj);..OPTOBJ
4140: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 4f 62 6a 29  ("-key", keyObj)
4150: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 69 76 22 2c  ;..OPTOBJ("-iv",
4160: 20 69 76 4f 62 6a 29 3b 0a 0a 09 4f 50 54 42 41   ivObj);...OPTBA
4170: 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 63 69  D("option", "-ci
4180: 70 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20  pher, -command, 
4190: 2d 64 61 74 61 2c 20 2d 64 69 67 65 73 74 2c 20  -data, -digest, 
41a0: 2d 69 6e 66 69 6c 65 2c 20 2d 6b 65 79 2c 20 2d  -infile, -key, -
41b0: 69 76 2c 20 2d 6f 75 74 66 69 6c 65 22 29 3b 0a  iv, -outfile");.
41c0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
41d0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
41e0: 20 43 68 65 63 6b 20 66 6f 72 20 72 65 71 75 69   Check for requi
41f0: 72 65 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20  red options */. 
4200: 20 20 20 69 66 20 28 63 69 70 68 65 72 4f 62 6a     if (cipherObj
4210: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
4220: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4230: 74 65 72 70 2c 20 22 4e 6f 20 63 69 70 68 65 72  terp, "No cipher
4240: 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20  ", NULL);.    } 
4250: 65 6c 73 65 20 69 66 20 28 6b 65 79 4f 62 6a 20  else if (keyObj 
4260: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
4270: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4280: 65 72 70 2c 20 22 4e 6f 20 6b 65 79 22 2c 20 4e  erp, "No key", N
4290: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
42a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
42b0: 20 20 20 20 2f 2a 20 50 65 72 66 6f 72 6d 20 65      /* Perform e
42c0: 6e 63 72 79 70 74 69 6f 6e 20 66 75 6e 63 74 69  ncryption functi
42d0: 6f 6e 20 6f 6e 20 66 69 6c 65 2c 20 73 74 61 63  on on file, stac
42e0: 6b 65 64 20 63 68 61 6e 6e 65 6c 2c 20 75 73 69  ked channel, usi
42f0: 6e 67 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d  ng instance comm
4300: 61 6e 64 2c 20 6f 72 20 64 61 74 61 20 62 6c 6f  and, or data blo
4310: 62 20 2a 2f 0a 20 20 20 20 69 66 20 28 69 6e 46  b */.    if (inF
4320: 69 6c 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c 20 26  ileObj != NULL &
4330: 26 20 6f 75 74 46 69 6c 65 4f 62 6a 20 21 3d 20  & outFileObj != 
4340: 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 45  NULL) {..res = E
4350: 6e 63 72 79 70 74 46 69 6c 65 48 61 6e 64 6c 65  ncryptFileHandle
4360: 72 28 69 6e 74 65 72 70 2c 20 74 79 70 65 2c 20  r(interp, type, 
4370: 69 6e 46 69 6c 65 4f 62 6a 2c 20 6f 75 74 46 69  inFileObj, outFi
4380: 6c 65 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a  leObj, cipherObj
4390: 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 6b 65 79  , digestObj, key
43a0: 4f 62 6a 2c 20 69 76 4f 62 6a 29 3b 0a 20 20 20  Obj, ivObj);.   
43b0: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6d 64 4f   } else if (cmdO
43c0: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  bj != NULL) {..r
43d0: 65 73 20 3d 20 45 6e 63 72 79 70 74 43 6f 6d 6d  es = EncryptComm
43e0: 61 6e 64 48 61 6e 64 6c 65 72 28 69 6e 74 65 72  andHandler(inter
43f0: 70 2c 20 74 79 70 65 2c 20 63 6d 64 4f 62 6a 2c  p, type, cmdObj,
4400: 20 63 69 70 68 65 72 4f 62 6a 2c 20 64 69 67 65   cipherObj, dige
4410: 73 74 4f 62 6a 2c 20 6b 65 79 4f 62 6a 2c 20 69  stObj, keyObj, i
4420: 76 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73  vObj);.    } els
4430: 65 20 69 66 20 28 64 61 74 61 4f 62 6a 20 21 3d  e if (dataObj !=
4440: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20   NULL) {..res = 
4450: 45 6e 63 72 79 70 74 44 61 74 61 48 61 6e 64 6c  EncryptDataHandl
4460: 65 72 28 69 6e 74 65 72 70 2c 20 74 79 70 65 2c  er(interp, type,
4470: 20 64 61 74 61 4f 62 6a 2c 20 63 69 70 68 65 72   dataObj, cipher
4480: 4f 62 6a 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20  Obj, digestObj, 
4490: 6b 65 79 4f 62 6a 2c 20 69 76 4f 62 6a 29 3b 0a  keyObj, ivObj);.
44a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
44b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
44c0: 6e 74 65 72 70 2c 20 22 4e 6f 20 6f 70 65 72 61  nterp, "No opera
44d0: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 3a 20  tion specified: 
44e0: 55 73 65 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64  Use -command, -d
44f0: 61 74 61 2c 20 2d 69 6e 66 69 6c 65 2c 20 6f 72  ata, -infile, or
4500: 20 2d 6f 75 74 66 69 6c 65 20 6f 70 74 69 6f 6e   -outfile option
4510: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 73 20 3d  ", NULL);..res =
4520: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4530: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  }.    return res
4540: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4590: 0a 20 2a 20 45 6e 63 72 79 70 74 69 6f 6e 20 43  . * Encryption C
45a0: 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a  ommands --. *. *
45b0: 09 50 65 72 66 6f 72 6d 20 65 6e 63 72 79 70 74  .Perform encrypt
45c0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  ion function and
45d0: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 73 0a   return results.
45e0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
45f0: 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f  *.TCL_OK or TCL_
4600: 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65  ERROR. *. * Side
4610: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6d   effects:. *.Com
4620: 6d 61 6e 64 20 64 65 70 65 6e 64 65 6e 74 0a 20  mand dependent. 
4630: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4670: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
4680: 69 63 20 69 6e 74 20 45 6e 63 72 79 70 74 4f 62  ic int EncryptOb
4690: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
46a0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
46b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
46c0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
46d0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
46e0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 45 6e   {.    return En
46f0: 63 72 79 70 74 4d 61 69 6e 28 54 59 50 45 5f 45  cryptMain(TYPE_E
4700: 4e 43 52 59 50 54 2c 20 69 6e 74 65 72 70 2c 20  NCRYPT, interp, 
4710: 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a  objc, objv);.}..
4720: 73 74 61 74 69 63 20 69 6e 74 20 44 65 63 72 79  static int Decry
4730: 70 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  ptObjCmd(ClientD
4740: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
4750: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4760: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
4770: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
4780: 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72  v[]) {.    retur
4790: 6e 20 45 6e 63 72 79 70 74 4d 61 69 6e 28 54 59  n EncryptMain(TY
47a0: 50 45 5f 44 45 43 52 59 50 54 2c 20 69 6e 74 65  PE_DECRYPT, inte
47b0: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b  rp, objc, objv);
47c0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
4810: 20 2a 20 45 6e 63 72 79 70 74 5f 49 6e 69 74 69   * Encrypt_Initi
4820: 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 43  alize --. *. *.C
4830: 72 65 61 74 65 20 6e 61 6d 65 73 70 61 63 65 2c  reate namespace,
4840: 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 20 72   commands, and r
4850: 65 67 69 73 74 65 72 20 70 61 63 6b 61 67 65 20  egister package 
4860: 76 65 72 73 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65  version. *. * Re
4870: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
4880: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
4890: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
48a0: 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d  :. *.Creates com
48b0: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  mands. *. *-----
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4900: 2a 2f 0a 69 6e 74 20 54 6c 73 5f 45 6e 63 72 79  */.int Tls_Encry
4910: 70 74 43 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49  ptCommands(Tcl_I
4920: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
4930: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
4940: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
4950: 2c 20 22 74 6c 73 3a 3a 65 6e 63 72 79 70 74 22  , "tls::encrypt"
4960: 2c 20 45 6e 63 72 79 70 74 4f 62 6a 43 6d 64 2c  , EncryptObjCmd,
4970: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
4980: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
4990: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
49a0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
49b0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
49c0: 74 6c 73 3a 3a 64 65 63 72 79 70 74 22 2c 20 44  tls::decrypt", D
49d0: 65 63 72 79 70 74 4f 62 6a 43 6d 64 2c 20 28 43  ecryptObjCmd, (C
49e0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
49f0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
4a00: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72   *) NULL);.    r
4a10: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
4a20: 0a                                               .