Bug:Fix file validation issue
[vnfsdk/refrepo.git] / vnfmarket / src / main / webapp / vnfmarket / node_modules / socket.io-client / lib / vendor / web-socket-js / flash-src / com / hurlant / crypto / prng / TLSPRF.as
1 /**\r
2  * TLSPRF\r
3  * \r
4  * An ActionScript 3 implementation of a pseudo-random generator\r
5  * that follows the TLS specification\r
6  * Copyright (c) 2007 Henri Torgemane\r
7  * \r
8  * See LICENSE.txt for full license information.\r
9  */\r
10 package com.hurlant.crypto.prng\r
11 {\r
12         import flash.utils.ByteArray;\r
13         import com.hurlant.crypto.hash.HMAC;\r
14         import com.hurlant.crypto.hash.MD5;\r
15         import com.hurlant.crypto.hash.SHA1;\r
16         import com.hurlant.util.Memory;\r
17         import com.hurlant.util.Hex;\r
18         import flash.utils.IDataOutput;\r
19 \r
20         /**\r
21          * There's "Random", and then there's TLS Random.\r
22          * .\r
23          * Still Pseudo-random, though.\r
24          */\r
25         public class TLSPRF\r
26         {\r
27                 // XXX WAY TOO MANY STRUCTURES HERE\r
28                 \r
29                 // seed\r
30                 private var seed:ByteArray;\r
31                 // P_MD5's secret\r
32                 private var s1:ByteArray;\r
33                 // P_SHA-1's secret\r
34                 private var s2:ByteArray;\r
35                 // HMAC_MD5's A\r
36                 private var a1:ByteArray;\r
37                 // HMAC_SHA1's A\r
38                 private var a2:ByteArray;\r
39                 // Pool for P_MD5\r
40                 private var p1:ByteArray;\r
41                 // Pool for P_SHA1\r
42                 private var p2:ByteArray;\r
43                 // Data for HMAC_MD5\r
44                 private var d1:ByteArray;\r
45                 // Data for HMAC_SHA1\r
46                 private var d2:ByteArray;\r
47                 \r
48                 \r
49                 private var hmac_md5:HMAC;\r
50                 private var hmac_sha1:HMAC;\r
51                 \r
52                 public function TLSPRF(secret:ByteArray, label:String, seed:ByteArray) {\r
53                         var l:int = Math.ceil(secret.length/2);\r
54                         var s1:ByteArray = new ByteArray;\r
55                         var s2:ByteArray = new ByteArray;\r
56                         s1.writeBytes(secret, 0, l);\r
57                         s2.writeBytes(secret, secret.length-l, l);\r
58                         var s:ByteArray = new ByteArray;\r
59                         s.writeUTFBytes(label);\r
60                         s.writeBytes(seed);\r
61                         this.seed = s;\r
62                         this.s1 = s1;\r
63                         this.s2 = s2;\r
64                         hmac_md5 = new HMAC(new MD5);\r
65                         hmac_sha1 = new HMAC(new SHA1);\r
66                         \r
67                         this.a1 = hmac_md5.compute(s1, this.seed);\r
68                         this.a2 = hmac_sha1.compute(s2, this.seed);\r
69                         \r
70                         p1 = new ByteArray;\r
71                         p2 = new ByteArray;\r
72                         \r
73                         d1 = new ByteArray;\r
74                         d2 = new ByteArray;\r
75                         d1.position = MD5.HASH_SIZE;\r
76                         d1.writeBytes(this.seed);\r
77                         d2.position = SHA1.HASH_SIZE;\r
78                         d2.writeBytes(this.seed);\r
79                 }\r
80                 \r
81                 // XXX HORRIBLY SLOW. REWRITE.\r
82                 public function nextBytes(buffer:IDataOutput, length:int):void {\r
83                         while (length--) {\r
84                                 buffer.writeByte(nextByte());\r
85                         }\r
86                 }\r
87                 public function nextByte():int {\r
88                         if (p1.bytesAvailable==0) {\r
89                                 more_md5();\r
90                         }\r
91                         if (p2.bytesAvailable==0) {\r
92                                 more_sha1();\r
93                         }\r
94                         return p1.readUnsignedByte()^p2.readUnsignedByte();\r
95                 }\r
96                 public function dispose():void {\r
97                         seed = dba(seed);\r
98                         s1 = dba(s1);\r
99                         s2 = dba(s2);\r
100                         a1 = dba(a1);\r
101                         a2 = dba(a2);\r
102                         p1 = dba(p1);\r
103                         p2 = dba(p2);\r
104                         d1 = dba(d1);\r
105                         d2 = dba(d2);\r
106                         hmac_md5.dispose();\r
107                         hmac_md5 = null;\r
108                         hmac_sha1.dispose();\r
109                         hmac_sha1 = null;\r
110                         Memory.gc();\r
111                 }\r
112                 public function toString():String {\r
113                         return "tls-prf";\r
114                 }\r
115                 private function dba(ba:ByteArray):ByteArray {\r
116                         for (var i:uint=0;i<ba.length;i++) {\r
117                                 ba[i]=0;\r
118                         }\r
119                         ba.length=0;\r
120                         return null;\r
121                 }\r
122                 private function more_md5():void {\r
123                         d1.position=0;\r
124                         d1.writeBytes(a1);\r
125                         var p:int = p1.position;\r
126                         var more:ByteArray = hmac_md5.compute(s1, d1);\r
127                         a1 = hmac_md5.compute(s1, a1);\r
128                         p1.writeBytes(more);\r
129                         p1.position=p;\r
130                 }\r
131                 private function more_sha1():void {\r
132                         d2.position=0;\r
133                         d2.writeBytes(a2);\r
134                         var p:int = p2.position;\r
135                         var more:ByteArray = hmac_sha1.compute(s2, d2);\r
136                         a2 = hmac_sha1.compute(s2, a2);\r
137                         p2.writeBytes(more);\r
138                         p2.position=p;\r
139                 }\r
140                 \r
141         }\r
142 }