4 * An abstract class for confidentialy modes that rely on an initialization vector.
\r
5 * Copyright (c) 2007 Henri Torgemane
\r
7 * See LICENSE.txt for full license information.
\r
9 package com.hurlant.crypto.symmetric
\r
11 import com.hurlant.crypto.prng.Random;
\r
12 import com.hurlant.crypto.tests.TestCase;
\r
13 import com.hurlant.util.Memory;
\r
15 import flash.utils.ByteArray;
\r
18 * An "abtract" class to avoid redundant code in subclasses
\r
22 protected var key:ISymmetricKey;
\r
23 protected var padding:IPad;
\r
24 // random generator used to generate IVs
\r
25 protected var prng:Random;
\r
26 // optional static IV. used for testing only.
\r
27 protected var iv:ByteArray;
\r
28 // generated IV is stored here.
\r
29 protected var lastIV:ByteArray;
\r
30 protected var blockSize:uint;
\r
33 public function IVMode(key:ISymmetricKey, padding:IPad = null) {
\r
35 blockSize = key.getBlockSize();
\r
36 if (padding == null) {
\r
37 padding = new PKCS5(blockSize);
\r
39 padding.setBlockSize(blockSize);
\r
41 this.padding = padding;
\r
45 lastIV = new ByteArray;
\r
48 public function getBlockSize():uint {
\r
49 return key.getBlockSize();
\r
51 public function dispose():void {
\r
54 for (i=0;i<iv.length;i++) {
\r
55 iv[i] = prng.nextByte();
\r
60 if (lastIV != null) {
\r
61 for (i=0;i<iv.length;i++) {
\r
62 lastIV[i] = prng.nextByte();
\r
75 * Optional function to force the IV value.
\r
76 * Normally, an IV gets generated randomly at every encrypt() call.
\r
77 * Also, use this to set the IV before calling decrypt()
\r
78 * (if not set before decrypt(), the IV is read from the beginning of the stream.)
\r
80 public function set IV(value:ByteArray):void {
\r
83 lastIV.writeBytes(iv);
\r
85 public function get IV():ByteArray {
\r
89 protected function getIV4e():ByteArray {
\r
90 var vec:ByteArray = new ByteArray;
\r
94 prng.nextBytes(vec, blockSize);
\r
97 lastIV.writeBytes(vec);
\r
100 protected function getIV4d():ByteArray {
\r
101 var vec:ByteArray = new ByteArray;
\r
103 vec.writeBytes(iv);
\r
105 throw new Error("an IV must be set before calling decrypt()");
\r