/js/lib/Socket.IO-node/support/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/IVMode.as
ActionScript | 110 lines | 83 code | 7 blank | 20 comment | 13 complexity | c9d563696b76adde5c8b51197b7e2ff7 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, MPL-2.0-no-copyleft-exception, BSD-3-Clause
- /**
- * IVMode
- *
- * An abstract class for confidentialy modes that rely on an initialization vector.
- * Copyright (c) 2007 Henri Torgemane
- *
- * See LICENSE.txt for full license information.
- */
- package com.hurlant.crypto.symmetric
- {
- import com.hurlant.crypto.prng.Random;
- import com.hurlant.crypto.tests.TestCase;
- import com.hurlant.util.Memory;
-
- import flash.utils.ByteArray;
-
- /**
- * An "abtract" class to avoid redundant code in subclasses
- */
- public class IVMode
- {
- protected var key:ISymmetricKey;
- protected var padding:IPad;
- // random generator used to generate IVs
- protected var prng:Random;
- // optional static IV. used for testing only.
- protected var iv:ByteArray;
- // generated IV is stored here.
- protected var lastIV:ByteArray;
- protected var blockSize:uint;
-
-
- public function IVMode(key:ISymmetricKey, padding:IPad = null) {
- this.key = key;
- blockSize = key.getBlockSize();
- if (padding == null) {
- padding = new PKCS5(blockSize);
- } else {
- padding.setBlockSize(blockSize);
- }
- this.padding = padding;
-
- prng = new Random;
- iv = null;
- lastIV = new ByteArray;
- }
-
- public function getBlockSize():uint {
- return key.getBlockSize();
- }
- public function dispose():void {
- var i:uint;
- if (iv != null) {
- for (i=0;i<iv.length;i++) {
- iv[i] = prng.nextByte();
- }
- iv.length=0;
- iv = null;
- }
- if (lastIV != null) {
- for (i=0;i<iv.length;i++) {
- lastIV[i] = prng.nextByte();
- }
- lastIV.length=0;
- lastIV=null;
- }
- key.dispose();
- key = null;
- padding = null;
- prng.dispose();
- prng = null;
- Memory.gc();
- }
- /**
- * Optional function to force the IV value.
- * Normally, an IV gets generated randomly at every encrypt() call.
- * Also, use this to set the IV before calling decrypt()
- * (if not set before decrypt(), the IV is read from the beginning of the stream.)
- */
- public function set IV(value:ByteArray):void {
- iv = value;
- lastIV.length=0;
- lastIV.writeBytes(iv);
- }
- public function get IV():ByteArray {
- return lastIV;
- }
-
- protected function getIV4e():ByteArray {
- var vec:ByteArray = new ByteArray;
- if (iv) {
- vec.writeBytes(iv);
- } else {
- prng.nextBytes(vec, blockSize);
- }
- lastIV.length=0;
- lastIV.writeBytes(vec);
- return vec;
- }
- protected function getIV4d():ByteArray {
- var vec:ByteArray = new ByteArray;
- if (iv) {
- vec.writeBytes(iv);
- } else {
- throw new Error("an IV must be set before calling decrypt()");
- }
- return vec;
- }
- }
- }