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 .