OpenCores
URL https://opencores.org/ocsvn/twofish/twofish/trunk

Subversion Repositories twofish

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 1 to Rev 2
    Reverse comparison

Rev 1 → Rev 2

/trunk/twofish_manual_en.txt
0,0 → 1,353
TWOFISH MANUAL
 
(c) 2006 Spyros Ninos
 
This document is under the GPL. See file COPYING for licence details.
 
1. Introduction
2. Crypto primitives usage
3. Testbenches
4. Misc + Tips
 
NOTE (April 2006): for the time being the 256 bit key size functionality is not
implemented. Testing and debugging is very time consuming. Bare with me :)
 
1. INTRODUCTION
===============
 
Twofish is a 128bit-block symmetric cipher, finalist candidate for the AES contest.
It supports keys of 128, 192, 256 and all the sizes below 256 bits (with padding). This
implementation accepts keys of 128, 192 and 256 bits. If you want a different size then
you'll have to create the padder yourself. The implementation was written in a VHDL 87
and 93 mixed versions. Just to be sure, use the 93 version in compilation. The naming
convention for the components is kept as simple but self-explanatory as I could. I had
in mind that it would be possible to use two or three ciphers in the same design, so
names are such that there would be no name-conflict (I hope...). For every key-depended
component the respective key size was used in the name to indicate the component's
target (i.e twofish_S128 is for 128 bit key). The cipher components are pure
combinational circuits. This decision was based upon the assumption of portability.
Since no memory is used, it can be implemented in any programmable device. Also, maximum
flexibility was intended by dividing the cipher in key-parts. By doing this, you
have the choice to implement the cipher as a rolled out, iterative, pipelined or any
other architecture you may like to build.
 
2. CRYPTO PRIMITIVES USAGE
==========================
 
The twofish.vhd file is divided in four parts. Firstly, there's the part where all
the key-independent components are found. The next three parts concern the components
that depend on the key - 128, 192 and 256 bits respectively.
 
In the file you'll find the below main components:
1) twofish_data_input
2) twofish_data_output
3) twofish_S128
4) twofish_keysched128
5) twofish_whit_keysched128
6) twofish_encryption_round128
7) twofish_decryption_round128
8) twofish_S192
9) twofish_keysched192
10) twofish_whit_keysched192
11) twofish_encryption_round192
12) twofish_decryption_round192
 
(NOTE: 256 bit components are not implemented yet).
 
You'll also find all the other components that the above depend on, but they are not
important in building the cipher - except perhaps if you want to study the structure
of this implementation and/or modify it. A short description of them follows:
 
1) The first component is the TWOFISH_DATA_INPUT, which is a simple tranformation of the
input data from the way we provide it (which is big endian) to little endian convention,
as required by the twofish specification. It must be used as an interface between the
input data provided to the circuit and the rest of the cipher. An alternative would be
to extract the code from it and integrate it to another component. Note that since the
data block size of the cipher is always 128 bits, this component is supposed to be used
with the components of all the key-sizes. The interface of the component is as follows:
 
entity twofish_data_input is
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end twofish_data_input;
 
It is quite simple; in_tdi is the data input as we provide it and out_tdi is the
transformed input data. (tdi comes from the Twofish Data Input)
 
2) The component TWOFISH_DATA_OUTPUT makes the reverse procedure of the twofish_data_input.
It takes the little endian convention cipher result and transforms it to the big endian
one, as the specification requires. This component too is supposed to be used with the
components of all the key-sizes. The interface is as follows:
 
entity twofish_data_output is
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end twofish_data_output;
 
in_tdo accepts the ciphertext as we take it from the last round and out_tdo is the
tranformed ciphertext. (tdo comes from the Twofish Data Output)
 
3) The TWOFISH_S128 is a component that takes the key of 128 bits and produces the S0
and S1 for the f function. The interface is as follows:
 
entity twofish_S128 is
port (
in_key_ts128 : in std_logic_vector(127 downto 0);
out_Sfirst_ts128,
out_Ssecond_ts128 : out std_logic_vector(31 downto 0)
);
end twofish_S128;
 
Here, in_key_ts128 is the key that we provide. Note that there is no component that
transforms the key to the form that the twofish specification requires; rather the
tranformation takes place within the twofish_S128 component. Here, there is the
assumption/association that Sfirst refers to S0 and Ssecond refers to S1. There is
no need to remember the association, since throughout the design, the same rule
is followed, so the only thing you have to do it to connect the pins with the
same name. This component can be used only when you implement a 128 bit key size
design. (ts128 comes from Twofish_S128)
 
 
4) The TWOFISH_KEYSCHED128 component is the key scheduler of the twofish cipher,
for 128 bit keys. It's interface is as follows:
 
entity twofish_keysched128 is
port (
odd_in_tk128,
even_in_tk128 : in std_logic_vector(7 downto 0);
in_key_tk128 : in std_logic_vector(127 downto 0);
out_key_up_tk128,
out_key_down_tk128 : out std_logic_vector(31 downto 0)
);
end twofish_keysched128;
 
odd_in_tk128 and even_in_tk128 are the numbers of the round 2i and 2i+1, as described
in the specification. Clearly, 2i relates to the even_in_tk128 and 2i+1 relates to
the odd_in_tk128. in_key_tk128 is where the key goes. The key must be supplied to the
components without any endian-transformation; the tranformation takes place in the
component, as in twofish_S128. out_key_up_tk128 and out_key_down_tk128 are the two
keys produced from the scheduler. The association is that as we look the twofish
diagram provided in the specification page 11 (figure 3), the upper key is what we
get from out_key_up_tk128 and the down key is what we get from out_key_down_tk128.
As before, you don't have to remember the association, names are used the same throughout
the whole design. This component too, can be used only when you implement a 128 bit key
size design. (tk128 comes from Twofish_Keysched128).
 
IMPORTANT NOTICE: This component can be used in two ways: in combination with
twofish_whit_keysched128 (see below) or as a standalone component. In the first
case, whitening keys are produced by twofish_whit_keysched128; so even_in_tk128 and
odd_in_tk128 must start from 8,9 respectively and above. Or if you use it standalone
then you can start from 0 and above.
 
5) The TWOFISH_WHIT_KEYSCHED128 produces the whitening keys K0..K7. The interface
is as follows:
 
entity twofish_whit_keysched128 is
port (
in_key_twk128 : in std_logic_vector(127 downto 0);
out_K0_twk128,
out_K1_twk128,
out_K2_twk128,
out_K3_twk128,
out_K4_twk128,
out_K5_twk128,
out_K6_twk128,
out_K7_twk128 : out std_logic_vector(31 downto 0)
);
end twofish_whit_keysched128;
 
in_key_twk128 is where the key is connected. As above, no big-little endian tranformation
must take place. It is performed within the component. The eight outputs produce the
keys. This component too can be used only when you implement a 128 bit key size design.
(twk128 comes from Twofish_Whit_Keysched128).
 
IMPORTANT NOTICE: If this component is to be used as a combination with twofish_keysched128
care should be taken when supplying numbers to the latter. Read the notice of the
twofish_keysched128.
 
6) The TWOFISH_ENCRYPTION_ROUND128 is the component that implements one round of encryption.
The interface is as follows:
 
entity twofish_encryption_round128 is
port (
in1_ter128,
in2_ter128,
in3_ter128,
in4_ter128,
in_Sfirst_ter128,
in_Ssecond_ter128,
in_key_up_ter128,
in_key_down_ter128 : in std_logic_vector(31 downto 0);
out1_ter128,
out2_ter128,
out3_ter128,
out4_ter128 : out std_logic_vector(31 downto 0)
);
end twofish_encryption_round128;
 
in1_ter128, in1_ter128, in1_ter128, in1_ter128 are the four 32 bit inputs to the cipher
round. in_Sfirst_ter128, in_Ssecond_ter128 are the two S needed for the g functions,
in_key_up_ter128 and in_key_down_ter128 are the two round keys. Note that up and down
names are given to keys according to the diagram given in Twofish spec. You don't need
to worry about it, keys follow the same naming convention throughout the whole design.
Finally, out1_ter128, out1_ter228, out3_ter128 and out4_ter128 are the 32 bit outputs
of the encryption round.
 
IMPORTANT NOTICE: the output swapping is taking place IN the component. YOU HAVE TO undo
the last swap after the 16th round.
 
7) The TWOFISH_DECRYPTION_ROUND128 is the component tha implements one round of decryption.
The interface is as follows:
 
entity twofish_decryption_round128 is
port (
in1_tdr128,
in2_tdr128,
in3_tdr128,
in4_tdr128,
in_Sfirst_tdr128,
in_Ssecond_tdr128,
in_key_up_tdr128,
in_key_down_tdr128 : in std_logic_vector(31 downto 0);
out1_tdr128,
out2_tdr128,
out3_tdr128,
out4_tdr128 : out std_logic_vector(31 downto 0)
);
end twofish_decryption_round128;
 
As in twofish_encryption_round128 component, the ports are quite self-explanatory.
 
IMPORTANT NOTICE: as in twofish_encryption_round128, inside the component the output
swapping is taking place. YOU HAVE TO undo the last swap after the 16th round.
 
 
Components
 
8) twofish_S192
9) twofish_keysched192
10) twofish_whit_keysched192
11) twofish_encryption_round192
12) twofish_decryption_round192
 
work exactly as their 128 bit counterparts. The only difference is the third S that
is provided by twofish_S192 and needed by some of the rest of them. I.e:
 
entity twofish_S192 is
port (
in_key_ts192 : in std_logic_vector(191 downto 0);
out_Sfirst_ts192,
out_Ssecond_ts192,
out_Sthird_ts192 : out std_logic_vector(31 downto 0)
);
end twofish_S192;
 
which provide a third S that is used in twofish encryption and decryption rounds.
Every IMPORTANT NOTICE that exist for the 128 bit components, are valid for
these components too.
 
 
3. TESTBENCHES
==============
 
Testbenches for the cipher are provided for Tables, Variable key, Variable text,
ECB/CBC Monte Carlo encryption and decryption tests. Every testbench comes with
it's respective testvector file. The testvector file is transformed into a form
that it's easier to be manipulated, than in the original form supplied by the
cipher designer(s).
 
Every testbench produces a file with the results, that can be cross-checked
with the testvector file of input - just to be certain that results are as
expected (usually with "diff").
 
Along with the transformed testvector files, the orignal testvector files - which
are provided by the cipher designer(s) - are given. That way, you can check the
originality of the transformed testvector files if you want to.
 
Finally, some secondary circuits are provided for the testbenches to work. These
are a 128 bit register, a mux and demux for 128 bit input(s)/output(s).
 
4. MISC + TIPS
==============
 
You must pay attention in the whitening steps. None of the components actually
implements the input or output whitening steps. You only have the component
that produces the whitening keys.
 
Each cipher implementation was designed so as to demand as few components as
possible. That way, there would be no difficulty in using them and designing
the algo in its total. The problem is that the Reed Solomon used to produce
the S keys is in a rolled-out form, because I chose not to use any form of
memory. So, if you want to implement more that one key size cipher in the
same circuit/FPGA, the design size grows very much, and I doubt if it will
fit in a signle FPGA. If you decide that you need more that one cipher
instantiation, then you'll have to tweak the design of the Reed Solomon.
One example follows:
 
Current implementaion is that the reed solomon components are specifically
designed for the key size of the cipher, i.e for 128 bits key:
 
entity reed_solomon128 is
port (
in_rs128 : in std_logic_vector(127 downto 0);
out_Sfirst_rs128,
out_Ssecond_rs128 : out std_logic_vector(31 downto 0)
);
end reed_solomon128;
 
and for 192 bits key:
 
entity reed_solomon192 is
port (
in_rs192 : in std_logic_vector(191 downto 0);
out_Sfirst_rs192,
out_Ssecond_rs192,
out_Sthird_rs192 : out std_logic_vector(31 downto 0)
);
end reed_solomon192;
 
What is happening, is that each component takes the input key, and performs the
multiplications in rolled-out form of every 64 bit input. In other terms, in_rs128
is split up in two 64 bit chunks, and each one is driven in it's respective
multipliers. The result of the first multipliers is driven to out_Sfirst, the result
of the second to out_Ssecond. Respectively for reed_solomon192 the result of the
third multiplier is driven to out_Sthird. Every multiplication needs it's
multipliers (note that it is not a single mul, but a group of them because its
a matrix multiplication) so in the first component we need two groups of muls and
in the second component three groups of them.
 
If you had to implement cipher with 128 and 192 sizes you'd have to implement both
reed solomon components which total in 5 groups of multipliers. One solution would
be to create a reed solomon that would take a single 64 bit input and procude a
single 32 bit output. For example:
 
entity reed_solomon is
port (
in_rs : in std_logic_vector(63 downto 0);
out_S_rs : out std_logic_vector(31 downto 0)
);
end reed_solomon;
 
 
Then you would divide the key into 64 bit chunks (128 bit in 2 chunks, 192 bit
in 3 chunks) and provide them to the component sequentially. The results of
the reed_solomon could be stored in a sort of RAM. That way you may slow down
the process but you get to implement only one group of multipliers and you gain
a lot in space.
 
The same goes for the whitening keys components. In the whitening components
the function h is impemented 16 times (2 h functions for each pair of keys,
for the first 8 keys - K0..7). You could follow the above example and implement
a component that accepts a 64 bit input (key chunk, every M is 32 bit, you need
2 Ms for every h function) and produce a single 32 bit key. Thus, you can
produce every key sequentially and store it in a RAM for example.
 
If you want some implementation examples, you'll have to read the testbenches.
The cipher is implemented in iterated mode, but you'll get a clear picture of how
to connect the components.
 
/trunk/test_vectors/twofish_ecb_vt_testvalues_192bits.txt
0,0 → 1,256
80000000000000000000000000000000
62EF193EDB7D399ACA50EC1CBE5398D8
40000000000000000000000000000000
E7A58D547688BA8B69DA949E38AA6FAD
20000000000000000000000000000000
71579F70A8EDB2BA5C00C513E2D7DEEB
10000000000000000000000000000000
C6171EF892F8224DC5FAE230AF629F52
08000000000000000000000000000000
C6A61053C48D7ECD7DDD12DB0F316AD7
04000000000000000000000000000000
EA5833714F1324DAB7F53CACC63F784F
02000000000000000000000000000000
450BCB0C7351CB1CDAC5D02E80D13C64
01000000000000000000000000000000
C267D3634F84215FB7B4635AFA385E52
00800000000000000000000000000000
6DB5B1B156DA1C36B9AB5AB59B063C29
00400000000000000000000000000000
EDF2D9B19FF75561E8FA6F411C4A0431
00200000000000000000000000000000
A11AE84E6D2C56DED2B9497FEC7504A7
00100000000000000000000000000000
B3A1A1E271BF94DA3A5ECFF1D4293A56
00080000000000000000000000000000
5577374ADCF2F58EEEFFC432C42AEB76
00040000000000000000000000000000
CD9D355C3574343BC7FBE645CE7EA721
00020000000000000000000000000000
76EB4C046F052AE4ED41060BF60067FB
00010000000000000000000000000000
1273A4BC420BCC9E29619567B1E61762
00008000000000000000000000000000
1F80E1CE3F12C96F2E647BACB6DA78D8
00004000000000000000000000000000
12D34A7875E716B37A7E250D37AFFDEA
00002000000000000000000000000000
5A54D764EEFFC4B64143A58B071514B4
00001000000000000000000000000000
F4F1567BDC5B1F938D5A214419090FE0
00000800000000000000000000000000
6CB91B935A0FBF49636CDF64A12955B7
00000400000000000000000000000000
C082154A07AF64FF6ECA811B0E3302E6
00000200000000000000000000000000
49A746CC225C1B6009A93649CDD9EDCD
00000100000000000000000000000000
1CAD0512E3CC51210B411EE452DF62E4
00000080000000000000000000000000
4FE9A0CF34BBCFFF906D8450197CC9D1
00000040000000000000000000000000
38DB8EF6C8993F17BB4D1614B9DE15D4
00000020000000000000000000000000
08DB3F476F551D19D9643A9E139E0553
00000010000000000000000000000000
F0F518F73795AB51BFB6E0AA99A0DAC7
00000008000000000000000000000000
91544D597F679E7DFE6D16D475809851
00000004000000000000000000000000
B1F92601B6D8C6B81176A46EE7341D28
00000002000000000000000000000000
796C3A8CBC6450E51FA6F8765ACD0F10
00000001000000000000000000000000
5F7BFE71BD2E81599DDA3411BC1CA579
00000000800000000000000000000000
2DF7D576EC6296101CAB16012092C12C
00000000400000000000000000000000
20769DE071FBE22AE49E7B3F5D646418
00000000200000000000000000000000
B6F5C012E4BA15DC86536F328B137FC0
00000000100000000000000000000000
1C3031DD05EAA4C278B55EF0E7E4C1F9
00000000080000000000000000000000
3D72A53BD537D04AC59E0AF36D105ED9
00000000040000000000000000000000
A6FFE499A2050C38F4E89DBF12B27430
00000000020000000000000000000000
BFBB2A537B2C1339D6230F35A256F289
00000000010000000000000000000000
70E79718C97DDB187411436AC072B148
00000000008000000000000000000000
13BB56699085842B81DBE8FAA8B26269
00000000004000000000000000000000
3E4DB71B9C737C7F8AEF632A5ADEF61D
00000000002000000000000000000000
D7A254B7341C7677C72F9DE729A3BB78
00000000001000000000000000000000
527D14E58B74224622DF7F3FD65932F5
00000000000800000000000000000000
708703993AD1DDE5C7F8714686F3AF32
00000000000400000000000000000000
C57D3ECB71A7DA4708DE6F338BC13E09
00000000000200000000000000000000
B31FF60BE0FDC17001CAF87FC7FC0B2D
00000000000100000000000000000000
01877AC646A283472DA74182FDC1E2B5
00000000000080000000000000000000
3C678BADA3FB1B872C018DC035AE16E8
00000000000040000000000000000000
A2CB209DA6AA40E043E6FB9DD2476100
00000000000020000000000000000000
4F9402FF56D04C8FB37DBE1A3109D2DE
00000000000010000000000000000000
342DAAD90F0F1699048D5CD16FDA2EC7
00000000000008000000000000000000
E68CC86CA4D952BC3890AEC0A7AAA4B5
00000000000004000000000000000000
02A88364BF94A677124F670A566E3F0D
00000000000002000000000000000000
C961EF325E2A32A4359CC63BE1EE2C77
00000000000001000000000000000000
03BF43C9083E4D9919D12FE5C0315E67
00000000000000800000000000000000
B27063442470BE07DCC2256EC71A4F1A
00000000000000400000000000000000
222CC5A29084A4BDB05D4C2FD95648DF
00000000000000200000000000000000
E08686BFAA936E1890AEEC834E3B474A
00000000000000100000000000000000
10DC4FFCAC5F5A1FB668277E8E75BEAB
00000000000000080000000000000000
03A9199978F9D652A4C528FF86C39CE9
00000000000000040000000000000000
DDF718A1BEB37CC1B0905520DB7C1611
00000000000000020000000000000000
2072191C277EE40FD557FF5F67A2A546
00000000000000010000000000000000
96B3608C06112F619B156105EB082BBE
00000000000000008000000000000000
B5D919DFD9828C4FF4427E72ABFC77B2
00000000000000004000000000000000
9570E7A96D4674C800AF8DCD01DEFF64
00000000000000002000000000000000
59723DB66EDB29A9C81175668903777F
00000000000000001000000000000000
1779BDFAC6DB722BCAF4D3A8D9D2E725
00000000000000000800000000000000
5107B50A150998C6EA01C14697FC0E53
00000000000000000400000000000000
36A6CAA08BD5D2B332E9323F7C2E76CA
00000000000000000200000000000000
D1CF37451667EDB8D2E9934D39A27A92
00000000000000000100000000000000
4E96227B0A018755FBE8AD5BF0E421B0
00000000000000000080000000000000
3221B3D3A24745B483BBF99509B330A0
00000000000000000040000000000000
98A4AB39B84D21D36A5DDC2660BD68C5
00000000000000000020000000000000
E5C351E1783465EDBA5CE0592BC77E8E
00000000000000000010000000000000
35489488EE33D0344C1BDB6263D28286
00000000000000000008000000000000
97EA899F53C60536DAFEB18123FD6C5B
00000000000000000004000000000000
8511B11C7D2D8FBF63702A7E3AACA08A
00000000000000000002000000000000
FE0C90596E4F47FD8A9927D83F4DCA52
00000000000000000001000000000000
186FE000683CC19F621BC6C2DA300B71
00000000000000000000800000000000
8291F94EDF578E8A70CD0CF8F3FB3558
00000000000000000000400000000000
2891C81846949C917E757EBAE20D34EE
00000000000000000000200000000000
762D85A32DAF0C9F3CFB3388E808FEC2
00000000000000000000100000000000
CC6807D209B728C559C32336FD8FB71D
00000000000000000000080000000000
FCD07057EF4820154075A0DDCBFC0BBD
00000000000000000000040000000000
FDBFE2C3FFC82792D338388A1FC6D22E
00000000000000000000020000000000
04D5F7CD68FC2352BDDBC82CFE35DA80
00000000000000000000010000000000
B1784A7BF395FB525471EE3DC8972FED
00000000000000000000008000000000
CB5D8A62D16220123EF0005876E35B19
00000000000000000000004000000000
311292EDE1F30E9F22F1EEF8FD19BD80
00000000000000000000002000000000
382BC583EC9B6E16E3DF2188CF0BF1E8
00000000000000000000001000000000
632C9AD674BD1B8A15827A789BD133A7
00000000000000000000000800000000
0EE175DF45B889CED6974E9C2B8F8A78
00000000000000000000000400000000
6131A1A18F00CFDA5B4AF4FBE5487445
00000000000000000000000200000000
0C8746747460A540E2304B55C12EA672
00000000000000000000000100000000
DD6D4D2AA3EB702C597E4E2DE59BF4C9
00000000000000000000000080000000
774EDF219459A4744AA1CCDE7D969A60
00000000000000000000000040000000
1D7B340C4CE68AC97369FFF0FF9980C8
00000000000000000000000020000000
D18104617258AB02AAE02ECCF552A891
00000000000000000000000010000000
8DC66F1D7648EB62F1DCBEB3CD237985
00000000000000000000000008000000
ABF090054ABE052ECE0B07BE6B6CC6DB
00000000000000000000000004000000
89239AAFE9BA86E5EC794397E0180111
00000000000000000000000002000000
6E1CDC049333211B4D7533E21504D200
00000000000000000000000001000000
EFE662AF24D9997FAE45CAD4F92F3091
00000000000000000000000000800000
16F53F3A6CC3B4F86DDA1B8792244901
00000000000000000000000000400000
047CBACDC5EA84771A61FE1204813D46
00000000000000000000000000200000
B442FF3318822EA7F60E2A8A082A043A
00000000000000000000000000100000
971D07AEEDBCA5B7BDCD033F708C97DB
00000000000000000000000000080000
D307263273E250C0B9E08FF23003B0D1
00000000000000000000000000040000
75F7005CA9C6EE5A1F9A4897FA67C661
00000000000000000000000000020000
9B421C68873D49F07E3B9025AD609787
00000000000000000000000000010000
5B182593B47DC674D8B1942CB97224B2
00000000000000000000000000008000
A896871A3157CCD1F5A788E253A6B0FD
00000000000000000000000000004000
789A3D2B2A70181EFCCE5529F200DC44
00000000000000000000000000002000
7F9462D23DB6E99AD0A54EA84DBD94E2
00000000000000000000000000001000
23EAFE1F7CCE96B6BFE2484E1DFC4AB9
00000000000000000000000000000800
A76C323805F9C252C8B86C83294B9987
00000000000000000000000000000400
D8CA1075B7A3F2CF2DAC0980B1B66CC1
00000000000000000000000000000200
8206D89F2A07BA6403647FB85A2F4D7D
00000000000000000000000000000100
3DE7573CD46D85488364472B038869F9
00000000000000000000000000000080
31C62401D6E9E4995C0913747BFE7C7E
00000000000000000000000000000040
C464728025916B4E8D56E4A9F98C1A25
00000000000000000000000000000020
0D4643EE09ABD6D6062187789AE9A77D
00000000000000000000000000000010
0C06EAC3043ABE6554C2DA42F21E7B05
00000000000000000000000000000008
E26C6B2CBE2130729A5BF96E7CD29912
00000000000000000000000000000004
4DE2B8FFF3588A5D4E62CADB720E5BCC
00000000000000000000000000000002
B96DD46C6A286BFF721693A98491F529
00000000000000000000000000000001
64F1DBD3C79EE69AC9E0ED5F554F4AB6
/trunk/test_vectors/twofish_ecb_encryption_monte_carlo_testvalues_128bits.txt
0,0 → 1,1200
00000000000000000000000000000000
00000000000000000000000000000000
282BE7E4FA1FBDC29661286F1F310B7E
282BE7E4FA1FBDC29661286F1F310B7E
282BE7E4FA1FBDC29661286F1F310B7E
C8E1D477621ACC37742BD16032075654
E0CA3393980571F5E24AF90F2D365D2A
C8E1D477621ACC37742BD16032075654
D5187E7D6B8BE9517DAC4A8AF4A552EA
35D24DEEF38E98A49FE6B385D9930FC0
D5187E7D6B8BE9517DAC4A8AF4A552EA
211B6F0C6061068D203440ADEFC45BAB
14C922E293EF9E29BFD2F3283657546B
211B6F0C6061068D203440ADEFC45BAB
E94DB85DAE438578A462277AC251F102
FD849ABF3DAC1B511BB0D452F406A569
E94DB85DAE438578A462277AC251F102
A5BDABB173DB6CE64053C4B050883A0F
5839310E4E7777B75BE310E2A48E9F66
A5BDABB173DB6CE64053C4B050883A0F
F755B9916180CDBF452A0C747456F344
AF6C889F2FF7BA081EC91C96D0D86C22
F755B9916180CDBF452A0C747456F344
8221CABB6750DC8A297B39D4D504F08D
2D4D422448A7668237B2254205DC9CAF
8221CABB6750DC8A297B39D4D504F08D
61345499D2A6C4DAF940CDD3A067009A
4C7916BD9A01A258CEF2E891A5BB9C35
61345499D2A6C4DAF940CDD3A067009A
8D162289F56000669BBF91C31B6DB3D6
C16F34346F61A23E554D7952BED62FE3
8D162289F56000669BBF91C31B6DB3D6
0774D6135A4C353D4D78D59A5849CEA4
C61BE227352D97031835ACC8E69FE147
0774D6135A4C353D4D78D59A5849CEA4
B2C8ED907EDF3A6FA9422DF8F1F1685B
74D30FB74BF2AD6CB1778130176E891C
B2C8ED907EDF3A6FA9422DF8F1F1685B
8F37F99F1BAC61BEBB87892AEAC25F8D
FBE4F628505ECCD20AF0081AFDACD691
8F37F99F1BAC61BEBB87892AEAC25F8D
9654D1D7FBC87DA434103C11101C4116
6DB027FFAB96B1763EE0340BEDB09787
9654D1D7FBC87DA434103C11101C4116
B20B65FBAC9508F86C15EE40EEFB643F
DFBB42040703B98E52F5DA4B034BF3B8
B20B65FBAC9508F86C15EE40EEFB643F
E0C2F2C5D5DF1AC0712C4AE93DDC3766
3F79B0C1D2DCA34E23D990A23E97C4DE
E0C2F2C5D5DF1AC0712C4AE93DDC3766
B81EB2EAA144914F64ED65A83099A649
8767022B739832014734F50A0E0E6297
B81EB2EAA144914F64ED65A83099A649
2ABC1A3FB894ECCF3A1703B98F9DD5AE
ADDB1814CB0CDECE7D23F6B38193B739
2ABC1A3FB894ECCF3A1703B98F9DD5AE
C18817C05B8E8574C7B16DB7A402F9D5
6C530FD490825BBABA929B0425914EEC
C18817C05B8E8574C7B16DB7A402F9D5
D74C217A3AA5489D9450B15021C6A3BA
BB1F2EAEAA2713272EC22A540457ED56
D74C217A3AA5489D9450B15021C6A3BA
DC565C089E1E355EE95D62362F08B827
674972A634392679C79F48622B5F5571
DC565C089E1E355EE95D62362F08B827
380E0F8A2CC850DF35405986E4582F97
5F477D2C18F176A6F2DF11E4CF077AE6
380E0F8A2CC850DF35405986E4582F97
4D0F2C9784EB4D1EE1D5E8F4DB624E42
124851BB9C1A3BB8130AF910146534A4
4D0F2C9784EB4D1EE1D5E8F4DB624E42
F09B6678BE7402FCE8235BDC195A363C
E2D337C3226E3944FB29A2CC0D3F0298
F09B6678BE7402FCE8235BDC195A363C
965B3CD732EE6C5FF970AC8658F7AD22
74880B141080551B02590E4A55C8AFBA
965B3CD732EE6C5FF970AC8658F7AD22
7EAFBE16416077C02E475128DE4628C0
0A27B50251E022DB2C1E5F628B8E877A
7EAFBE16416077C02E475128DE4628C0
EF979CA42E7C633A24944F8E1982E01E
E5B029A67F9C41E1088A10EC920C6764
EF979CA42E7C633A24944F8E1982E01E
DFF4D8207CAD10CF641C3178FCE84F4D
3A44F1860331512E6C9621946EE42829
DFF4D8207CAD10CF641C3178FCE84F4D
40DC051B943F8974817834AF1E2167A4
7A98F49D970ED85AEDEE153B70C54F8D
40DC051B943F8974817834AF1E2167A4
09A5CE843CDAEF89C7EA6D3E2CEBD7D5
733D3A19ABD437D32A0478055C2E9858
09A5CE843CDAEF89C7EA6D3E2CEBD7D5
D76979E6D3BB2CE81626FFC0BBDA41DE
A45443FF786F1B3B3C2287C5E7F4D986
D76979E6D3BB2CE81626FFC0BBDA41DE
B5F3839C461FA18DE4656A4F36FF9500
11A7C0633E70BAB6D847ED8AD10B4C86
B5F3839C461FA18DE4656A4F36FF9500
AAB90030FCADFC43B4283656613F01B2
BB1EC053C2DD46F56C6FDBDCB0344D34
AAB90030FCADFC43B4283656613F01B2
D2B030E6AC7CD82E68A14915132FF871
69AEF0B56EA19EDB04CE92C9A31BB545
D2B030E6AC7CD82E68A14915132FF871
EAEE91662FDDC26B7F9C7380A96C7C15
834061D3417C5CB07B52E1490A77C950
EAEE91662FDDC26B7F9C7380A96C7C15
36695D4DDCA943B3037E2C2DF0668002
B5293C9E9DD51F03782CCD64FA114952
36695D4DDCA943B3037E2C2DF0668002
6B170808E46C35BA595DAE2099C1CA6D
DE3E349679B92AB92171634463D0833F
6B170808E46C35BA595DAE2099C1CA6D
9AA7BCF3DE9180AA607BF4BBC41BD439
44998865A728AA13410A97FFA7CB5706
9AA7BCF3DE9180AA607BF4BBC41BD439
ABBBA619CD8C7394FA480663D33CF427
EF222E7C6AA4D987BB42919C74F7A321
ABBBA619CD8C7394FA480663D33CF427
860D15B6649594308273A03F5CBFEC91
692F3BCA0E314DB7393131A328484FB0
860D15B6649594308273A03F5CBFEC91
AAE03038DA17166958013CA5D39A3BEF
C3CF0BF2D4265BDE61300D06FBD2745F
AAE03038DA17166958013CA5D39A3BEF
DCCF2A35D241ADBE5DF5F13E7CF7B182
1F0021C70667F6603CC5FC388725C5DD
DCCF2A35D241ADBE5DF5F13E7CF7B182
1336E92B46B38A05C15EEF83D46CE7F2
0C36C8EC40D47C65FD9B13BB5349222F
1336E92B46B38A05C15EEF83D46CE7F2
0891129BDBE0B9025A50260EFF990F14
04A7DA779B34C567A7CB35B5ACD02D3B
0891129BDBE0B9025A50260EFF990F14
5AA1CE15AD964E9B4B3DFFA7063C4600
5E06146236A28BFCECF6CA12AAEC6B3B
5AA1CE15AD964E9B4B3DFFA7063C4600
019D428F593124A1654685A3B254F8C8
5F9B56ED6F93AF5D89B04FB118B893F3
019D428F593124A1654685A3B254F8C8
A336B675FF779D83CD2CD3A6F77DBD6D
FCADE09890E432DE449C9C17EFC52E9E
A336B675FF779D83CD2CD3A6F77DBD6D
CDAB1755F5275033770EB4BE9B6E1692
3106F7CD65C362ED339228A974AB380C
CDAB1755F5275033770EB4BE9B6E1692
967C7746CFB2128F4C057664E242B611
A77A808BAA7170627F975ECD96E98E1D
967C7746CFB2128F4C057664E242B611
936D8467BC869156B261B68C08FE7880
341704EC16F7E134CDF6E8419E17F69D
936D8467BC869156B261B68C08FE7880
5BE21A50208575AE3488033641421574
6FF51EBC3672949AF97EEB77DF55E3E9
5BE21A50208575AE3488033641421574
E2650D5C0BE24960D3CFE52D304510AD
8D9013E03D90DDFA2AB10E5AEF10F344
E2650D5C0BE24960D3CFE52D304510AD
FCD1E0D264E3E09719F3F77524785A62
7141F33259733D6D3342F92FCB68A926
FCD1E0D264E3E09719F3F77524785A62
0A5AACDB7147D505042D0A63C78462D1
7B1B5FE92834E868376FF34C0CECCBF7
0A5AACDB7147D505042D0A63C78462D1
009C224315C9013BF3643D6DDC1F0EF5
7B877DAA3DFDE953C40BCE21D0F3C502
009C224315C9013BF3643D6DDC1F0EF5
E1CBAC971638C82C8C3E3E9CA51C4F87
9A4CD13D2BC5217F4835F0BD75EF8A85
E1CBAC971638C82C8C3E3E9CA51C4F87
99DAE0E5D4901851EC25F3239FB04F66
039631D8FF55392EA410039EEA5FC5E3
99DAE0E5D4901851EC25F3239FB04F66
160A6BE0573BA8FF559A2F2BFBD98832
159C5A38A86E91D1F18A2CB511864DD1
160A6BE0573BA8FF559A2F2BFBD98832
361D7B6EC31CCA39F13D81376BBFE609
238121566B725BE800B7AD827A39ABD8
361D7B6EC31CCA39F13D81376BBFE609
508734C88EC8EB6ADDAA937CBE492218
7306159EE5BAB082DD1D3EFEC47089C0
508734C88EC8EB6ADDAA937CBE492218
689CF560BA192F61035C8B82F88AE752
1B9AE0FE5FA39FE3DE41B57C3CFA6E92
689CF560BA192F61035C8B82F88AE752
E3BFD40E024E90B15DC8B6A8102B1770
F82534F05DED0F52838903D42CD179E2
E3BFD40E024E90B15DC8B6A8102B1770
30E095BC1A17C27CD6D1F67C568D1ED4
C8C5A14C47FACD2E5558F5A87A5C6736
30E095BC1A17C27CD6D1F67C568D1ED4
618D74EC86E3E1083F9A0128C62FFEB8
A948D5A0C1192C266AC2F480BC73998E
618D74EC86E3E1083F9A0128C62FFEB8
4968014D44347DA04F6C8307EDABA279
E020D4ED852D518625AE778751D83BF7
4968014D44347DA04F6C8307EDABA279
A350A83533FC973F0A5DE274956342EC
43707CD8B6D1C6B92FF395F3C4BB791B
A350A83533FC973F0A5DE274956342EC
176EC52E15A379710F881990648F555F
541EB9F6A372BFC8207B8C63A0342C44
176EC52E15A379710F881990648F555F
63B000775E7A52C1A7A1C09E0A770244
37AEB981FD08ED0987DA4CFDAA432E00
63B000775E7A52C1A7A1C09E0A770244
63CBB4636102D5AB32B98AFCCDA07979
54650DE29C0A38A2B563C60167E35779
63CBB4636102D5AB32B98AFCCDA07979
DA1741D825542A8AD790978251EBFD5C
8E724C3AB95E122862F351833608AA25
DA1741D825542A8AD790978251EBFD5C
7AD793FAE5ED0B11A97AE94ECC4E1CF0
F4A5DFC05CB31939CB89B8CDFA46B6D5
7AD793FAE5ED0B11A97AE94ECC4E1CF0
BB55B89AF608BB6AA690C6AEFBF00450
4FF0675AAABBA2536D197E6301B6B285
BB55B89AF608BB6AA690C6AEFBF00450
524BEF104799A393087C25D86358456E
1DBB884AED2201C065655BBB62EEF7EB
524BEF104799A393087C25D86358456E
74747C2A87B9C7DE89217E2BC0D0ACA2
69CFF4606A9BC61EEC442590A23E5B49
74747C2A87B9C7DE89217E2BC0D0ACA2
B5A6CA6070760D83195098FD013E101C
DC693E001AEDCB9DF514BD6DA3004B55
B5A6CA6070760D83195098FD013E101C
2432A112ABEF9F3D3FE85EBDC78ED535
F85B9F12B10254A0CAFCE3D0648E9E60
2432A112ABEF9F3D3FE85EBDC78ED535
BCCC322AC5BF0E65D592006AA67A953C
4497AD3874BD5AC51F6EE3BAC2F40B5C
BCCC322AC5BF0E65D592006AA67A953C
ED4DB943B7583009165DBC906CCA3189
A9DA147BC3E56ACC09335F2AAE3E3AD5
ED4DB943B7583009165DBC906CCA3189
F5A44CE9DC9F270900306292F6B314D5
5C7E58921F7A4DC509033DB8588D2E00
F5A44CE9DC9F270900306292F6B314D5
19A1D7CD180EBD7F28B16D3F8013749A
45DF8F5F0774F0BA21B25087D89E5A9A
19A1D7CD180EBD7F28B16D3F8013749A
990A59504851CB2E9DB0B4EC8EFF8F4F
DCD5D60F4F253B94BC02E46B5661D5D5
990A59504851CB2E9DB0B4EC8EFF8F4F
6F136B760B20D1BE72716E90D45229F0
B3C6BD794405EA2ACE738AFB8233FC25
6F136B760B20D1BE72716E90D45229F0
5B0C3F20F4D44CC4978D488C7852D6C9
E8CA8259B0D1A6EE59FEC277FA612AEC
5B0C3F20F4D44CC4978D488C7852D6C9
820D52315D8D61C05651B3BDF653B870
6AC7D068ED5CC72E0FAF71CA0C32929C
820D52315D8D61C05651B3BDF653B870
2596BECB37FBCD312A218FCE170FCB3B
4F516EA3DAA70A1F258EFE041B3D59A7
2596BECB37FBCD312A218FCE170FCB3B
1587480FAC7DBE46555540D2A058AC1F
5AD626AC76DAB45970DBBED6BB65F5B8
1587480FAC7DBE46555540D2A058AC1F
335AB9D96600A32140EA7A30A6B6CF8D
698C9F7510DA17783031C4E61DD33A35
335AB9D96600A32140EA7A30A6B6CF8D
1A2A665BE77D715245B1EB1E849C4C43
73A6F92EF7A7662A75802FF8994F7676
1A2A665BE77D715245B1EB1E849C4C43
45D0C8919D58D68D977EB465C59DBB76
367631BF6AFFB0A7E2FE9B9D5CD2CD00
45D0C8919D58D68D977EB465C59DBB76
A5F172BA7CF9554390F8F03284A8DE01
938743051606E5E472066BAFD87A1301
A5F172BA7CF9554390F8F03284A8DE01
6139B611AF323D5E7221FCEAA8DAD0ED
F2BEF514B934D8BA0027974570A0C3EC
6139B611AF323D5E7221FCEAA8DAD0ED
A993E51F0F77BD267097530FB2334A17
5B2D100BB643659C70B0C44AC29389FB
A993E51F0F77BD267097530FB2334A17
848261FE6529C66904255715FC63965D
DFAF71F5D36AA3F57495935F3EF01FA6
848261FE6529C66904255715FC63965D
DB25B05DF5A8B09E03DE7930733AC61B
048AC1A826C2136B774BEA6F4DCAD9BD
DB25B05DF5A8B09E03DE7930733AC61B
552ADE92B6DAEFCA737BDD7DB2BDEE2A
51A01F3A9018FCA104303712FF773797
552ADE92B6DAEFCA737BDD7DB2BDEE2A
9B8F9E075142B39267092497D5B86853
CA2F813DC15A4F33633913852ACF5FC4
9B8F9E075142B39267092497D5B86853
0E90419DED8DD50F82A3A2C483D66517
C4BFC0A02CD79A3CE19AB141A9193AD3
0E90419DED8DD50F82A3A2C483D66517
12528A9AA90255F4DC8D03576C05F3EB
D6ED4A3A85D5CFC83D17B216C51CC938
12528A9AA90255F4DC8D03576C05F3EB
B08C359FD8967BA36732A39ADAE8B636
66617FA55D43B46B5A25118C1FF47F0E
B08C359FD8967BA36732A39ADAE8B636
80E63B50A22C40088F5A1BC2CFDD349A
E68744F5FF6FF463D57F0A4ED0294B94
80E63B50A22C40088F5A1BC2CFDD349A
F7279BF3A8D3B1AF94E2CC36C96097BB
11A0DF0657BC45CC419DC6781949DC2F
F7279BF3A8D3B1AF94E2CC36C96097BB
B5A423EE121C474A984AD82D5E889CBF
A404FCE845A00286D9D71E5547C14090
B5A423EE121C474A984AD82D5E889CBF
28B34ED19E39B2E3CB486CA569A3B14A
8CB7B239DB99B065129F72F02E62F1DA
28B34ED19E39B2E3CB486CA569A3B14A
17E91DED13CC65CD62CAE3E5E83380D7
9B5EAFD4C855D5A870559115C651710D
17E91DED13CC65CD62CAE3E5E83380D7
8BF7E63D0E48D28AC1DFB1FB08EC721F
10A949E9C61D0722B18A20EECEBD0312
8BF7E63D0E48D28AC1DFB1FB08EC721F
ADB56CF7C64FAF95D370E4B12C752AC5
BD1C251E0052A8B762FAC45FE2C829D7
ADB56CF7C64FAF95D370E4B12C752AC5
79B0DA9B369D15731425FC4682F48616
C4ACFF8536CFBDC476DF3819603CAFC1
79B0DA9B369D15731425FC4682F48616
FD0F217E1A787145F36D09C07D5C6E7B
39A3DEFB2CB7CC8185B231D91D60C1BA
FD0F217E1A787145F36D09C07D5C6E7B
C74BCCA8845312603FE3988DC4BE62BC
FEE81253A8E4DEE1BA51A954D9DEA306
C74BCCA8845312603FE3988DC4BE62BC
0D608B8879D9D0AB6A3F1C4E56721217
F38899DBD13D0E4AD06EB51A8FACB111
0D608B8879D9D0AB6A3F1C4E56721217
486BAE1B4DB50A730433FC0CCD9E0BA6
BBE337C09C880439D45D49164232BAB7
486BAE1B4DB50A730433FC0CCD9E0BA6
F61FD1A17CB195F11104B1571B28A187
4DFCE661E03991C8C559F841591A1B30
F61FD1A17CB195F11104B1571B28A187
DC083F612DBB1F8A1FF737D80E7558A8
91F4D900CD828E42DAAECF99576F4398
DC083F612DBB1F8A1FF737D80E7558A8
7DA3B893436601984AE052D01A5067C4
EC5761938EE48FDA904E9D494D3F245C
7DA3B893436601984AE052D01A5067C4
C9CEE9BA2503B20F3DE2F12F807A46A4
25998829ABE73DD5ADAC6C66CD4562F8
C9CEE9BA2503B20F3DE2F12F807A46A4
FF18C9B2EE2E35B3F1F4067514C9AAAC
DA81419B45C908665C586A13D98CC854
FF18C9B2EE2E35B3F1F4067514C9AAAC
452DE60719422576A26C539B655D9429
9FACA79C5C8B2D10FE343988BCD15C7D
452DE60719422576A26C539B655D9429
C6CE77A035FC993B0E758C38A561B033
5962D03C6977B42BF041B5B019B0EC4E
C6CE77A035FC993B0E758C38A561B033
16448DAF921FD9310F8A896CE2B13B48
4F265D93FB686D1AFFCB3CDCFB01D706
16448DAF921FD9310F8A896CE2B13B48
B42711904683A65C0EA0F1477E902A14
FB014C03BDEBCB46F16BCD9B8591FD12
B42711904683A65C0EA0F1477E902A14
D4022598117ED5532FF126E9DD273533
2F03699BAC951E15DE9AEB7258B6C821
D4022598117ED5532FF126E9DD273533
A97956F798FA8A219AC9728B515A6BE7
867A3F6C346F9434445399F909ECA3C6
A97956F798FA8A219AC9728B515A6BE7
E8D314E83100737AE9C2D45177DFEB82
6EA92B84056FE74EAD914DA87E334844
E8D314E83100737AE9C2D45177DFEB82
00D5D3E49647B0A9B6017D4FE3413AC5
6E7CF860932857E71B9030E79D727281
00D5D3E49647B0A9B6017D4FE3413AC5
B4B0C83AD8F4804BD9F5E9E496D7F7A4
DACC305A4BDCD7ACC265D9030BA58525
B4B0C83AD8F4804BD9F5E9E496D7F7A4
14649C474ADFDA861D7270ED5B1B27A5
CEA8AC1D01030D2ADF17A9EE50BEA280
14649C474ADFDA861D7270ED5B1B27A5
67181B587CB90F75D07318FDBBAF8F75
A9B0B7457DBA025F0F64B113EB112DF5
67181B587CB90F75D07318FDBBAF8F75
DDD9C1CA84A3F9454DDB83861B0CDE80
7469768FF919FB1A42BF3295F01DF375
DDD9C1CA84A3F9454DDB83861B0CDE80
D1AD6F2D906153B359F0706A898BD571
A5C419A26978A8A91B4F42FF79962604
D1AD6F2D906153B359F0706A898BD571
6B2697A05315CCC69C80B23BF83F2A6F
CEE28E023A6D646F87CFF0C481A90C6B
6B2697A05315CCC69C80B23BF83F2A6F
7B611F219B463A257C1D7BC95EA6E9EC
B5839123A12B5E4AFBD28B0DDF0FE587
7B611F219B463A257C1D7BC95EA6E9EC
788B5E813EED7B66443468EF48385114
CD08CFA29FC6252CBFE6E3E29737B493
788B5E813EED7B66443468EF48385114
DBD3FC9D7C35FAEAD70A0E739D53F68A
16DB333FE3F3DFC668ECED910A644219
DBD3FC9D7C35FAEAD70A0E739D53F68A
C2D1C489A4E0163F5CDEE3F5E629F71F
D40AF7B64713C9F934320E64EC4DB506
C2D1C489A4E0163F5CDEE3F5E629F71F
99B43CCE08ED4B62EB02EB8DFAD548C3
4DBECB784FFE829BDF30E5E91698FDC5
99B43CCE08ED4B62EB02EB8DFAD548C3
E63032BAA6CC38786CEA043772DF1304
AB8EF9C2E932BAE3B3DAE1DE6447EEC1
E63032BAA6CC38786CEA043772DF1304
693F1A09576222B6F610068520459BE0
C2B1E3CBBE50985545CAE75B44027521
693F1A09576222B6F610068520459BE0
C87EF3A39265F9BBCAC7BBF28A643726
0ACF10682C3561EE8F0D5CA9CE664207
C87EF3A39265F9BBCAC7BBF28A643726
FDA4BCCB2E52E35BE4FDB5D62B73FB12
F76BACA3026782B56BF0E97FE515B915
FDA4BCCB2E52E35BE4FDB5D62B73FB12
96F7D133C7B387F65663CBE618AFB8C2
619C7D90C5D405433D932299FDBA01D7
96F7D133C7B387F65663CBE618AFB8C2
8D42B3A0192C4FF32073F608B3A6C37A
ECDECE30DCF84AB01DE0D4914E1CC2AD
8D42B3A0192C4FF32073F608B3A6C37A
E50ABCC6E70C5D20B9E5C2A4689E0291
09D472F63BF41790A40516352682C03C
E50ABCC6E70C5D20B9E5C2A4689E0291
DAEA75FB0EB33934BF4DFCD2165ACFC0
D33E070D35472EA41B48EAE730D80FFC
DAEA75FB0EB33934BF4DFCD2165ACFC0
A79BBB95EB3F8E60FE4F90DBA9EC4359
74A5BC98DE78A0C4E5077A3C99344CA5
A79BBB95EB3F8E60FE4F90DBA9EC4359
CCCDCF9061FD278A790206E4A0664EAD
B8687308BF85874E9C057CD839520208
CCCDCF9061FD278A790206E4A0664EAD
D02C419AAB25E336BFABB4B00BE59D34
6844329214A0647823AEC86832B79F3C
D02C419AAB25E336BFABB4B00BE59D34
D3C903079C1A883A5A08B7F8990AD93B
BB8D319588BAEC4279A67F90ABBD4607
D3C903079C1A883A5A08B7F8990AD93B
C67A5ADAB6E5190CA5F162839F4BC1C6
7DF76B4F3E5FF54EDC571D1334F687C1
C67A5ADAB6E5190CA5F162839F4BC1C6
9527D2D4B275EA5EDECAF5CF550E08C5
E8D0B99B8C2A1F10029DE8DC61F88F04
9527D2D4B275EA5EDECAF5CF550E08C5
E989CB808CA7E2CD7728BC2A433A6120
0159721B008DFDDD75B554F622C2EE24
E989CB808CA7E2CD7728BC2A433A6120
EF1DD84A0F5E793EAC2A6E2A57AF6D6A
EE44AA510FD384E3D99F3ADC756D834E
EF1DD84A0F5E793EAC2A6E2A57AF6D6A
DFC48240A01E9412F8F2332C2E291133
31802811AFCD10F1216D09F05B44927D
DFC48240A01E9412F8F2332C2E291133
4F711522B3921FA5B86D7022F565756D
7EF13D331C5F0F54990079D2AE21E710
4F711522B3921FA5B86D7022F565756D
4A2F7186B6B4694CE161D94B501489E9
34DE4CB5AAEB66187861A099FE356EF9
4A2F7186B6B4694CE161D94B501489E9
C97EC382DECD18B11CA15939BC2FEF74
FDA08F3774267EA964C0F9A0421A818D
C97EC382DECD18B11CA15939BC2FEF74
2B3ED6FE12DA85BBDB82B94A5941E7E3
D69E59C966FCFB12BF4240EA1B5B666E
2B3ED6FE12DA85BBDB82B94A5941E7E3
6C8E4F545D95F102386DCC061A956A68
BA10169D3B690A10872F8CEC01CE0C06
6C8E4F545D95F102386DCC061A956A68
1D5CD2E1BA4E3454161811F830FF8EE4
A74CC47C81273E4491379D14313182E2
1D5CD2E1BA4E3454161811F830FF8EE4
9E4BE7F37C1515292E8548FB5F9BCD54
3907238FFD322B6DBFB2D5EF6EAA4FB6
9E4BE7F37C1515292E8548FB5F9BCD54
0305776346FF6DA8F461ED225F513C10
3A0254ECBBCD46C54BD338CD31FB73A6
0305776346FF6DA8F461ED225F513C10
60CCE109870A005BDD3886AD8B62AC1F
5ACEB5E53CC7469E96EBBE60BA99DFB9
60CCE109870A005BDD3886AD8B62AC1F
7A6593022A9769F96ED9B5D05FB3EAC1
20AB26E716502F67F8320BB0E52A3578
7A6593022A9769F96ED9B5D05FB3EAC1
249293B8EBF459195AB47A6095453908
0439B55FFDA4767EA28671D0706F0C70
249293B8EBF459195AB47A6095453908
4D339D160F11F7F5DB64EBDFF27B06CE
490A2849F2B5818B79E29A0F82140ABE
4D339D160F11F7F5DB64EBDFF27B06CE
56BFF783E0F9C644C8CDE549BD47D869
1FB5DFCA124C47CFB12F7F463F53D2D7
56BFF783E0F9C644C8CDE549BD47D869
C9731118F25359764FAA46BEB8C4F428
D6C6CED2E01F1EB9FE8539F8879726FF
C9731118F25359764FAA46BEB8C4F428
92D6455E2E080F48A294DB8A37816830
44108B8CCE1711F15C11E272B0164ECF
92D6455E2E080F48A294DB8A37816830
898BA1410796CEB3AAF3E83F851F53D2
CD9B2ACDC981DF42F6E20A4D35091D1D
898BA1410796CEB3AAF3E83F851F53D2
9DD17E4F20C9CF1531E012D415093EA6
504A5482E9481057C7021899200023BB
9DD17E4F20C9CF1531E012D415093EA6
145F080FBC2E1624E0F20CEC27B3B7AE
44155C8D5566067327F0147507B39415
145F080FBC2E1624E0F20CEC27B3B7AE
725D90B8DEDB1AC16F91ADF0152B8590
3648CC358BBD1CB24861B98512981185
725D90B8DEDB1AC16F91ADF0152B8590
20F1ACAB0791E1299421F7428EEC703C
16B9609E8C2CFD9BDC404EC79C7461B9
20F1ACAB0791E1299421F7428EEC703C
9DCB01ED5A116BCB504585D5FAC56C0B
8B726173D63D96508C05CB1266B10DB2
9DCB01ED5A116BCB504585D5FAC56C0B
9AEB12CC963E4E3F80753BC8C9CA7C8A
119973BF4003D86F0C70F0DAAF7B7138
9AEB12CC963E4E3F80753BC8C9CA7C8A
FA1D895FCF790A22E42FB8D309925D59
EB84FAE08F7AD24DE85F4809A6E92C61
FA1D895FCF790A22E42FB8D309925D59
EEE237D3C70AD9540CE34F227CC83005
0566CD3348700B19E4BC072BDA211C64
EEE237D3C70AD9540CE34F227CC83005
0A2A61A9E2F369373971EB578E44FC83
0F4CAC9AAA83622EDDCDEC7C5465E0E7
0A2A61A9E2F369373971EB578E44FC83
04807B55CE7397CC3F1CA26712982E24
0BCCD7CF64F0F5E2E2D14E1B46FDCEC3
04807B55CE7397CC3F1CA26712982E24
60763BA71E3235CC5B0A6023CC7188BF
6BBAEC687AC2C02EB9DB2E388A8C467C
60763BA71E3235CC5B0A6023CC7188BF
A97BF1C61531C7AA353AEF0D12880CF4
C2C11DAE6FF307848CE1C13598044A88
A97BF1C61531C7AA353AEF0D12880CF4
4433D749E55901B6D962048B51FCA331
86F2CAE78AAA06325583C5BEC9F8E9B9
4433D749E55901B6D962048B51FCA331
8D9DC5D36D347D4F7B365C498A471CDF
0B6F0F34E79E7B7D2EB599F743BFF566
8D9DC5D36D347D4F7B365C498A471CDF
68F19CBF52AF83DC62315ACEFD16E53C
639E938BB531F8A14C84C339BEA9105A
68F19CBF52AF83DC62315ACEFD16E53C
33B1B37F5980FF63A98F882D2EA665F8
502F20F4ECB107C2E50B4B14900F75A2
33B1B37F5980FF63A98F882D2EA665F8
CE0DA0E48903E82C337FA4A4C85E02A3
9E22801065B2EFEED674EFB058517701
CE0DA0E48903E82C337FA4A4C85E02A3
231D03CFAB9979875788D2C879CB2667
BD3F83DFCE2B966981FC3D78219A5166
231D03CFAB9979875788D2C879CB2667
23AE16BC7E57319F185263A33E18AF8C
9E919563B07CA7F699AE5EDB1F82FEEA
23AE16BC7E57319F185263A33E18AF8C
F445882FBE41E0991FEA4898CDCECCBF
6AD41D4C0E3D476F86441643D24C3255
F445882FBE41E0991FEA4898CDCECCBF
79E6ADEAB1AE6EC3A88211D9B87C252A
1332B0A6BF9329AC2EC6079A6A30177F
79E6ADEAB1AE6EC3A88211D9B87C252A
9E1DD21EC532654BCEC440D8E19FD9CC
8D2F62B87AA14CE7E00247428BAFCEB3
9E1DD21EC532654BCEC440D8E19FD9CC
EE733707CF6568105F1C8D9B3D1C53FD
635C55BFB5C424F7BF1ECAD9B6B39D4E
EE733707CF6568105F1C8D9B3D1C53FD
7BD09C09AFD9F5CD322E987A7FC4F37F
188CC9B61A1DD13A8D3052A3C9776E31
7BD09C09AFD9F5CD322E987A7FC4F37F
688F18544959E1213B588E4F224C6BAB
7003D1E25344301BB668DCECEB3B059A
688F18544959E1213B588E4F224C6BAB
AB3FA666B48B0924F4E64F0EA559C549
DB3C7784E7CF393F428E93E24E62C0D3
AB3FA666B48B0924F4E64F0EA559C549
BE2BAC7258FCAEC9B206017C9ED77AD0
6517DBF6BF3397F6F088929ED0B5BA03
BE2BAC7258FCAEC9B206017C9ED77AD0
90A73F5192F8325B8B18C9F92D4A2554
F5B0E4A72DCBA5AD7B905B67FDFF9F57
90A73F5192F8325B8B18C9F92D4A2554
7BB2778F775FBAFE3E3EF726C3947C9B
8E0293285A941F5345AEAC413E6BE3CC
7BB2778F775FBAFE3E3EF726C3947C9B
E2700DF5363788D5BBB104C6C44FFE88
6C729EDD6CA39786FE1FA887FA241D44
E2700DF5363788D5BBB104C6C44FFE88
294980F47A55D2970556C2D9C30E1DD1
453B1E2916F64511FB496A5E392A0095
294980F47A55D2970556C2D9C30E1DD1
A83B83560518C22EE4B10C130C5A92DC
ED009D7F13EE873F1FF8664D35709249
A83B83560518C22EE4B10C130C5A92DC
91128B57083FD4A66B1BDC9087669D48
7C1216281BD1539974E3BADDB2160F01
91128B57083FD4A66B1BDC9087669D48
D47BAA2AF8085810BCFA52422F378129
A869BC02E3D90B89C819E89F9D218E28
D47BAA2AF8085810BCFA52422F378129
0CBF16ED2D80966BAB478F3511014FFF
A4D6AAEFCE599DE2635E67AA8C20C1D7
0CBF16ED2D80966BAB478F3511014FFF
F7FD62EA1E4B826B044B2135B5B4E478
532BC805D0121F896715469F399425AF
F7FD62EA1E4B826B044B2135B5B4E478
868A2E5DED80F0534D277A6E40AE6EF8
D5A1E6583D92EFDA2A323CF1793A4B57
868A2E5DED80F0534D277A6E40AE6EF8
45ACB2C23C11619C1CD201082AD3897C
900D549A01838E4636E03DF953E9C22B
45ACB2C23C11619C1CD201082AD3897C
DC30E06013DEF0884F63A54AD5E22E32
4C3DB4FA125D7ECE798398B3860BEC19
DC30E06013DEF0884F63A54AD5E22E32
F036E440EB102AE28666FB0F829FA509
BC0B50BAF94D542CFFE563BC04944910
F036E440EB102AE28666FB0F829FA509
28AFFEB2C4881AD7703A0E89EE571E68
94A4AE083DC54EFB8FDF6D35EAC35778
28AFFEB2C4881AD7703A0E89EE571E68
19BCF1F6D693FADB4D3CDA7ADCD01828
8D185FFEEB56B420C2E3B74F36134F50
19BCF1F6D693FADB4D3CDA7ADCD01828
451C8CB2D808526B19356A701EDFCF4E
C804D34C335EE64BDBD6DD3F28CC801E
451C8CB2D808526B19356A701EDFCF4E
ED52AB65809CFF216193AF9A3A8CC3A0
25567829B3C2196ABA4572A5124043BE
ED52AB65809CFF216193AF9A3A8CC3A0
26D7F28FA7EEB9BF668FD2A37DB6EFAB
03818AA6142CA0D5DCCAA0066FF6AC15
26D7F28FA7EEB9BF668FD2A37DB6EFAB
1084DBBD474EC40177DC9D43736693FF
1305511B536264D4AB163D451C903FEA
1084DBBD474EC40177DC9D43736693FF
EBB51CEDBB90235C5796960CC186065A
F8B04DF6E8F24788FC80AB49DD1639B0
EBB51CEDBB90235C5796960CC186065A
BB69AC93BBB2AA020D41EAA07A306F4E
43D9E1655340ED8AF1C141E9A72656FE
BB69AC93BBB2AA020D41EAA07A306F4E
42D201A2FF9C3CDCFF278CFE706C51CC
010BE0C7ACDCD1560EE6CD17D74A0732
42D201A2FF9C3CDCFF278CFE706C51CC
2AB311E104645E974DFB8E3E178FFC02
2BB8F126A8B88FC1431D4329C0C5FB30
2AB311E104645E974DFB8E3E178FFC02
42837DD0A8E334E2643E5719CE8061CA
693B8CF6005BBB23272314300E459AFA
42837DD0A8E334E2643E5719CE8061CA
962301D502731078DDBEF7A31B7858DB
FF188D230228AB5BFA9DE393153DC221
962301D502731078DDBEF7A31B7858DB
7DBE42B3FEC229C025C4B6BF4A90B860
82A6CF90FCEA829BDF59552C5FAD7A41
7DBE42B3FEC229C025C4B6BF4A90B860
A1A41B72CE4D12D9AF34B49746FF74B3
2302D4E232A79042706DE1BB19520EF2
A1A41B72CE4D12D9AF34B49746FF74B3
46455757D1B8F300E2027E21E1F08EFD
654783B5E31F6342926F9F9AF8A2800F
46455757D1B8F300E2027E21E1F08EFD
DD82B1769BDDE62A90D1B7C06761056B
B8C532C378C2856802BE285A9FC38564
DD82B1769BDDE62A90D1B7C06761056B
5F9DF069D774AF9A33EC48AB170742EE
E758C2AAAFB62AF2315260F188C4C78A
5F9DF069D774AF9A33EC48AB170742EE
EF75B64B7742463E3FB27D4B532A26D8
082D74E1D8F46CCC0EE01DBADBEEE152
EF75B64B7742463E3FB27D4B532A26D8
31A255F2BF18B0A58AAE4C052D723C12
398F211367ECDC69844E51BFF69CDD40
31A255F2BF18B0A58AAE4C052D723C12
C60BFE175A55943509096CB6703EB6B4
FF84DF043DB9485C8D473D0986A26BF4
C60BFE175A55943509096CB6703EB6B4
254F091783229912E5BCD480B548B75C
DACBD613BE9BD14E68FBE98933EADCA8
254F091783229912E5BCD480B548B75C
C7A1D047AD7D60BF299BCB5A90093776
1D6A065413E6B1F1416022D3A3E3EBDE
C7A1D047AD7D60BF299BCB5A90093776
D6C653A02F639130D20F362460914988
CBAC55F43C8520C1936F14F7C372A256
D6C653A02F639130D20F362460914988
378941B70DB25473066ECA1DA22803FE
FC251443313774B29501DEEA615AA1A8
378941B70DB25473066ECA1DA22803FE
0E411A67A0215AF839E6BD3502F1F629
F2640E2491162E4AACE763DF63AB5781
0E411A67A0215AF839E6BD3502F1F629
CBC5F938DCBF7693B15840540BABFB5D
39A1F71C4DA958D91DBF238B6800ACDC
CBC5F938DCBF7693B15840540BABFB5D
13F88CD9733D0B7630D3C7512DF58CA4
2A597BC53E9453AF2D6CE4DA45F52078
13F88CD9733D0B7630D3C7512DF58CA4
0C0DDE8FDCEC8319769C5BE0E340AC25
2654A54AE278D0B65BF0BF3AA6B58C5D
0C0DDE8FDCEC8319769C5BE0E340AC25
6966089114977F18689578B1BD061738
4F32ADDBF6EFAFAE3365C78B1BB39B65
6966089114977F18689578B1BD061738
01039872BDA3ADADD12CC827CB94EDF2
4E3135A94B4C0203E2490FACD0277697
01039872BDA3ADADD12CC827CB94EDF2
44F6D93A2CEFED557A59C32489BE1530
0AC7EC9367A3EF569810CC88599963A7
44F6D93A2CEFED557A59C32489BE1530
89715928D040827973CB4C38A569FB80
83B6B5BBB7E36D2FEBDB80B0FCF09827
89715928D040827973CB4C38A569FB80
4EF05F956332E3BCC79FCA1627CAA102
CD46EA2ED4D18E932C444AA6DB3A3925
4EF05F956332E3BCC79FCA1627CAA102
F4E49E1EAABFA1C737E77BB46E148C76
39A274307E6E2F541BA33112B52EB553
F4E49E1EAABFA1C737E77BB46E148C76
3652FF3E420CA7E0908DC20729D071E7
0FF08B0E3C6288B48B2EF3159CFEC4B4
3652FF3E420CA7E0908DC20729D071E7
D12DE1C19A4E7C6CBA8DF0A345A9E956
DEDD6ACFA62CF4D831A303B6D9572DE2
D12DE1C19A4E7C6CBA8DF0A345A9E956
D3741A9664A0AA65046F75704B54A71E
0DA97059C28C5EBD35CC76C692038AFC
D3741A9664A0AA65046F75704B54A71E
11F4CCFB15C4A1055EFEE33990E88172
1C5DBCA2D748FFB86B3295FF02EB0B8E
11F4CCFB15C4A1055EFEE33990E88172
D38D5C46BC65BC766B3075EC4F1DA5E6
CFD0E0E46B2D43CE0002E0134DF6AE68
D38D5C46BC65BC766B3075EC4F1DA5E6
4BFEEE5D96AFE0216782DDA519215B81
842E0EB9FD82A3EF67803DB654D7F5E9
4BFEEE5D96AFE0216782DDA519215B81
41D16FE2370FDD9F9026AE5A82F7F316
C5FF615BCA8D7E70F7A693ECD62006FF
41D16FE2370FDD9F9026AE5A82F7F316
FBF7D812A57C3240C26C70228AD616F1
3E08B9496FF14C3035CAE3CE5CF6100E
FBF7D812A57C3240C26C70228AD616F1
6AB092F1717772ED8B8935F5A02EAD01
54B82BB81E863EDDBE43D63BFCD8BD0F
6AB092F1717772ED8B8935F5A02EAD01
B3914F96FCD9EB76043651B22B722BF0
E729642EE25FD5ABBA758789D7AA96FF
B3914F96FCD9EB76043651B22B722BF0
F6D072258A233FF306215D4D7BEE1FBA
11F9160B687CEA58BC54DAC4AC448945
F6D072258A233FF306215D4D7BEE1FBA
F23F891F31580249CB77631B767FA797
E3C69F145924E8117723B9DFDA3B2ED2
F23F891F31580249CB77631B767FA797
1C4479D3D82FAA83C6EA224582E349D3
FF82E6C7810B4292B1C99B9A58D86701
1C4479D3D82FAA83C6EA224582E349D3
230B2C6906DF9D7780D6AB6F6294CCEE
DC89CAAE87D4DFE5311F30F53A4CABEF
230B2C6906DF9D7780D6AB6F6294CCEE
FBD5D3C6A6F871BC545AAE8FA58F2A19
275C1968212CAE5965459E7A9FC381F6
FBD5D3C6A6F871BC545AAE8FA58F2A19
ED50E1B5588EEBD0A7BC5C535D298A67
CA0CF8DD79A24589C2F9C229C2EA0B91
ED50E1B5588EEBD0A7BC5C535D298A67
5C1456D4BBBD192287F931B0C1594AB8
9618AE09C21F5CAB4500F39903B34129
5C1456D4BBBD192287F931B0C1594AB8
9ECFE34193038A7A2376865D327825E3
08D74D48511CD6D1667675C431CB64CA
9ECFE34193038A7A2376865D327825E3
C95CE4E8CA7BD6DBEDA9AE6FC8A80E6A
C18BA9A09B67000A8BDFDBABF9636AA0
C95CE4E8CA7BD6DBEDA9AE6FC8A80E6A
D4B1B9F5985DA490476B7C79F97289A8
153A1055033AA49ACCB4A7D20011E308
D4B1B9F5985DA490476B7C79F97289A8
55D1E210415F4C5DC059497E2B768E8E
40EBF2454265E8C70CEDEEAC2B676D86
55D1E210415F4C5DC059497E2B768E8E
61A3377CAB644E11EC76A9B6108D88B0
2148C539E901A6D6E09B471A3BEAE536
61A3377CAB644E11EC76A9B6108D88B0
7722951A1989AFED0B34D06AEFFEC693
566A5023F088093BEBAF9770D41423A5
7722951A1989AFED0B34D06AEFFEC693
2E7DEF78AACF26A12A8CF4840AF353AB
7817BF5B5A472F9AC12363F4DEE7700E
2E7DEF78AACF26A12A8CF4840AF353AB
E68F960CFE7199F6D0B7C7DF6A4BEBBC
9E982957A436B66C1194A42BB4AC9BB2
E68F960CFE7199F6D0B7C7DF6A4BEBBC
DC2DD1CB5C657676325A0BC86D7E9A12
42B5F89CF853C01A23CEAFE3D9D201A0
DC2DD1CB5C657676325A0BC86D7E9A12
045C740389993E00946069B9FE8E2E09
46E98C9F71CAFE1AB7AEC65A275C2FA9
045C740389993E00946069B9FE8E2E09
E477A64A0F35AF7F604028F5CF9C54C9
A29E2AD57EFF5165D7EEEEAFE8C07B60
E477A64A0F35AF7F604028F5CF9C54C9
E7B257A906F5922E5DB61CC7D9A27EC6
452C7D7C780AC34B8A58F268316205A6
E7B257A906F5922E5DB61CC7D9A27EC6
07120739EE1999FB97999BA74B921420
423E7A4596135AB01DC169CF7AF01186
07120739EE1999FB97999BA74B921420
5109934D3F68E8B63059EB0275E47171
1337E908A97BB2062D9882CD0F1460F7
5109934D3F68E8B63059EB0275E47171
9A0DB7D567FA32D26AFBACAF664CC397
893A5EDDCE8180D447632E626958A360
9A0DB7D567FA32D26AFBACAF664CC397
5F60EDB4E342E860911B4B41B6A49BEB
D65AB3692DC368B4D6786523DFFC388B
5F60EDB4E342E860911B4B41B6A49BEB
6345DA1CCBD30183EDA0A24E1A3A5A93
B51F6975E61069373BD8C76DC5C66218
6345DA1CCBD30183EDA0A24E1A3A5A93
60C51E94273105840A2F0E8F4C62F87A
D5DA77E1C1216CB331F7C9E289A49A62
60C51E94273105840A2F0E8F4C62F87A
C5BFE32717376C9AE8B99CE015B38B30
106594C6D6160029D94E55029C171152
C5BFE32717376C9AE8B99CE015B38B30
4DB5ECC6054EF707CE3EE3B3A2BA9848
5DD07800D358F72E1770B6B13EAD891A
4DB5ECC6054EF707CE3EE3B3A2BA9848
7691BB2AE0B8E944E22C443DA396C506
2B41C32A33E01E6AF55CF28C9D3B4C1C
7691BB2AE0B8E944E22C443DA396C506
F585E2DC1E56BD9558B5D60CC845FC67
DEC421F62DB6A3FFADE92480557EB07B
F585E2DC1E56BD9558B5D60CC845FC67
47ADB7C61B45C25B88BFDEDA54D2742D
9969963036F361A42556FA5A01ACC456
47ADB7C61B45C25B88BFDEDA54D2742D
7A958E17189263A1BC337F5113DD2CE0
E3FC18272E6102059965850B1271E8B6
7A958E17189263A1BC337F5113DD2CE0
CD930187789370940988F0499DC302AF
2E6F19A056F2729190ED75428FB2EA19
CD930187789370940988F0499DC302AF
F6890A1960A38B909223EB88EC2B6942
D8E613B93651F90102CE9ECA6399835B
F6890A1960A38B909223EB88EC2B6942
AF7F805392EA20276834B8FDA4B6B43B
779993EAA4BBD9266AFA2637C72F3760
AF7F805392EA20276834B8FDA4B6B43B
59039965EF6C6FCD8C0BAB2D579997F5
2E9A0A8F4BD7B6EBE6F18D1A90B6A095
59039965EF6C6FCD8C0BAB2D579997F5
475C0C2EA7BA1CA6AAAB56A0DB0F8C61
69C606A1EC6DAA4D4C5ADBBA4BB92CF4
475C0C2EA7BA1CA6AAAB56A0DB0F8C61
27CE0E2B443E9F7D94B4244372196AE9
4E08088AA8533530D8EEFFF939A0461D
27CE0E2B443E9F7D94B4244372196AE9
05C7D3AFA5FE3CA530C455A5CAE6F474
4BCFDB250DAD0995E82AAA5CF346B269
05C7D3AFA5FE3CA530C455A5CAE6F474
848BC3E3090C55A0561B17DFFD4241D6
CF4418C604A15C35BE31BD830E04F3BF
848BC3E3090C55A0561B17DFFD4241D6
1D41C5EC06AE6FFE050450D953B0ABE1
D205DD2A020F33CBBB35ED5A5DB4585E
1D41C5EC06AE6FFE050450D953B0ABE1
833690E735EFDA8436F8406CE806F173
51334DCD37E0E94F8DCDAD36B5B2A92D
833690E735EFDA8436F8406CE806F173
1CE7D41F8C5275D9AC7C8075505596A8
4DD499D2BBB29C9621B12D43E5E73F85
1CE7D41F8C5275D9AC7C8075505596A8
FFD49CC05995DE893E6E67910BC435CD
B2000512E227421F1FDF4AD2EE230A48
FFD49CC05995DE893E6E67910BC435CD
4758945DDFE18A5C33468E9CFA7FCFA8
F558914F3DC6C8432C99C44E145CC5E0
4758945DDFE18A5C33468E9CFA7FCFA8
2AF29DF9D00CEED270E88A57257B633C
DFAA0CB6EDCA26915C714E193127A6DC
2AF29DF9D00CEED270E88A57257B633C
FE0463782F36C4EC0FF0CA6B98D90716
21AE6FCEC2FCE27D53818472A9FEA1CA
FE0463782F36C4EC0FF0CA6B98D90716
ADDB8EB02A381C8E7ED05F36A475D658
8C75E17EE8C4FEF32D51DB440D8B7792
ADDB8EB02A381C8E7ED05F36A475D658
BDDF67D614D63B57DFB01BCF64AC4ABA
31AA86A8FC12C5A4F2E1C08B69273D28
BDDF67D614D63B57DFB01BCF64AC4ABA
A27C9377578920D19B63A6D9F382CB80
93D615DFAB9BE575698266529AA5F6A8
A27C9377578920D19B63A6D9F382CB80
1C2AFDCC80320B6746903CDA731F2ED8
8FFCE8132BA9EE122F125A88E9BAD870
1C2AFDCC80320B6746903CDA731F2ED8
DE97A4FDBD53F54792D3F14339568B1C
516B4CEE96FA1B55BDC1ABCBD0EC536C
DE97A4FDBD53F54792D3F14339568B1C
D17171D3844B0EF82746AC598CE030E8
801A3D3D12B115AD9A8707925C0C6384
D17171D3844B0EF82746AC598CE030E8
99069BA081B251FF93CD93792B34D935
191CA69D93034452094A94EB7738BAB1
99069BA081B251FF93CD93792B34D935
50EABB1C620A4ECFB38350D86FB7F500
49F61D81F1090A9DBAC9C433188F4FB1
50EABB1C620A4ECFB38350D86FB7F500
2A5FA80C9C7FAF8A5E8753FEBACC1E9E
63A9B58D6D76A517E44E97CDA243512F
2A5FA80C9C7FAF8A5E8753FEBACC1E9E
3E6F8F58C09DCADAF53886DC2DAAA5C7
5DC63AD5ADEB6FCD117611118FE9F4E8
3E6F8F58C09DCADAF53886DC2DAAA5C7
CB0E2737CF8EC8A6272214A347BEE7A1
96C81DE26265A76B365405B2C8571349
CB0E2737CF8EC8A6272214A347BEE7A1
890C160CA72C9285FE904362BAB0F445
1FC40BEEC54935EEC8C446D072E7E70C
890C160CA72C9285FE904362BAB0F445
94BBFA8B35A920F7DF90F74C60657D9F
8B7FF165F0E015191754B19C12829A93
94BBFA8B35A920F7DF90F74C60657D9F
2989F38C218BEE86F9AE60F1E6ADE505
A2F602E9D16BFB9FEEFAD16DF42F7F96
2989F38C218BEE86F9AE60F1E6ADE505
6F0639B212214484E5E10873FF400788
CDF03B5BC34ABF1B0B1BD91E0B6F781E
6F0639B212214484E5E10873FF400788
B444C07640D425E983C701423998D925
79B4FB2D839E9AF288DCD85C32F7A13B
B444C07640D425E983C701423998D925
AD4A3A37C73F087507B8624702E311B0
D4FEC11A44A192878F64BA1B3014B08B
AD4A3A37C73F087507B8624702E311B0
F2DCEB9F29659176A9AC5F3D60401AD4
26222A856DC403F126C8E5265054AA5F
F2DCEB9F29659176A9AC5F3D60401AD4
F8CE2C82B6E9666B5D147A9BDB8A8047
DEEC0607DB2D659A7BDC9FBD8BDE2A18
F8CE2C82B6E9666B5D147A9BDB8A8047
3ED25DAF17483C7B152FED74901A5872
E03E5BA8CC6559E16EF372C91BC4726A
3ED25DAF17483C7B152FED74901A5872
DE1ADFA16CB0CA99EBECA61531F90B30
3E248409A0D59378851FD4DC2A3D795A
DE1ADFA16CB0CA99EBECA61531F90B30
23E3B0BC33E82219E0F353729EB481E8
1DC734B5933DB16165EC87AEB489F8B2
23E3B0BC33E82219E0F353729EB481E8
6D0F7376762060A4D0F83335202FDB1B
70C847C3E51DD1C5B514B49B94A623A9
6D0F7376762060A4D0F83335202FDB1B
22718E8C9496FF9CC00DFC6002E25B15
52B9C94F718B2E59751948FB964478BC
22718E8C9496FF9CC00DFC6002E25B15
05C94B661569AA58E1B229DD94053E89
5770822964E2840194AB612602414635
05C94B661569AA58E1B229DD94053E89
8749A4B034F5115B78CFADBE92F9501D
D03926995017955AEC64CC9890B81628
8749A4B034F5115B78CFADBE92F9501D
AE8750FD8EDD0BB21B322F21EB2F5EA3
7EBE7664DECA9EE8F756E3B97B97488B
AE8750FD8EDD0BB21B322F21EB2F5EA3
4EF50105BA985902EA5AD26DA233857B
304B77616452C7EA1D0C31D4D9A4CDF0
4EF50105BA985902EA5AD26DA233857B
630D708662DC8D4926E6CFF7ADC33BFC
534607E7068E4AA33BEAFE237467F60C
630D708662DC8D4926E6CFF7ADC33BFC
694CA1484BD490B8EDB54FB6254A4B0A
3A0AA6AF4D5ADA1BD65FB195512DBD06
694CA1484BD490B8EDB54FB6254A4B0A
1A40DCEFFAFAFBE95FC9628DA3DEA08B
204A7A40B7A021F28996D318F2F31D8D
1A40DCEFFAFAFBE95FC9628DA3DEA08B
85A91C6E16A4B32FDA5D4B17FA2A4E56
A5E3662EA10492DD53CB980F08D953DB
85A91C6E16A4B32FDA5D4B17FA2A4E56
5BDB1535A274736B502376BDA771BA58
FE38731B0370E1B603E8EEB2AFA8E983
5BDB1535A274736B502376BDA771BA58
77CF45E6ADBE28F9616B1FD777765282
89F736FDAECEC94F6283F165D8DEBB01
77CF45E6ADBE28F9616B1FD777765282
5719D8AC475479E46C9314675289F9B6
DEEEEE51E99AB0AB0E10E5028A5742B7
5719D8AC475479E46C9314675289F9B6
CA9B7AE04F8C56228F06D8DA056D90D6
147594B1A616E68981163DD88F3AD261
CA9B7AE04F8C56228F06D8DA056D90D6
F9A2A07CFB3E06522A0FC69315746AA8
EDD734CD5D28E0DBAB19FB4B9A4EB8C9
F9A2A07CFB3E06522A0FC69315746AA8
69F1DA3EC1D17BD5A5DCAE05571352C5
8426EEF39CF99B0E0EC5554ECD5DEA0C
69F1DA3EC1D17BD5A5DCAE05571352C5
51B536B81EF448543870E83B48A2F1F5
D593D84B820DD35A36B5BD7585FF1BF9
51B536B81EF448543870E83B48A2F1F5
9DBFD1185A6C5380EBC57A1492C84532
482C0953D86180DADD70C76117375ECB
9DBFD1185A6C5380EBC57A1492C84532
2B27631043146283314326FBAFB69ACE
630B6A439B75E259EC33E19AB881C405
2B27631043146283314326FBAFB69ACE
87E2C495AA3B829EC8FC039E22EDFB29
E4E9AED6314E60C724CFE2049A6C3F2C
87E2C495AA3B829EC8FC039E22EDFB29
B504AE096A2D7CB89EBA259A0111DF5B
51ED00DF5B631C7FBA75C79E9B7DE077
B504AE096A2D7CB89EBA259A0111DF5B
A2E73008A8E93C34BA425BADA52EC7EB
F30A30D7F38A204B00379C333E53279C
A2E73008A8E93C34BA425BADA52EC7EB
9307E11C38DC7C1DB57508775D180A3F
600DD1CBCB565C56B5429444634B2DA3
9307E11C38DC7C1DB57508775D180A3F
F12DBCA749D3FECEF90D667CC003961A
91206D6C8285A2984C4FF238A348BBB9
F12DBCA749D3FECEF90D667CC003961A
ED2D8C2F7D80E55BA4FA1BD4DBB370C3
7C0DE143FF0547C3E8B5E9EC78FBCB7A
ED2D8C2F7D80E55BA4FA1BD4DBB370C3
5EB0DD4C1F8DB3A198B001098063E679
22BD3C0FE088F4627005E8E5F8982D03
5EB0DD4C1F8DB3A198B001098063E679
8ACC5DE58A3EE53E9F5BFBB35361840F
A87161EA6AB6115CEF5E1356ABF9A90C
8ACC5DE58A3EE53E9F5BFBB35361840F
90619A83CCDCB53F4D3D0D519D2CC500
3810FB69A66AA463A2631E0736D56C0C
90619A83CCDCB53F4D3D0D519D2CC500
7415833D3E7926EBA551DE0EABEA234B
4C057854981382880732C0099D3F4F47
7415833D3E7926EBA551DE0EABEA234B
C817EC82E1214DE8A8768BEA32C79FDB
841294D67932CF60AF444BE3AFF8D09C
C817EC82E1214DE8A8768BEA32C79FDB
3A2C4EDA3103CC7B0FA5CB3EE6F8387D
BE3EDA0C4831031BA0E180DD4900E8E1
3A2C4EDA3103CC7B0FA5CB3EE6F8387D
9A5230A54B83D462240DBC6EF54B5584
246CEAA903B2D77984EC3CB3BC4BBD65
9A5230A54B83D462240DBC6EF54B5584
D8614703429A9671899670407D70F319
FC0DADAA412841080D7A4CF3C13B4E7C
D8614703429A9671899670407D70F319
F2C26C152B8A2312932AEFE960DD7C30
0ECFC1BF6AA2621A9E50A31AA1E6324C
F2C26C152B8A2312932AEFE960DD7C30
29691A910A293CAE7E2DFE7390DED61F
27A6DB2E608B5EB4E07D5D693138E453
29691A910A293CAE7E2DFE7390DED61F
ACAB8CB00E5D4F14885868A1F532A3C3
8B0D579E6ED611A0682535C8C40A4790
ACAB8CB00E5D4F14885868A1F532A3C3
90BE71AEDBFF007A2F6D133D77C167C7
1BB32630B52911DA474826F5B3CB2057
90BE71AEDBFF007A2F6D133D77C167C7
EA343FA1E65E34AEC81628220359656B
F1871991537725748F5E0ED7B092453C
EA343FA1E65E34AEC81628220359656B
BA954C33EFC212A8479CC373702B1154
4B1255A2BCB537DCC8C2CDA4C0B95468
BA954C33EFC212A8479CC373702B1154
E0434047B7B99BC7C51CA8443BCFC549
AB5115E50B0CAC1B0DDE65E0FB769121
E0434047B7B99BC7C51CA8443BCFC549
6D188F15E724676032D06956949B5200
C6499AF0EC28CB7B3F0E0CB66FEDC321
6D188F15E724676032D06956949B5200
05A765973AB726C003135514196336BB
C3EEFF67D69FEDBB3C1D59A2768EF59A
05A765973AB726C003135514196336BB
E07B6C3D1D17D288E7EA444561143B1E
2395935ACB883F33DBF71DE7179ACE84
E07B6C3D1D17D288E7EA444561143B1E
D7382FA31511480C6A2280D3B7A5603B
F4ADBCF9DE99773FB1D59D34A03FAEBF
D7382FA31511480C6A2280D3B7A5603B
3B505EE89A6C64DDBDD8FE23086D29F5
CFFDE21144F513E20C0D6317A852874A
3B505EE89A6C64DDBDD8FE23086D29F5
7091156841DF0D7EF196198ABA03D5E4
BF6CF779052A1E9CFD9B7A9D125152AE
7091156841DF0D7EF196198ABA03D5E4
9148ACEF3E98C461F0906D10F9EB8562
2E245B963BB2DAFD0D0B178DEBBAD7CC
9148ACEF3E98C461F0906D10F9EB8562
B996D4CC9EF15FCA65BD81026F881D19
97B28F5AA543853768B6968F8432CAD5
B996D4CC9EF15FCA65BD81026F881D19
4D052F64A5FB34F57BFEC272C44F5C6E
DAB7A03E00B8B1C2134854FD407D96BB
4D052F64A5FB34F57BFEC272C44F5C6E
E047E85F6A7AC7382C317713A4BFCE6D
3AF048616AC276FA3F7923EEE4C258D6
E047E85F6A7AC7382C317713A4BFCE6D
6B806410178C7696CB3FDFC7393A361E
51702C717D4E006CF446FC29DDF86EC8
6B806410178C7696CB3FDFC7393A361E
D5D290B02C9DF0CE395F603F7D90D1B5
84A2BCC151D3F0A2CD199C16A068BF7D
D5D290B02C9DF0CE395F603F7D90D1B5
76D915A9E54AFE31CAE27B41FAE3062E
F27BA968B4990E9307FBE7575A8BB953
76D915A9E54AFE31CAE27B41FAE3062E
9F69838998270BDE231F3E426DA79424
6D122AE12CBE054D24E4D915372C2D77
9F69838998270BDE231F3E426DA79424
9AA52028562444A12206F67106240C20
F7B70AC97A9A41EC06E22F6431082157
9AA52028562444A12206F67106240C20
E4C5CE38A760EEFC1FD21D069848A85C
1372C4F1DDFAAF1019303262A940890B
E4C5CE38A760EEFC1FD21D069848A85C
FA1FE648425902CE98390C626759E509
E96D22B99FA3ADDE81093E00CE196C02
FA1FE648425902CE98390C626759E509
BC38C60809F1EB8896D6ADC8FECB898F
5555E4B19652465617DF93C830D2E58D
BC38C60809F1EB8896D6ADC8FECB898F
2214953AEBC3F2B7763D84EF1F07C38A
7741718B7D91B4E161E217272FD52607
2214953AEBC3F2B7763D84EF1F07C38A
CD24189F850F4CC7E9A2E139917458B5
BA656914F89EF8268840F61EBEA17EB2
CD24189F850F4CC7E9A2E139917458B5
37DB5A05E75CC0A954B44F2C28AF1281
8DBE33111FC2388FDCF4B932960E6C33
37DB5A05E75CC0A954B44F2C28AF1281
80C8B278DF00F3B81F70CCB73970FCAB
0D768169C0C2CB37C3847585AF7E9098
80C8B278DF00F3B81F70CCB73970FCAB
49EB8586A96B9D219DFF579410AFC85D
449D04EF69A956165E7B2211BFD158C5
49EB8586A96B9D219DFF579410AFC85D
02593DF1DFE45D23D3348096B698DD3B
46C4391EB64D0B358D4FA287094985FE
02593DF1DFE45D23D3348096B698DD3B
7B0CA9B33312318D0A4ED83CA7B6C27B
3DC890AD855F3AB887017ABBAEFF4785
7B0CA9B33312318D0A4ED83CA7B6C27B
6F624654280373A8D486763394060358
52AAD6F9AD5C491053870C883AF944DD
6F624654280373A8D486763394060358
24B0F2A510C0969C5D5B088A72BB210E
761A245CBD9CDF8C0EDC0402484265D3
24B0F2A510C0969C5D5B088A72BB210E
363F869194D5200EF0289FDBDB2C8970
4025A2CD2949FF82FEF49BD9936EECA3
363F869194D5200EF0289FDBDB2C8970
7F8C01B642BEB931D09EA057755B564B
3FA9A37B6BF746B32E6A3B8EE635BAE8
7F8C01B642BEB931D09EA057755B564B
6CB2E88883229EF57956CC46A6519FAE
531B4BF3E8D5D846573CF7C840642546
6CB2E88883229EF57956CC46A6519FAE
C7F02F063AE45B8ABCF656E0B99E79B8
94EB64F5D23183CCEBCAA128F9FA5CFE
C7F02F063AE45B8ABCF656E0B99E79B8
ECA140EFA7AC1550BFD21B5F9F25D9C6
784A241A759D969C5418BA7766DF8538
ECA140EFA7AC1550BFD21B5F9F25D9C6
6759610DA9468421223A8C63612F7F2F
1F134517DCDB12BD7622361407F0FA17
6759610DA9468421223A8C63612F7F2F
C908C35B04BF4C01EC0E7F7A9CE5950F
D61B864CD8645EBC9A2C496E9B156F18
C908C35B04BF4C01EC0E7F7A9CE5950F
C746473C7BD25ABA81192CA45B9D1297
115DC170A3B604061B3565CAC0887D8F
C746473C7BD25ABA81192CA45B9D1297
964AAC0F8E8D2F0194986862869C198F
87176D7F2D3B2B078FAD0DA846146400
964AAC0F8E8D2F0194986862869C198F
D389B0ED5100D51636C518D65BC6732C
549EDD927C3BFE11B968157E1DD2172C
D389B0ED5100D51636C518D65BC6732C
E1350ADF51AB4542B2769E1B7D7739E7
B5ABD74D2D90BB530B1E8B6560A52ECB
E1350ADF51AB4542B2769E1B7D7739E7
8CC867F824948CA2BDC56D0D50363ECD
3963B0B5090437F1B6DBE66830931006
8CC867F824948CA2BDC56D0D50363ECD
B732DF6CC184B01F9974DB17289FB41D
/trunk/test_vectors/twofish_ecb_encryption_monte_carlo_testvalues_192bits.txt
0,0 → 1,1200
000000000000000000000000000000000000000000000000
00000000000000000000000000000000
9AB71D7F280FF79F0D135BBD5FAB7E37
E5A08A78B0B4CC579AB71D7F280FF79F0D135BBD5FAB7E37
9AB71D7F280FF79F0D135BBD5FAB7E37
A1A3C49FD659216172CDE292CE5F5226
6FFDD6D82A0ED3ED3B14D9E0FE56D6FE7FDEB92F91F42C11
A1A3C49FD659216172CDE292CE5F5226
056E89A3D7BE7634B640B843DA265D9C
3BF80777C05EB0F23E7A504329E8A0CAC99E016C4BD2718D
056E89A3D7BE7634B640B843DA265D9C
66C7C98F2D871D060303E0841FD7E691
F550DC92677475AF58BD99CC046FBDCCCA9DE1E85405971C
66C7C98F2D871D060303E0841FD7E691
98661C46398A58AF3C15B0B90F6A82CD
85FBD31147DF940AC0DB858A3DE5E563F68851515B6F15D1
98661C46398A58AF3C15B0B90F6A82CD
6A0DC2E985F78E0745DFFA211A15D733
8BD9D213E691474AAAD64763B8126B64B357AB70417AC2E2
6A0DC2E985F78E0745DFFA211A15D733
B7D183EF08F2D909E4456C52165D5EE3
FE491451274D86011D07C48CB0E0B26D5712C72257279C01
B7D183EF08F2D909E4456C52165D5EE3
7F71D892B518D505D5A4650507779C02
1493925A728D745062761C1E05F8676882B6A22750500003
7F71D892B518D505D5A4650507779C02
BA040A1639B92E455767E785FE8A13AC
3B5EA20A36AECFBDD87216083C41492DD5D145A2AEDA13AF
BA040A1639B92E455767E785FE8A13AC
E367E348A2445DB7707AA301F16404CF
EB52514B7CC520813B15F5409E05149AA5ABE6A35FBE1760
E367E348A2445DB7707AA301F16404CF
42512F95D64540100E6CE721CC37FFD7
8FAA525F442332517944DAD54840548AABC701829389E8B7
42512F95D64540100E6CE721CC37FFD7
804F9C4BDE2E545C2C6BB738FA89BE6E
8E50247D984F8779F90B469E966E00D687ACB6BA690056D9
804F9C4BDE2E545C2C6BB738FA89BE6E
47275DF5243F648002980B12F2962994
78F986E63C4D2897BE2C1B6BB25164568534BDA89B967F4D
47275DF5243F648002980B12F2962994
D2C114B3BA19E7AA7014D1F68D86D4C1
79EE6CEAF46470D86CED0FD8084883FCF5206C5E1610AB8C
D2C114B3BA19E7AA7014D1F68D86D4C1
68828FC125713C4AD87C7538F9E6619A
BB60AA8E3E031710046F80192D39BFB62D5C1966EFF6CA16
68828FC125713C4AD87C7538F9E6619A
E410CDD939C937BAACF8A2D80700B26E
E8EE9712DD47F32EE07F4DC014F0880C81A4BBBEE8F67878
E410CDD939C937BAACF8A2D80700B26E
B279219708F903AE0C09DFC133F06628
8C940FA007F43B1352066C571C098BA28DAD647FDB061E50
B279219708F903AE0C09DFC133F06628
41A0F697F358489E6D90FEF231A14C08
65E742DFD332B74713A69AC0EF51C33CE03D9A8DEAA75258
41A0F697F358489E6D90FEF231A14C08
3FEF2C53C775B46C94A8BB5340310641
17C5B64D3A59CB992C49B69328247750749521DEAA965419
3FEF2C53C775B46C94A8BB5340310641
533B19ED4D4148E9C7498DCCD0C6EFCB
734958AC209DA2A97F72AF7E65653FB9B3DCAC127A50BBD2
533B19ED4D4148E9C7498DCCD0C6EFCB
E807CF8FF53BDAB020F67D0BEE439519
170EE7C0D780469C977560F1905EE509932AD11994132ECB
E807CF8FF53BDAB020F67D0BEE439519
D943A75F1672C766D8FE8BA77B72B454
31B797434D9AB3494E36C7AE862C226F4BD45ABEEF619A9F
D943A75F1672C766D8FE8BA77B72B454
B967DBE32EECC1CC237DDA3DF7962976
803B69778DA52A7BF7511C4DA8C0E3A368A9808318F7B3E9
B967DBE32EECC1CC237DDA3DF7962976
03D7DD302ADC8980F0DEDD0754B6394A
C052BE2710E4FF68F486C17D821C6A2398775D844C418AA3
03D7DD302ADC8980F0DEDD0754B6394A
83B0A949C3D36F3919779892FF1C4377
DB54D87F82E89F407736683441CF051A8100C516B35DC9D4
83B0A949C3D36F3919779892FF1C4377
66836E10C350885034898E840946E60D
6BAC365A5D20172211B50624829F8D4AB5894B92BA1B2FD9
66836E10C350885034898E840946E60D
23B8F71ACFC469679FCBC9E5AF81EE45
950E02EC69E5A4FC320DF13E4D5BE42D2A428277159AC19C
23B8F71ACFC469679FCBC9E5AF81EE45
037E381BE7915B4A62BE382185AF0F86
9DEAE8524B6C0F973173C925AACABF6748FCBA569035CE1A
037E381BE7915B4A62BE382185AF0F86
952C745B2D63298BA84CD395695688E4
B9EF31AE63C13DFFA45FBD7E87A996ECE0B069C3F96346FE
952C745B2D63298BA84CD395695688E4
85E85DF68EAFA5855638E35F7CC47AB6
23A88E354BE7B0D621B7E08809063369B6888A9C85A73C48
85E85DF68EAFA5855638E35F7CC47AB6
5E6D06114457B71960C1B1FEC952FC88
C3E316687951D6867FDAE6994D518470D6493B624CF5C0C0
5E6D06114457B71960C1B1FEC952FC88
94BDC789FBCF55027095D9623FBDA10C
6D9EC0A52E050F3FEB672110B69ED172A6DCE200734861CC
94BDC789FBCF55027095D9623FBDA10C
C14B9365AAAF923A8329DB0861E94CE5
1B5F47221EABD84D2A2CB2751C31434825F5390812A12D29
C14B9365AAAF923A8329DB0861E94CE5
EF9B6FC323A756A3792D8F3068408A50
EEDC9B6C1FB909D3C5B7DDB63F9615EB5CD8B6387AE1A779
EF9B6FC323A756A3792D8F3068408A50
A409EB6954A2D7F6601B2BDF393DEAD6
266EDA955A90957661BE36DF6B34C21D3CC39DE743DC4DAF
A409EB6954A2D7F6601B2BDF393DEAD6
DE7D38FD02D77D1596F30EF4CFBCEF56
E51D2AA059146E63BFC30E2269E3BF08AA3093138C60A2F9
DE7D38FD02D77D1596F30EF4CFBCEF56
6E0C74A15E2BD2570EBB221C10C6D7CF
6B5A0C2C61D917BAD1CF7A8337C86D5FA48BB10F9CA67536
6E0C74A15E2BD2570EBB221C10C6D7CF
A01A28BB2A4C7BA5F1F84C666551BCBA
5A144CFD908E901A71D552381D8416FA5573FD69F9F7C98C
A01A28BB2A4C7BA5F1F84C666551BCBA
72E737BA2D3BCBD9AC46A977C39F5AAB
B6FB88858D07E3590332658230BFDD23F935541E3A689327
72E737BA2D3BCBD9AC46A977C39F5AAB
53A71A1A20E837AE5913EE2AE73C8EDC
43A916E6287203F650957F981057EA8DA026BA34DD541DFB
53A71A1A20E837AE5913EE2AE73C8EDC
1CAF5F9485B98CE40A7FA8CD649896CD
6861A8F4D586A8A44C3A200C95EE6669AA5912F9B9CC8B36
1CAF5F9485B98CE40A7FA8CD649896CD
EA8CEB7EDCBCC70C89EAFA2DEED466BE
7406C0284B4A6A39A6B6CB724952A16523B3E8D45718ED88
EA8CEB7EDCBCC70C89EAFA2DEED466BE
519E3B43E36E8ED05CFEB5BE2AA68BC0
1DFE7E096E93A913F728F031AA3C2FB57F4D5D6A7DBE6648
519E3B43E36E8ED05CFEB5BE2AA68BC0
4EC7F47AE7CC0F5338D7DB4AF0E55F74
144CD70AD77A8112B9EF044B4DF020E6479A86208D5B393C
4EC7F47AE7CC0F5338D7DB4AF0E55F74
E96BCBC340902A4D96295557E109C260
87FA9C38322959BC5084CF880D600AABD1B3D3776C52FB5C
E96BCBC340902A4D96295557E109C260
95B30958D1A24A52B78507D668F28711
57B8D8201B50F708C537C6D0DCC240F96636D4A104A07C4D
95B30958D1A24A52B78507D668F28711
1E00FAD9454D792120BBD7014C708989
10B1BDC5E4438C22DB373C09998F39D8468D03A048D0F5C4
1E00FAD9454D792120BBD7014C708989
65969A62F31EE9110DBA9B8FF238B946
EACF746074CFE99EBEA1A66B6A91D0C94B37982FBAE84C82
65969A62F31EE9110DBA9B8FF238B946
964A1DC9AFA2735EF6685240BE0E3110
E200EE3127D3C69F28EBBBA2C533A397BD5FCA6F04E67D92
964A1DC9AFA2735EF6685240BE0E3110
50B78FACA64463C665379203A1907DA7
9E76EA41D639A3F5785C340E6377C051D868586CA5760035
50B78FACA64463C665379203A1907DA7
D97931748FCC706C494A063E8E95FBC6
2317DDB05C434586A125057AECBBB03D91225E522BE3FBF3
D97931748FCC706C494A063E8E95FBC6
3E436EA9ED463E59649BDCF3AE9A3FDA
CE109FFA705DD0779F666BD301FD8E64F5B982A18579C429
3E436EA9ED463E59649BDCF3AE9A3FDA
1FE7B39BA0F784AF908C26865C896450
B0020A1368A6585D8081D848A10A0ACB6535A427D9F0A079
1FE7B39BA0F784AF908C26865C896450
9795AD76798B1495A5C65832BF1EA644
90A33789E5F29FF51714753ED8811E5EC0F3FC1566EE063D
9795AD76798B1495A5C65832BF1EA644
148D3079A7F6C26F39CDBDD48BD55EDC
8461C0CCE36DB932039945477F77DC31F93E41C1ED3B58E1
148D3079A7F6C26F39CDBDD48BD55EDC
AA456C6BD6BC91EFA77777C7B904CC5C
54B61416FD57C021A9DC292CA9CB4DDE5E493606543F94BD
AA456C6BD6BC91EFA77777C7B904CC5C
616F313D5A87DDDC032232357FADDF91
B2233B0AC0626535C8B31811F34C90025D6B04332B924B2C
616F313D5A87DDDC032232357FADDF91
258E95E0B5F93AF934380DAD54718FCA
76324DEDCB68D24BED3D8DF146B5AAFB6953099E7FE3C4E6
258E95E0B5F93AF934380DAD54718FCA
620198BA55C614D8B2F3DCAFB010EF71
046E82A539AC57AD8F3C154B1373BE23DBA0D531CFF32B97
620198BA55C614D8B2F3DCAFB010EF71
96849BC7DFE548EEFD8915B78CDE3FAA
B5321AE9B337230B19B88E8CCC96F6CD2629C086432D143D
96849BC7DFE548EEFD8915B78CDE3FAA
F0CD6D111608990F1C6CF6F382FAA061
BEC45D09084A3EA2E975E39DDA9E6FC23A453675C1D7B45C
F0CD6D111608990F1C6CF6F382FAA061
199F13CE7010BE9E1878ED36337E7127
737930261EE0FE9DF0EAF053AA8ED15C223DDB43F2A9C57B
199F13CE7010BE9E1878ED36337E7127
D3A57E4B5DBB6F4CBF5AE9A6AD3630A1
0133F5136045F47D234F8E18F735BE109D6732E55F9FF5DA
D3A57E4B5DBB6F4CBF5AE9A6AD3630A1
75541337E06B7039BCC47C1DBAC175FC
E2020111899CFA9B561B9D2F175ECE2921A34EF8E55E8026
75541337E06B7039BCC47C1DBAC175FC
49796F3DF62DDD56DD40CF211673BC70
2F2F32882595681E1F62F212E173137FFCE381D9F32D3C56
49796F3DF62DDD56DD40CF211673BC70
9F14345D2BDABB9E97AD4BD80E8036AF
244A86F29D29012D8076C64FCAA9A8E16B4ECA01FDAD0AF9
9F14345D2BDABB9E97AD4BD80E8036AF
6F313984D3AF709B2DB56AE2FB76EE36
5C2904494A0DE0D8EF47FFCB1906D87A46FBA0E306DBE4CF
6F313984D3AF709B2DB56AE2FB76EE36
99A00FFF184DFCB6F3B87968C6C5EFC7
D7197CACC6B5AB0276E7F034014B24CCB543D98BC01E0B08
99A00FFF184DFCB6F3B87968C6C5EFC7
85158A21917EBCE5D831AD62EB238165
56F86A89963A3CFCF3F27A15903598296D7274E92B3D8A6D
85158A21917EBCE5D831AD62EB238165
2A4B65137A31EA074A3D72213FCD363F
7B5166898111325FD9B91F06EA04722E274F06C814F0BC52
2A4B65137A31EA074A3D72213FCD363F
A593699E9B9FD6ABEF0A15A8D2A751D9
F560C1DC412222D37C2A7698719BA485C8451360C657ED8B
A593699E9B9FD6ABEF0A15A8D2A751D9
79EB260F7D3E4925E6AD6F6DAB589597
68D5F31AFC4B713705C150970CA5EDA02EE87C0D6D0F781C
79EB260F7D3E4925E6AD6F6DAB589597
7B3AECDF9E2AB9D6513E882C89BBC870
3D95F46C8CB4EA647EFBBC48928F54767FD6F421E4B4B06C
7B3AECDF9E2AB9D6513E882C89BBC870
DF1814A76D1C4431849195BA3C6098E0
00509E2CB5298069A1E3A8EFFF931047FB47619BD8D4288C
DF1814A76D1C4431849195BA3C6098E0
183FADCEF3100621150A954030505200
4407971D4FAA2B6DB9DC05210C831666EE4DF4DBE8847A8C
183FADCEF3100621150A954030505200
F82FCC3D46F0EE13C027D7072D19D6C6
1280693E3402066341F3C91C4A73F8752E6A23DCC59DAC4A
F82FCC3D46F0EE13C027D7072D19D6C6
BD49BAB67C31EE15957189B5E034E7B7
ACA17F87F30D2AA8FCBA73AA36421660BB1BAA6925A94BFD
BD49BAB67C31EE15957189B5E034E7B7
37817FE719AE5ADF4822655C29C93A48
4241180865845FE0CB3B0C4D2FEC4CBFF339CF350C6071B5
37817FE719AE5ADF4822655C29C93A48
279E8AFDFD04C71311DB998E07A0C3A6
D459049BE4B3D4AEECA586B0D2E88BACE2E256BB0BC0B213
279E8AFDFD04C71311DB998E07A0C3A6
A7A363584F8FD18B2801046BC7B56A7E
B8349B8DDBD7F6544B06E5E89D675A27CAE352D0CC75D86D
A7A363584F8FD18B2801046BC7B56A7E
24BCA5115503C7270A9FDA7515699B3F
7D78F35FD741753A6FBA40F9C8649D00C07C88A5D91C4352
24BCA5115503C7270A9FDA7515699B3F
D4EFCF07F0FAC87D9A07A92E900BD32F
091F551714C5BA38BB558FFE389E557D5A7B218B4917907D
D4EFCF07F0FAC87D9A07A92E900BD32F
C3D03354C113326C22C23B271649DFBC
E3A4CFEFFD09A2A37885BCAAF98D671178B91AAC5F5E4FC1
C3D03354C113326C22C23B271649DFBC
59E1EA58908AAE24F860AA5E52378648
A22FB18FAE496358216456F26907C93580D9B0F20D69C989
59E1EA58908AAE24F860AA5E52378648
28E5373E81B58982651530E61ED544F8
F9964958C455D0ED098161CCE8B240B7E5CC801413BC8D71
28E5373E81B58982651530E61ED544F8
B9D62DF48AFC85ADC7CF189F33C7A2E5
8A913A7E9B86945CB0574C38624EC51A2203988B207B2F94
B9D62DF48AFC85ADC7CF189F33C7A2E5
38771A15D9E482A5BDE2830AEDFE1BBC
B0F426A94B0596DE8820562DBBAA47BF9FE11B81CD853428
38771A15D9E482A5BDE2830AEDFE1BBC
57E37253759DBB644DE209D3D977FDF1
66A49C2365F66F03DFC3247ECE37FCDBD203125214F2C9D9
57E37253759DBB644DE209D3D977FDF1
33438EEE221ACC3B64A96A5D3602D952
5D29815363EB714BEC80AA90EC2D30E0B6AA780F22F0108B
33438EEE221ACC3B64A96A5D3602D952
827C8457493294F027F6A2612A27359B
F1E6587E79C8A72F6EFC2EC7A51FA410915CDA6E08D72510
827C8457493294F027F6A2612A27359B
24477821670E1EE0F737D6A5E88F11D4
EF52C71B1048A4B94ABB56E6C211BAF0666B0CCBE05834C4
24477821670E1EE0F737D6A5E88F11D4
E8C22DB27D96C7D2C44556E5A11273D0
A71D810EA7043C92A2797B54BF877D22A22E5A2E414A4714
E8C22DB27D96C7D2C44556E5A11273D0
8C1DDB9C068499617F9756B36665C559
EFF6403D5ACD4A022E64A0C8B903E443DDB90C9D272F824D
8C1DDB9C068499617F9756B36665C559
EFB3D1569F6A5C8D2B21BA58C926CC5B
0C01D35E5814B0B1C1D7719E2669B8CEF698B6C5EE094E16
EFB3D1569F6A5C8D2B21BA58C926CC5B
99169D7AAD5FB2C4D587CF8D99916E2C
8B9F3D968FF8415158C1ECE48B360A0A231F79487798203A
99169D7AAD5FB2C4D587CF8D99916E2C
A17DC2D659A359DC8F7BBF0B0DB4FFFA
11943CDA21ECB7D3F9BC2E32D29553D6AC64C6437A2CDFC0
A17DC2D659A359DC8F7BBF0B0DB4FFFA
366BA34DC89A94CFF81E7AA4216DB2B5
6A10D259C70AD95BCFD78D7F1A0FC719547ABCE75B416D75
366BA34DC89A94CFF81E7AA4216DB2B5
E84B0A324D6DF9B6BBF1875FFBD23E1B
AC4E1910FD69439B279C874D57623EAFEF8B3BB8A093536E
E84B0A324D6DF9B6BBF1875FFBD23E1B
47F5C9B76C37E3838A5E8A164BB79564
519BB2F434A5E3E360694EFA3B55DD2C65D5B1AEEB24C60A
47F5C9B76C37E3838A5E8A164BB79564
07973A519E7B8B496470D9883B1003A8
92045F1544783EA467FE74ABA52E566501A56826D034C5A2
07973A519E7B8B496470D9883B1003A8
3CE570219563AF3BC95C57CB22CDA5E2
FE0F13A91113123F5B1B048A304DF95EC8F93FEDF2F96040
3CE570219563AF3BC95C57CB22CDA5E2
6E546AC1D7E0BEC444B52C1055C25E37
B47E228326B900CD354F6E4BE7AD479A8C4C13FDA73B3E77
6E546AC1D7E0BEC444B52C1055C25E37
F298E0B288FB7D139AD7EE1D943C79D0
F00FAFFB89008CECC7D78EF96F563A89169BFDE0330747A7
F298E0B288FB7D139AD7EE1D943C79D0
F5E6266DD175CD1C21DD6D0F86DBCC89
80FD670C4C1593DF3231A894BE23F795374690EFB5DC8B2E
F5E6266DD175CD1C21DD6D0F86DBCC89
D04D08AF5283BEA49582AC29363BB246
017E389792CA02D8E27CA03BECA04931A2C43CC683E73968
D04D08AF5283BEA49582AC29363BB246
7DB569389647E105612B7AD7D6C20109
35ED76CDE6F1F2F99FC9C9037AE7A834C3EF461155253861
7DB569389647E105612B7AD7D6C20109
9656F2CADD8D2688D7C29F35B10F37EA
2306EEFB101E8630099F3BC9A76A8EBC142DD924E42A0F8B
9656F2CADD8D2688D7C29F35B10F37EA
6295D5A1E7A85A785DD11C382FED50B4
5614B5C35EE01E3C6B0AEE6840C2D4C449FCC51CCBC75F3F
6295D5A1E7A85A785DD11C382FED50B4
2ACD62C2818DFA6C70529D5BCCF7D041
EF15625AC2A5EB8641C78CAAC14F2EA839AE584707308F7E
2ACD62C2818DFA6C70529D5BCCF7D041
31DED3C3D4797C8CDB9533E32BD0D61C
5AE4E250E85B660F70195F6915365224E23B6BA42CE05962
31DED3C3D4797C8CDB9533E32BD0D61C
9A64283AFFC9253FC7F3353D70B45264
A822C4F6DB5B3285EA7D7753EAFF771B25C85E995C540B06
9A64283AFFC9253FC7F3353D70B45264
5802FD07FC1B054A47A19C9F88FFCF71
3E74B5444F8CBEE0B27F8A5416E472516269C206D4ABC477
5802FD07FC1B054A47A19C9F88FFCF71
D65A79E86F217A87BEFFE1C65D7FDA5F
DF55BF0460BC2A7C6425F3BC79C508D6DC9623C089D41E28
D65A79E86F217A87BEFFE1C65D7FDA5F
9B8BBFDD5FD930B581C8D10D957DE059
7088459745F81961FFAE4C61261C38635D5EF2CD1CA9FE71
9B8BBFDD5FD930B581C8D10D957DE059
658AB54EA87C07D4995A5065052DC0AC
C6F5FF185A4093D19A24F92F8E603FB7C404A2A819843EDD
658AB54EA87C07D4995A5065052DC0AC
05015DCC0BB6D43E7903F593364C0B44
E01D9A9CD4250BA89F25A4E385D6EB89BD07573B2FC83599
05015DCC0BB6D43E7903F593364C0B44
23E8C8F01DE15C794215578E0B9A8C1B
DBF2970C1C711A33BCCD6C139837B7F0FF1200B52452B982
23E8C8F01DE15C794215578E0B9A8C1B
D714C51B4D5C245CC5B355E0AAE0CBB8
DB735FAE08CF7A536BD9A908D56B93AC3AA155558EB2723A
D714C51B4D5C245CC5B355E0AAE0CBB8
651BD5AC04433F3D1F38DCEDAA06ECE8
2965C6A541C9EFD50EC27CA4D128AC91259989B824B49ED2
651BD5AC04433F3D1F38DCEDAA06ECE8
EB33FBE91C9616D1F11002816EDE435D
4D7A934CD723668FE5F1874DCDBEBA40D4898B394A6ADD8F
EB33FBE91C9616D1F11002816EDE435D
9AF5F37146B46ADFDBBD92C5C6C3D092
AEE53F0BA526098B7F04743C8B0AD09F0F3419FC8CA90D1D
9AF5F37146B46ADFDBBD92C5C6C3D092
0300D244624477DE136A36FAE8AFA034
92E07E328AD6E6C77C04A678E94EA7411C5E2F066406AD29
0300D244624477DE136A36FAE8AFA034
C6C69865D5BD48969E41CC8D0E91DAF7
E6BF87861335B1D3BAC23E1D3CF3EFD7821FE38B6A9777DE
C6C69865D5BD48969E41CC8D0E91DAF7
DF1DBB193FEC53A6D4C9CE6128E7E073
F47647FD35CC597465DF8504031FBC7156D62DEA427097AD
DF1DBB193FEC53A6D4C9CE6128E7E073
2BB853A9A8C814DBD5A206C16C175EF8
8D53084D1AB9825D4E67D6ADABD7A8AA83742B2B2E67C955
2BB853A9A8C814DBD5A206C16C175EF8
1134ED5F90443E645FFB2E28AD426ABF
9DC4643C48FF94295F533BF23B9396CEDC8F05038325A3EA
1134ED5F90443E645FFB2E28AD426ABF
EF9DD0130DD924803E862D2056E20FAB
79628599D8089E5BB0CEEBE1364AB24EE2092823D5C7AC41
EF9DD0130DD924803E862D2056E20FAB
60223A3404E45ACA1ECC2AFF480A5D62
FF269928E6454716D0ECD1D532AEE884FCC502DC9DCDF123
60223A3404E45ACA1ECC2AFF480A5D62
245D5484E3FE9EA8812D7DACB954C141
6621D8960E3156ACF4B18551D150762C7DE87F7024993062
245D5484E3FE9EA8812D7DACB954C141
D41D9506CB384041E34E93B3C2455753
C521A0DD97EACDFC20AC10571A68366D9EA6ECC3E6DC6731
D41D9506CB384041E34E93B3C2455753
4FFBA36589559024DF65270DEDA1961F
68632C81B3CE72676F57B332933DA64941C3CBCE0B7DF12E
4FFBA36589559024DF65270DEDA1961F
1584015B107E8FD5189308F700C6A2BB
35D51FB1603845E47AD3B2698343299C5950C3390BBB5395
1584015B107E8FD5189308F700C6A2BB
86F528B7EC1D8D86DDDE9BCF1D4DF8E6
AD8B2AC06F3E56FFFC269ADE6F5EA41A848E58F616F6AB73
86F528B7EC1D8D86DDDE9BCF1D4DF8E6
81EE9DEE80AB5E7555684B801DD6EF6E
EF860852C9BE570C7DC80730EFF5FA6FD1E613760B20441D
81EE9DEE80AB5E7555684B801DD6EF6E
2FF13C9CCDCE3BD18C5450DEB02DA250
2CE21C7888524E2752393BAC223BC1BE5DB243A8BB0DE64D
2FF13C9CCDCE3BD18C5450DEB02DA250
4A30BA474FDA5C1D2E0AE32301B198A5
18A706CE43BE3C4E180981EB6DE19DA373B8A08BBABC7EE8
4A30BA474FDA5C1D2E0AE32301B198A5
BD266EB3C1FDC73690D0B0086274AD7F
980082F7E7BD238CA52FEF58AC1C5A95E3681083D8C8D397
BD266EB3C1FDC73690D0B0086274AD7F
9BE37EAAB00CE5F870A4E4DA0A5A6C50
FE82D1AC54D636593ECC91F21C10BF6D93CCF459D292BFC7
9BE37EAAB00CE5F870A4E4DA0A5A6C50
CCAF0249B775B8B48FC0325074AB6326
6287A03579F8000CF26393BBAB6507D91C0CC609A639DCE1
CCAF0249B775B8B48FC0325074AB6326
1DC37DE107713299195D80BFDF91D4D8
E6FE3FAECDA61232EFA0EE5AAC143540055146B679A80839
1DC37DE107713299195D80BFDF91D4D8
6AD335F58A8146E65DCEDCB8B7CD8A30
5DFF7D6A0C36131D8573DBAF269573A6589F9A0ECE658209
6AD335F58A8146E65DCEDCB8B7CD8A30
00C2957134B21616ED6E75C90D8E8B91
A4F9E4F355D26BB085B14EDE122765B0B5F1EFC7C3EB0998
00C2957134B21616ED6E75C90D8E8B91
645BD05CC81CD2186D53FF2A36595C07
CA9FB18EFEC2FE3DE1EA9E82DA3BB7A8D8A210EDF5B2559F
645BD05CC81CD2186D53FF2A36595C07
4AA1313A379EF333BEFF61E0140E8093
370BEE86B6C07676AB4BAFB8EDA5449B665D710DE1BCD50C
4AA1313A379EF333BEFF61E0140E8093
2835957D9CC9496249FFE01D1A58794F
441B11DEB1B1A6B6837E3AC5716C0DF92FA29110FBE4AC43
2835957D9CC9496249FFE01D1A58794F
31163D7878D328D19CC3BD23910D43D5
A9F81659DE25D244B26807BD09BF2528B3612C336AE9EF96
31163D7878D328D19CC3BD23910D43D5
0248A7CD04B5024FB491B9E74357059E
CDDF6BE324DAC2D3B020A0700D0A276707F095D429BEEA08
0248A7CD04B5024FB491B9E74357059E
0895F7E277D1026373CA082DA5F9ADD9
F9739C511F27DFABB8B557927ADB2504743A9DF98C4747D1
0895F7E277D1026373CA082DA5F9ADD9
F34389DA06E0DA932424AF27E7EB0211
B05EB78D80D114CA4BF6DE487C3BFF97501E32DE6BAC45C0
F34389DA06E0DA932424AF27E7EB0211
8218033C2C5E7E74AC6613F47393B562
FD47519EA1D4E231C9EEDD74506581E3FC78212A183FF0A2
8218033C2C5E7E74AC6613F47393B562
F417289227D6203525BBEC62647B6EDA
5436564A80FA6A213DF9F5E677B3A1D6D9C3CD487C449E78
F417289227D6203525BBEC62647B6EDA
C5816F6D953B4FA4EAE6CA479D4E53E2
1212BC956C12237BF8789A8BE288EE723325070FE10ACD9A
C5816F6D953B4FA4EAE6CA479D4E53E2
5E0FA5E1684DFDEAB209098FE5DA1857
E81A5F67CA85B96DA6773F6A8AC51398812C0E8004D0D5CD
5E0FA5E1684DFDEAB209098FE5DA1857
55C63AB66DD9C7D8DA1B2D808A05C724
F5670AA3EB03A013F3B105DCE71CD4405B3723008ED512E9
55C63AB66DD9C7D8DA1B2D808A05C724
C69B347F7133FE5D6401FEF899564D63
366AFF235023F9E7352A31A3962F2A1D3F36DDF817835F8A
C69B347F7133FE5D6401FEF899564D63
CEFD87A4BEEDBCCAA41D8B1496CB0A84
30A6724688B06447FBD7B60728C296D79B2B56EC8148550E
CEFD87A4BEEDBCCAA41D8B1496CB0A84
1D00B235E2A02DEDDAE45D44F39DD64E
F44A7EFE4D7CC101E6D70432CA62BB3A41CF0BA872D58340
1D00B235E2A02DEDDAE45D44F39DD64E
54E497AF6E0AAF4BA882C36D65E08C63
5B49F9042808713CB233939DA4681471E94DC8C517350F23
54E497AF6E0AAF4BA882C36D65E08C63
F8A4F03AE1A5237DABB90B63AF055FA1
AC9CED67C31BD85B4A9763A745CD370C42F4C3A6B8305082
F8A4F03AE1A5237DABB90B63AF055FA1
BAD0B798E9A59633909F10F881CB8A71
4C354480C29D714AF047D43FAC68A13FD26BD35E39FBDAF3
BAD0B798E9A59633909F10F881CB8A71
00531E59C13D01D2F2F195CEFFFFA563
486A3A186704E174F014CA666D55A0ED209A4690C6047F90
00531E59C13D01D2F2F195CEFFFFA563
4F334ED8E69282BCA6124C7D97698F3C
A769787A4CD288D6BF2784BE8BC7225186880AED516DF0AC
4F334ED8E69282BCA6124C7D97698F3C
BBCFF7E0B4D1251F9549C4EBA1753DB5
5B1CA9CF1D81D7D204E8735E3F16074E13C1CE06F018CD19
BBCFF7E0B4D1251F9549C4EBA1753DB5
DCC84EEBD349B16D076B9CCA6CCF382D
3962A97B73AA0482D8203DB5EC5FB62314AA52CC9CD7F534
DCC84EEBD349B16D076B9CCA6CCF382D
7A13738F67E22632C7BE35AAD7A4B1A2
22D12202AD0EB3B3A2334E3A8BBD9011D31467664B734496
7A13738F67E22632C7BE35AAD7A4B1A2
B9F9D903CDE71557A7B37E5D97678D96
ABC48A5AD487168C1BCA9739465A854674A7193BDC14C900
B9F9D903CDE71557A7B37E5D97678D96
2A47988DC4D992A96382310D8FEDE2EE
B98B3866809FD374318D0FB4828317EF1725283653F92BEE
2A47988DC4D992A96382310D8FEDE2EE
9F1D53AAEBCF0441DE7F5B9AFF63621C
80B18EFB189A2E25AE905C1E694C13AEC95A73ACAC9A49F2
9F1D53AAEBCF0441DE7F5B9AFF63621C
F874D13A80F19F90E546BE62A8E98341
53E24ACA98BD114656E48D24E9BD8C3E2C1CCDCE0473CAB3
F874D13A80F19F90E546BE62A8E98341
0B4FFE645518547933359C565AF76018
D673C08A5FED46175DAB7340BCA5D8471F2951985E84AAAB
0B4FFE645518547933359C565AF76018
3C80872218B2B73398034C6DB4EAFF68
547382B806372ACB612BF462A4176F74872A1DF5EA6E55C3
3C80872218B2B73398034C6DB4EAFF68
1DAF557BED7F5FEBEECEC09A864A32FC
EB64EB08CE1FC6197C84A1194968309F69E4DD6F6C24673F
1DAF557BED7F5FEBEECEC09A864A32FC
AA8B4A54E5E4A6BBD7795902865A6969
A3B1D8F0D1EF58B6D60FEB4DAC8C9624BE9D846DEA7E0E56
AA8B4A54E5E4A6BBD7795902865A6969
EAD6EBC8CBED90E7D41DB87CB9A5112C
699308F2769AB0253CD90085676106C36A803C1153DB1F7A
EAD6EBC8CBED90E7D41DB87CB9A5112C
D3B2F82BB1BD49A84F91467169FB0002
1EACAEDB8C2E5A43EF6BF8AED6DC4F6B25117A603A201F78
D3B2F82BB1BD49A84F91467169FB0002
4B436D05D03BCD9827B1ADEAFA63FEF3
6337522CAFF83A32A42895AB06E782F302A0D78AC043E18B
4B436D05D03BCD9827B1ADEAFA63FEF3
0B017422023C26481C5E6EE560613DE2
65B127F61DEB5404AF29E18904DBA4BB1EFEB96FA022DC69
0B017422023C26481C5E6EE560613DE2
40E27BE36448B2A429C759A66EB45AF2
92319BE60BA86DFEEFCB9A6A6093161F3739E0C9CE96869B
40E27BE36448B2A429C759A66EB45AF2
09ADE660CE07059F519E8F3365E4284E
1C114B397916122DE6667C0AAE94138066A76FFAAB72AED5
09ADE660CE07059F519E8F3365E4284E
CDD5743725D5CCFBAB8F4EF52D227665
F8D466A67B462C812BB3083D8B41DF7BCD28210F8650D8B0
CDD5743725D5CCFBAB8F4EF52D227665
441F88BCE4C976A77528515870D3CBCE
158BBAE8A364C4696FAC80816F88A9DCB8007057F683137E
441F88BCE4C976A77528515870D3CBCE
34458E83922D087CF1B78DD064C13002
A5646C05D280785A5BE90E02FDA5A1A049B7FD879242237C
34458E83922D087CF1B78DD064C13002
47DB05E62A4F3ADEEA6CA63D656FEF9B
BEE363D27D73D5F51C320BE4D7EA9B7EA3DB5BBAF72DCCE7
47DB05E62A4F3ADEEA6CA63D656FEF9B
7F708ADCCC621AFBDE9676BF8EF088B0
AEA1B64220FC004A634281381B8881857D4D2D0579DD4457
7F708ADCCC621AFBDE9676BF8EF088B0
A112456DDF64E0B5DDEA84F1C45949F5
F3EB942C41CAFF81C250C455C4EC6130A0A7A9F4BD840DA2
A112456DDF64E0B5DDEA84F1C45949F5
C8701ED200B0809FF2C1F00853C10A6F
F99FBC00BD3CEA680A20DA87C45CE1AF526659FCEE4507CD
C8701ED200B0809FF2C1F00853C10A6F
EEC4B847EBB5B2297CAE186BC4BD7FD2
56ED4C2C6C4270AEE4E462C02FE953862EC841972AF8781F
EEC4B847EBB5B2297CAE186BC4BD7FD2
C8E483853D8A68835AD39AF668260809
5E9D7ECA4AAD78652C00E14512633B05741BDB6142DE7016
C8E483853D8A68835AD39AF668260809
5960279850143F9FE94A6DD39A69BDEA
B1224DACFE622E157560C6DD4277049A9D51B6B2D8B7CDFC
5960279850143F9FE94A6DD39A69BDEA
0B17FC49B2FA263790FB1A408DBFC0BC
06D11C668BAE94EF7E773A94F08D22AD0DAAACF255080D40
0B17FC49B2FA263790FB1A408DBFC0BC
853F0EEAC5515D547D2F5E339591F96D
C259B8FCC12A56C0FB48347E35DC7FF97085F2C1C099F42D
853F0EEAC5515D547D2F5E339591F96D
7542481D6EE10A15155BFBC7DA9486F6
A592BC6C46C1310F8E0A7C635B3D75EC65DE09061A0D72DB
7542481D6EE10A15155BFBC7DA9486F6
DD1318C074C11F0BF8CD6A51E20096FC
A83DA598744CD7F2531964A32FFC6AE79D136357F80DE427
DD1318C074C11F0BF8CD6A51E20096FC
48138C8C6CDB3FE2B13349B34F7DBDD2
688F4C76658200971B0AE82F432755052C202AE4B77059F5
48138C8C6CDB3FE2B13349B34F7DBDD2
BAB6D6CCC549F501DA62B443F962D9C2
F4EFABB6BB8CC15DA1BC3EE3866EA004F6429EA74E128037
BAB6D6CCC549F501DA62B443F962D9C2
4C3D6B0AFD2370E885E5F12DD525C2BB
A80469D74131E278ED8155E97B4DD0EC73A76F8A9B37428C
4C3D6B0AFD2370E885E5F12DD525C2BB
7AC71F5B1D0D8866B96AE0983A80550B
1A10E6E7236C729997464AB26640588ACACD8F12A1B71787
7AC71F5B1D0D8866B96AE0983A80550B
C200FF53B33BE50CA83A33E19F24C1B4
3BAB89F86AE3BD3E5546B5E1D57BBD8662F7BCF33E93D633
C200FF53B33BE50CA83A33E19F24C1B4
E1329564EA595B9534E1D1A781D12BE9
6551C382EA0C79CFB47420853F22E61356166D54BF42FDDA
E1329564EA595B9534E1D1A781D12BE9
1EACA464141C18C29578E6DEC2463D29
00EDE07C9CB1D7D6AAD884E12B3EFED1C36E8B8A7D04C0F3
1EACA464141C18C29578E6DEC2463D29
E6BC190CCABC446EC98A8DB5D26ADE0D
DA40CE567873E2F14C649DEDE182BABF0AE4063FAF6E1EFE
E6BC190CCABC446EC98A8DB5D26ADE0D
811FA58BBED9A863F938B7B726058377
31486965E11A2178CD7B38665F5B12DCF3DCB188896B9D89
811FA58BBED9A863F938B7B726058377
D2AA07C8D5EAAEEC478CF5EDA26F9730
EBBDCDA691E5902A1FD13FAE8AB1BC30B45044652B040AB9
D2AA07C8D5EAAEEC478CF5EDA26F9730
0A08167CF37699D115E4EA56C57EFFBB
82CE0D43F3A8CCA215D929D279C725E1A1B4AE33EE7AF502
0A08167CF37699D115E4EA56C57EFFBB
35C8BA8572767092F5F7D274EC11938D
A1BF19A1FEF56DBA201193570BB1557354437C47026B668F
35C8BA8572767092F5F7D274EC11938D
4777CEB46D3AC79F1A55441F97F9AAB8
20D521FD60A18D2D67665DE3668B92EC4E1638589592CC37
4777CEB46D3AC79F1A55441F97F9AAB8
EA43648800B7B78FB46AA36D91DE5C0A
542A87B5C77EC3BE8D25396B663C2563FA7C9B35044C903D
EA43648800B7B78FB46AA36D91DE5C0A
6CCA3909F868F6F72D2D5DD3A776A3CC
F75025AD3F72E093E1EF00629E54D394D751C6E6A33A33F1
6CCA3909F868F6F72D2D5DD3A776A3CC
67BA6909578D36C1E188D727954A598C
2FADB46962D243778655696BC9D9E55536D911C136706A7D
67BA6909578D36C1E188D727954A598C
38178942232D8850936A51CD3037E7ED
7689709745098419BE42E029EAF46D05A5B3400C06478D90
38178942232D8850936A51CD3037E7ED
455FD654E06B5206B5D3BA6EF14BA440
19D0E23C2BDEF4EBFB1D367D0A9F3F031060FA62F70C29D0
455FD654E06B5206B5D3BA6EF14BA440
6986678A822F570E35932C03997DA176
E76AD9E33CF6258B929B51F788B0680D25F3D6616E7188A6
6986678A822F570E35932C03997DA176
655A7041ABE6445DBAE6E066BD4F3CD3
DF4E6EBDBECE5D75F7C121B623562C509F153607D33EB475
655A7041ABE6445DBAE6E066BD4F3CD3
D2B9F31746CD348FE3B39F723FB8FAB4
BA5198F747C393212578D2A1659B18DF7CA6A975EC864EC1
D2B9F31746CD348FE3B39F723FB8FAB4
D021354F5FDC001BFBB9582701288D92
E0F2A47DEB141BA0F559E7EE3A4718C4871FF152EDAEC353
D021354F5FDC001BFBB9582701288D92
F3C4986F462F21CE8C7A719EE5CA1186
5BE48B9B412CD094069D7F817C68390A0B6580CC0864D2D5
F3C4986F462F21CE8C7A719EE5CA1186
4243E2AC454EDEC64EF5709509945E67
B57D0C246A77A93E44DE9D2D3926E7CC4590F05901F08CB2
4243E2AC454EDEC64EF5709509945E67
B4140BF3740E4AAE07A0D44DA424B450
68B8BEA7F911C65CF0CA96DE4D28AD6242302414A5D438E2
B4140BF3740E4AAE07A0D44DA424B450
B7DA01E35B406336759932F1723A9AF2
0DEA9DD1F7E6C25F4710973D1668CE5437A916E5D7EEA210
B7DA01E35B406336759932F1723A9AF2
F8E9288184B909745FACC72F02CDC57D
8CA5EA98EA1C4758BFF9BFBC92D1C7206805D1CAD523676D
F8E9288184B909745FACC72F02CDC57D
1BB2F40159B9F361D3D75B9C99D4167A
77C582037CEECD8AA44B4BBDCB683441BBD28A564CF77117
1BB2F40159B9F361D3D75B9C99D4167A
F174B3B1BFD44E3DD43D9AC0F365D38F
D44494E9F9173581553FF80C74BC7A7C6FEF1096BF92A298
F174B3B1BFD44E3DD43D9AC0F365D38F
0ED4488B267EF509F4BC4C29ECB2CE8D
D622006F1F028D135BEBB08752C28F759B535CBF53206C15
0ED4488B267EF509F4BC4C29ECB2CE8D
5641FC185C58D98B5DC65E4ACBA59C09
4D37871E425D99470DAA4C9F0E9A56FEC69502F59885F01C
5641FC185C58D98B5DC65E4ACBA59C09
4AD261F7326A8818B25B44A8C2051456
C37BF0CEF867F01447782D683CF0DEE674CE465D5A80E44A
4AD261F7326A8818B25B44A8C2051456
AE7BF53B34155C286220C027D66F0208
E7C877334F115C88E903D85308E582CE16EE867A8CEFE642
AE7BF53B34155C286220C027D66F0208
3FC87D77D5391D77EF19BDF83B11A78F
AAACB3B9E7A3AC9AD6CBA524DDDC9FB9F9F73B82B7FE41CD
3FC87D77D5391D77EF19BDF83B11A78F
6B80E9F47CFE73ADCFCCE85DDFCB1B98
5FA6B71F8863DC14BD4B4CD0A122EC14363BD3DF68355A55
6B80E9F47CFE73ADCFCCE85DDFCB1B98
8708F37AFDD976BB80EEA9FA52C44DB3
1FDBB5647769A1B23A43BFAA5CFB9AAFB6D57A253AF117E6
8708F37AFDD976BB80EEA9FA52C44DB3
EBC573EBC83D462DB86E3E4DA1D0DA59
1CCEB989B2D1F18FD186CC4194C6DC820EBB44689B21CDBF
EBC573EBC83D462DB86E3E4DA1D0DA59
23AAC1BFB685CE5721C3AA8E5B497E27
7CFD2721FCB11A52F22C0DFE224312D52F78EEE6C068B398
23AAC1BFB685CE5721C3AA8E5B497E27
3BD318B9552CFE1F893DA7F58BC92657
3F0080789B47CC40C9FF1547776FECCAA64549134BA195CF
3BD318B9552CFE1F893DA7F58BC92657
0479D5A6100224D0B061F46D0086EE10
0FBEC6661D44F1B9CD86C0E1676DC81A1624BD7E4B277BDF
0479D5A6100224D0B061F46D0086EE10
DA525E6866171124FEF0F87C5B531C8F
3F675C783C8B1B0317D49E89017AD93EE8D4450210746750
DA525E6866171124FEF0F87C5B531C8F
1FF583C5B179BB8A8DCFC3427A6A6545
5235905EB47CF6F708211D4CB00362B4651B86406A1E0215
1FF583C5B179BB8A8DCFC3427A6A6545
6BDC29265F4CD5B55DA1496D04ACB84D
2BF97E40CCE9632063FD346AEF4FB70138BACF2D6EB2BA58
6BDC29265F4CD5B55DA1496D04ACB84D
284CDD66532ABFC9F63687EAF7FC4863
714AC262389DBE5E4BB1E90CBC6508C8CE8C48C7994EF23B
284CDD66532ABFC9F63687EAF7FC4863
AED1F938EAB744F24B76FF80DAF81702
3654F532EAED52A6E560103456D24C3A85FAB74743B6E539
AED1F938EAB744F24B76FF80DAF81702
4595198D9461923D81A7045EA19AE5A2
282BC3A68A70EF94A0F509B9C2B3DE07045DB319E22C009B
4595198D9461923D81A7045EA19AE5A2
73A4C34FF68778A6B05B8111132EA662
5B7F8EAFF37C5A36D351CAF63434A6A1B4063208F102A6F9
73A4C34FF68778A6B05B8111132EA662
1C39DF5C10501B9CFEAF1BAAC7F7EAA6
E695AD59459120D5CF6815AA2464BD3D4AA929A236F54C5F
1C39DF5C10501B9CFEAF1BAAC7F7EAA6
4D9A756DCAA3328B2CC8BC25260A3DB6
34EF6197A2CA60CA82F260C7EEC78FB66661958710FF71E9
4D9A756DCAA3328B2CC8BC25260A3DB6
C4B969F1769567B893BD1FE6C5E88CB4
A32CBE3BCD8B2FAE464B09369852E80EF5DC8A61D517FD5D
C4B969F1769567B893BD1FE6C5E88CB4
E79BAF4A76438F323356724CFF064B05
3487B05536DE2FEBA1D0A67CEE11673CC68AF82D2A11B658
E79BAF4A76438F323356724CFF064B05
5007CCCA9F7F092771AB6ACBF11DB9EF
37464650ADBA42ECF1D76AB6716E6E1BB72192E6DB0C0FB7
5007CCCA9F7F092771AB6ACBF11DB9EF
55347D4D762DBE451C12BAA1376073B9
4334EC92628B3B70A4E317FB0743D05EAB332847EC6C7C0E
55347D4D762DBE451C12BAA1376073B9
DEC51C00FC7DC3B0806E0BE16EC07833
8A5477640D3B8CA87A260BFBFB3E13EE2B5D23A682AC043D
DEC51C00FC7DC3B0806E0BE16EC07833
BCF7D97E8FA0754D30E08D16EB073C18
C81E891FBB098A49C6D1D285749E66A31BBDAEB069AB3825
BCF7D97E8FA0754D30E08D16EB073C18
454544149FC624A1313F362850BE6F77
ED85D67C8206034C83949691EB5842022A82989839155752
454544149FC624A1313F362850BE6F77
42043A07CFCB0081D98DB0F235759F70
0F840F84ECEA74E2C190AC9624934283F30F286A0C60C822
42043A07CFCB0081D98DB0F235759F70
8C216E9254D73C89CC3BFD55F6A070F0
6656050CC4F08F074DB1C20470447E0A3F34D53FFAC0B8D2
8C216E9254D73C89CC3BFD55F6A070F0
20C83CF988888E6F4C4122F6693F2995
A576CBF724DECA766D79FEFDF8CCF0657375F7C993FF9147
20C83CF988888E6F4C4122F6693F2995
D6AE1A50795F2CEA64907A14B85A814C
527B497A05B0DEC6BBD7E4AD8193DC8F17E58DDD2BA5100B
D6AE1A50795F2CEA64907A14B85A814C
28EBE081EF6BA0647CED0F111CE99A42
F1C431BA01A16CA1933C042C6EF87CEB6B0882CC374C8A49
28EBE081EF6BA0647CED0F111CE99A42
55A0BEF03ACCEF3AC6CE40F2160C412A
996ABF52034A5C65C69CBADC543493D1ADC6C23E2140CB63
55A0BEF03ACCEF3AC6CE40F2160C412A
6BCBFA0336F5F01ED1B34D906DBC9158
13FCC3F76D48A01AAD5740DF62C163CF7C758FAE4CFC5A3B
6BCBFA0336F5F01ED1B34D906DBC9158
C483149F6AA99246C995C38D31072A22
082F07ACC219982E69D454400868F189B5E04C237DFB7019
C483149F6AA99246C995C38D31072A22
F38F776620A2DC1D3BDAEAF8C4918F49
8F06893916D512CB9A5B232628CA2D948E3AA6DBB96AFF50
F38F776620A2DC1D3BDAEAF8C4918F49
ABB9A66E2646F8F6D71A4618AC345849
C8102E4276015DAB31E285480E8CD5625920E0C3155EA719
ABB9A66E2646F8F6D71A4618AC345849
C07BF785FB94B3BC828ABE292C36E527
AEEF8AA6960C3E68F19972CDF51866DEDBAA5EEA3968423E
C07BF785FB94B3BC828ABE292C36E527
2DA5810D7205E92BB676B23714E8A4E6
959E1356AB9A730BDC3CF3C0871D8FF56DDCECDD2D80E6D8
2DA5810D7205E92BB676B23714E8A4E6
703A74FD92089084F1103F5EDA130E45
67977B7C00D9F6B6AC06873D15151F719CCCD383F793E89D
703A74FD92089084F1103F5EDA130E45
99742953988B9553E3CC3CBB42D1D88A
F1ACABFD1D9DBC0B3572AE6E8D9E8A227F00EF38B5423017
99742953988B9553E3CC3CBB42D1D88A
A617FEFAF66D72680505D8B90FC06DDF
8D27294E7554B562936550947BF3F84A7A053781BA825DC8
A617FEFAF66D72680505D8B90FC06DDF
78603F4C2D6A5887988E57EB5B3CCE96
AE2F5A3953AF5F8BEB056FD85699A0CDE28B606AE1BE935E
78603F4C2D6A5887988E57EB5B3CCE96
36DC7DC2496D9CD95C82513EA20C6644
85CFF4E999E41695DDD9121A1FF43C14BE09315443B2F51A
36DC7DC2496D9CD95C82513EA20C6644
4ABB10D21925BC5511F9AEB1859BF051
1A6E0F2B464BC72B976202C806D18041AFF09FE5C629054B
4ABB10D21925BC5511F9AEB1859BF051
D497B8193B987E215432DE76636EEE47
564D046DF22C1E5443F5BAD13D49FE60FBC24193A547EB0C
D497B8193B987E215432DE76636EEE47
98B028C2E14FEFCBF85B1643BA5D0D23
081959972117C7E4DB459213DC0611AB039957D01F1AE62F
98B028C2E14FEFCBF85B1643BA5D0D23
522EB44069BC06CA0D0AACD95997E049
F39DB42B9ECD03F3896B2653B5BA17610E93FB09468D0666
522EB44069BC06CA0D0AACD95997E049
CC0AAE821D66831BD9ABCE72E8E4D47A
C5D594841CEB84A2456188D1A8DC947AD738357BAE69D21C
CC0AAE821D66831BD9ABCE72E8E4D47A
9BF1938736A2F47FA530E5C8AA37BF0E
6F68572BC02D6AA5DE901B569E7E60057208D0B3045E6D12
9BF1938736A2F47FA530E5C8AA37BF0E
210B8103161A5E804D26866D01F55A71
AAC15AB8A6133643FF9B9A5588643E853F2E56DE05AB3763
210B8103161A5E804D26866D01F55A71
CC5C1EE822DE0F1C74975A31BC90BA7C
67F85E9B0DCA4D8D33C784BDAABA31994BB90CEFB93B8D1F
CC5C1EE822DE0F1C74975A31BC90BA7C
2F8AC5C88DA55101F9DEA85DF9ADCA53
FE2C875A9E4668FB1C4D4175271F6098B267A4B24096474C
2F8AC5C88DA55101F9DEA85DF9ADCA53
D8FE4D9F69A759CEABA64541FB29A215
8A0815CE71587F55C4B30CEA4EB8395619C1E1F3BBBFE559
D8FE4D9F69A759CEABA64541FB29A215
85FE5092590780CA778EA0E13525A6A3
2FDBEF8CF28FACDE414D5C7817BFB99C6E4F41128E9A43FA
85FE5092590780CA778EA0E13525A6A3
47044E029DBCDE7C640DB1DE7CCA8D7C
3F168FCEC2CED25F0649127A8A0367E00A42F0CCF250CE86
47044E029DBCDE7C640DB1DE7CCA8D7C
23A845AF8F29BD579D4249E3B62A58D3
00A7282726E71D2A25E157D5052ADAB79700B92F447A9655
23A845AF8F29BD579D4249E3B62A58D3
F6B84B22ECCF33DC3F730CB44FBA49AB
F8C4A0FECA11A990D3591CF7E9E5E96BA873B59B0BC0DFFE
F6B84B22ECCF33DC3F730CB44FBA49AB
A94207BC8E7EE3563389178015AA2AB2
3B56014B675F893C7A1B1B4B679B0A3D9BFAA21B1E6AF54C
A94207BC8E7EE3563389178015AA2AB2
D2FFF30060C81E7A477BAF0187CFEB77
9DFBACC9834CA880A8E4E84B07531447DC810D1A99A51E3B
D2FFF30060C81E7A477BAF0187CFEB77
B706B3A5590C8798A5DD4EA32FA1F441
DA213A5D27F15A931FE25BEE5E5F93DF795C43B9B604EA7A
B706B3A5590C8798A5DD4EA32FA1F441
B696BF41E267511681D64BDD2D29D7CD
5B64DAED192924EDA974E4AFBC38C2C9F88A08649B2D3DB7
B696BF41E267511681D64BDD2D29D7CD
0E893F3C763DD613BAD5A0587C25E2D6
33C6C572A1C6C418A7FDDB93CA0514DA425FA83CE708DF61
0E893F3C763DD613BAD5A0587C25E2D6
7F5215418F60EF603E63D8768549ACCE
6A55D1D22896B4DDD8AFCED24565FBBA7C3C704A624173AF
7F5215418F60EF603E63D8768549ACCE
9D1B781B623FE657A460173DF1F9141F
C4749D9084E626F845B4B6C9275A1DEDD85C677793B867B0
9D1B781B623FE657A460173DF1F9141F
8E27B95E1303B5EA78A2364516CDF493
28AA2A75628D7C6ACB930F973459A807A0FE513285759323
8E27B95E1303B5EA78A2364516CDF493
2645F10BD0D62E700A198A0FDB710252
C5EC9E4BDC10092BEDD6FE9CE48F8677AAE7DB3D5E049171
2645F10BD0D62E700A198A0FDB710252
A49FCA58A6705644AA16729802FE2E72
8AD578304ED14D35494934C442FFD03300F1A9A55CFABF03
A49FCA58A6705644AA16729802FE2E72
C550F5C3420E5B8237C4025A1C8BB031
8A37BD42189240B08C19C10700F18BB13735ABFF40710F32
C550F5C3420E5B8237C4025A1C8BB031
742DE5EE4D3B815978F03633AD67F39F
AB1C69A7D83E173EF83424E94DCA0AE84FC59DCCED16FCAD
742DE5EE4D3B815978F03633AD67F39F
D93FA77BCC7F98F228701B19F858A441
262CA999450ABD14210B839281B5921A67B586D5154E58EC
D93FA77BCC7F98F228701B19F858A441
8523837473154F042EA8D99F6638F758
78D820E3CEA263F1A42800E6F2A0DD1E491D5F4A7376AFB4
8523837473154F042EA8D99F6638F758
FCBB424D36F38D56334C676D5CD940D8
61797BCF01A39DFA589342ABC45350487A5138272FAFEF6C
FCBB424D36F38D56334C676D5CD940D8
C1C8B8F86E436F28892B752EF24F0B8C
23C05FA3E1F6B4E7995BFA53AA103F60F37A4D09DDE0E4E0
C1C8B8F86E436F28892B752EF24F0B8C
4E0FED17AA0F3B4D3C05AA95D2278545
70348D1CC7F7DEF0D7541744001F042DCF7FE79C0FC761A5
4E0FED17AA0F3B4D3C05AA95D2278545
BFF14C1A483E0DF0231508F6A9A28658
1F6D045D5DABCCAC68A55B5E482109DDEC6AEF6AA665E7FD
BFF14C1A483E0DF0231508F6A9A28658
4ACC47F0581CDE7C4D002CD332835C98
1746EFD9B5CA47C322691CAE103DD7A1A16AC3B994E6BB65
4ACC47F0581CDE7C4D002CD332835C98
0E5801A965397953684E96D6836EC5E4
1F6A29E852BEDECD2C311D077504AEF2C924556F17887E81
0E5801A965397953684E96D6836EC5E4
8DF523972BB1020CF8FFF3E699FA0CA5
26BD7E43F782177BA1C43E905EB5ACFE31DBA6898E727224
8DF523972BB1020CF8FFF3E699FA0CA5
75833E1CB34B5F1CD22ED750D290AB5A
FB87FFD26AEFEB4AD447008CEDFEF3E2E3F571D95CE2D97E
75833E1CB34B5F1CD22ED750D290AB5A
88472A3F9EFDD67F4E4E2F460DB10DB1
3B1C38B1285402B35C002AB37303259DADBB5E9F5153D4CF
88472A3F9EFDD67F4E4E2F460DB10DB1
97BFB8727788B0450ED0E6214C47BD97
7A1F74C59C536FC2CBBF92C1048B95D8A36BB8BE1D146958
97BFB8727788B0450ED0E6214C47BD97
072BA1E5CF5E3CDD8B5107B145E2ED41
034621C73737F04CCC943324CBD5A905283ABF0F58F68419
072BA1E5CF5E3CDD8B5107B145E2ED41
08212CB07784A53889ACAC7AD50EF5F4
B264FFDDE03B3FE5C4B51F94BC510C3DA19613758DF871ED
08212CB07784A53889ACAC7AD50EF5F4
6E234444768CFDA465FF9B8E8661B131
803FAD2B30FA0639AA965BD0CADDF199C46988FB0B99C0DC
6E234444768CFDA465FF9B8E8661B131
494C9841C5DAB2020C193A7FC4EA9727
3081232E192B7985E3DAC3910F07439BC870B284CF7357FB
494C9841C5DAB2020C193A7FC4EA9727
70A49332026300E8084166184B04C425
668B9D6BDD1D7E0B937E50A30D644373C031D49C847793DE
70A49332026300E8084166184B04C425
A0D735D6F1DD6A3D4C43399B41C4B4D2
3AF4895A6354B89D33A96575FCB9294E8C72ED07C5B3270C
A0D735D6F1DD6A3D4C43399B41C4B4D2
F7C34C74AC10DB2B79FF33BA4F522DCF
39790D3F57F01BA2C46A290150A9F265F58DDEBD8AE10AC3
F7C34C74AC10DB2B79FF33BA4F522DCF
0C862F952DB24F815F9D3D5C3EB2EF6E
4607811A7328297FC8EC06947D1BBDE4AA10E3E1B453E5AD
0C862F952DB24F815F9D3D5C3EB2EF6E
CAFFA870DF294FBD48D1313083C43DE5
E8E653052FCECE9A0213AEE4A232F259E2C1D2D13797D848
CAFFA870DF294FBD48D1313083C43DE5
2169D101D5CA182FBDC4898046096228
526BC50A2FCAC6C4237A7FE577F8EA765F055B51719EBA60
2169D101D5CA182FBDC4898046096228
11EBDB45C5E4C22B07D5172EA31A6983
4F13D50919800CDF3291A4A0B21C285D58D04C7FD284D3E3
11EBDB45C5E4C22B07D5172EA31A6983
A3F123D7AAD62E47D7563537F1C723C5
8CA20D19F0BCA4F99160877718CA061A8F8679482343F026
A3F123D7AAD62E47D7563537F1C723C5
F46ED098E5FEB5D26878A3CCB071A492
22082DFE72FA14D0650E57EFFD34B3C8E7FEDA84933254B4
F46ED098E5FEB5D26878A3CCB071A492
89122B551E3B727CB008B1AE4678CFA7
93533A150654E3CAEC1C7CBAE30FC1B457F66B2AD54A9B13
89122B551E3B727CB008B1AE4678CFA7
A44ABC9CA9650F5AB848B0F02F2D0BE2
2D4AE5CBC1C193D74856C0264A6ACEEEEFBEDBDAFA6790F1
A44ABC9CA9650F5AB848B0F02F2D0BE2
59233AE1F683F8D919B8942F7C23F020
CBE7C8CC0F7BD5801175FAC7BCE93637F6064FF5864460D1
59233AE1F683F8D919B8942F7C23F020
ED608766664E81DFCEE5EC36CDBB7B85
01B599C7E8C53224FC157DA1DAA7B7E838E3A3C34BFF1B54
ED608766664E81DFCEE5EC36CDBB7B85
8004A46D0F2D4DFD7EBF85A9C3537B0D
989C8CEB8B7839CB7C11D9CCD58AFA15465C266A88AC6059
8004A46D0F2D4DFD7EBF85A9C3537B0D
A2719096D56CA0D5DE031D144951D8D7
A9ABB438BBB91106DE60495A00E65AC0985F3B7EC1FDB88E
A2719096D56CA0D5DE031D144951D8D7
838C27D7E96FA50D31F008C517B7F8C4
2116F90C3F8D9CFC5DEC6E8DE989FFCDA9AF33BBD64A404A
838C27D7E96FA50D31F008C517B7F8C4
A7BE23C47E3403EE6F57B8E048D57C8C
2CBDDB95E9B96681FA524D4997BDFC23C6F88B5B9E9F3CC6
A7BE23C47E3403EE6F57B8E048D57C8C
69257B2F2BB31A821D12FBF67058A3B2
B2493426E814C62393773666BC0EE6A1DBEA70ADEEC79F74
69257B2F2BB31A821D12FBF67058A3B2
B8497D67147CF46AC110A963D2916B6F
B550C4399B2EC9D02B3E4B01A87212CB1AFAD9CE3C56F41B
B8497D67147CF46AC110A963D2916B6F
B16B11437364BFB0A4B04180D5D41036
12714516BD5558149A555A42DB16AD7BBE4A984EE982E42D
B16B11437364BFB0A4B04180D5D41036
4F1B5EC6525617E801C6DCD641320CF7
22C5168232E1EDA3D54E04848940BA93BF8C4498A8B0E8DA
4F1B5EC6525617E801C6DCD641320CF7
7FF5B64499C795DFC88BB255BA085669
A6B06A40CCF4E543AABBB2C010872F4C7707F6CD12B8BEB3
7FF5B64499C795DFC88BB255BA085669
2810EAEE559A6657E2F64C1755907BF0
A06D7C8453E29FDA82AB582E451D491B95F1BADA4728C543
2810EAEE559A6657E2F64C1755907BF0
16C80D697F24DAEB06FAD704C2427FE5
B20009AACA8B7555946355473A3993F0930B6DDE856ABAA6
16C80D697F24DAEB06FAD704C2427FE5
96F3AF8ABD1D873CE96B86F3F77FD391
8CE22A879A6220EF0290FACD872414CC7A60EB2D72156937
96F3AF8ABD1D873CE96B86F3F77FD391
A0CEEB4C4473CD4393793B03278BAEF9
A02C2299C1CBAD2DA25E1181C357D98FE919D02E559EC7CE
A0CEEB4C4473CD4393793B03278BAEF9
8789B260D37030403411724BD2CF914E
7FCE6BBBB4F17C0825D7A3E11027E9CFDD08A26587515680
8789B260D37030403411724BD2CF914E
F836CFD92B9A70CEC0D1A7E0DF749F70
E7CA304876EC9D36DDE16C383BBD99011DD905855825C9F0
F836CFD92B9A70CEC0D1A7E0DF749F70
EF1FDBDACA811FD8368723A782C1B2EB
E25D323A84C9A76032FEB7E2F13C86D92B5E2622DAE47B1B
EF1FDBDACA811FD8368723A782C1B2EB
F7B0868F55ABA5093B1FFF81579C97CD
3C1531E117A6EDBEC54E316DA49723D01041D9A38D78ECD6
F7B0868F55ABA5093B1FFF81579C97CD
4B63EB530D6A01620324CB3878162F2E
C6488A189D8FE9078E2DDA3EA9FD22B21365129BF56EC3F8
4B63EB530D6A01620324CB3878162F2E
254F88DA42669DC7E1BED4E8042A78E2
7F81CB4796C49056AB6252E4EB9BBF75F2DBC673F144BB1A
254F88DA42669DC7E1BED4E8042A78E2
E1B727C786C5EFEF032F735C2A5AE3C7
464E8A4B9B0D2BB54AD575236D5E509AF1F4B52FDB1E58DD
E1B727C786C5EFEF032F735C2A5AE3C7
FC4C44D6A1A7A7F0EA723D4F6D18F91E
A910936C8DA2972DB69931F5CCF9F76A1B868860B606A1C3
FC4C44D6A1A7A7F0EA723D4F6D18F91E
85E2E48C6B27E8429721F09324A9919F
1CBB4832C4CD6BC4337BD579A7DE1F288CA778F392AF305C
85E2E48C6B27E8429721F09324A9919F
19AD972852188BB9B99810FC9BF7764D
BDA1B3F87AC221E12AD64251F5C69491353F680F09584611
19AD972852188BB9B99810FC9BF7764D
7221D5A38987EFD0397241E17596DE5E
36EA0CCBAB6EEC0058F797F27C417B410C4D29EE7CCE984F
7221D5A38987EFD0397241E17596DE5E
F436BC9DDB2845DDA96CE3C35FDD07C8
6700D1CA116962E0ACC12B6FA7693E9CA521CA2D23139F87
F436BC9DDB2845DDA96CE3C35FDD07C8
95A85EE370EAF7C4C8CBD1DEA6B5655D
DEF00B226ED4A3B13969758CD783C9586DEA1BF385A6FADA
95A85EE370EAF7C4C8CBD1DEA6B5655D
5DB0B148709FDBF417F242FD2581378E
0F16B3C4B0F8D74764D9C4C4A71C12AC7A18590EA027CD54
5DB0B148709FDBF417F242FD2581378E
600ED43EF8563216D28662D23601D0D2
B0D8649CF07953F804D710FA5F4A20BAA89E3BDC96261D86
600ED43EF8563216D28662D23601D0D2
92D561BAF554B36C238BFD980507042C
E68EA9C65EC1F04196027140AA1E93D68B15C644932119AA
92D561BAF554B36C238BFD980507042C
313ABB07C6B53D01176A2CAE93FE55BF
3FF362931456D333A738CA476CABAED79C7FEAEA00DF4C15
313ABB07C6B53D01176A2CAE93FE55BF
39FDE320F2EE318B274713FF677AAA85
7101CDE6069924379EC529679E459F5CBB38F91567A5E690
39FDE320F2EE318B274713FF677AAA85
D72DF44F342535C94A7AB0D64C0BC9BD
D6D6F2EA3F67FD2749E8DD28AA60AA95F14249C32BAE2F2D
D72DF44F342535C94A7AB0D64C0BC9BD
8BB66AB8FE42A47D9F417BA4F2FFDBF5
D87AA158BEF1B98EC25EB79054220EE86E033267D951F4D8
8BB66AB8FE42A47D9F417BA4F2FFDBF5
DCA3E8EEBFB44A017EEFDF77A76D1516
38535B1F0EEB8ACC1EFD5F7EEB9644E910ECED107E3CE1CE
DCA3E8EEBFB44A017EEFDF77A76D1516
6D9E63BFFC053386D967141784E94616
69CBFB17F0EFAFB973633CC11793776FC98BF907FAD5A7D8
6D9E63BFFC053386D967141784E94616
71F0888723F011185E1CEC5149DC0270
7024D05245E116210293B4463463667797971556B309A5A8
71F0888723F011185E1CEC5149DC0270
D8C39637DA133DC2BBB6E5148CD510B6
2049217DAA0EA519DA502271EE705BB52C21F0423FDCB51E
D8C39637DA133DC2BBB6E5148CD510B6
6E17DD53C7C0213B1C28FCBA3DC9E732
1E729831884AF411B447FF2229B07A8E30090CF80215522C
6E17DD53C7C0213B1C28FCBA3DC9E732
B011D6DF1F9BD150F63F10DEA1621AF4
E8A64022374B9A13045629FD362BABDEC6361C26A37748D8
B011D6DF1F9BD150F63F10DEA1621AF4
06D7A7690997CE1620D55745B298AECC
BBE6E8898C5A2DF602818E943FBC65C8E6E34B6311EFE614
06D7A7690997CE1620D55745B298AECC
4BACA4FA373FD33C7232AE74EE26D3E7
E8AFB9B2C0364075492D2A6E0883B6F494D1E517FFC935F3
4BACA4FA373FD33C7232AE74EE26D3E7
962751743F3355CC3EE6CD779961F892
2425994E264ADE2BDF0A7B1A37B0E338AA37286066A8CD61
962751743F3355CC3EE6CD779961F892
0C1FFF725803A89891DCD7D497FBE43C
4B4A8638644F1C66D31584686FB34BA03BEBFFB4F153295D
0C1FFF725803A89891DCD7D497FBE43C
09DD2F8A94E9DEFB6588DCCD3FE169D2
8785B8308CE4C01FDAC8ABE2FB5A955B5E632379CEB2408F
09DD2F8A94E9DEFB6588DCCD3FE169D2
D2963B109EF08400C4DCD4DD74770D96
D47DCBCD9AC9CD93085E90F265AA115B9ABFF7A4BAC54D19
D2963B109EF08400C4DCD4DD74770D96
AF13B4CBBE74D7D801C234BA910AF2B0
40501515D7E932E6A74D2439DBDEC6839B7DC31E2BCFBFA9
AF13B4CBBE74D7D801C234BA910AF2B0
8EEBC0F7FA352115A77DC769A177E2B6
ABB131692D1CBFA529A6E4CE21EBE7963C0004778AB85D1F
8EEBC0F7FA352115A77DC769A177E2B6
CF944580E6BE1DB8708238FF80A91873
8472BAF2FF1BC51EE632A14EC755FA2E4C823C880A11456C
CF944580E6BE1DB8708238FF80A91873
C5C685AD8C7441A764A3FBB58E561233
80DA4B8CF0904FD123F424E34B21BB892821C73D8447575F
C5C685AD8C7441A764A3FBB58E561233
1E30F0CCB821FF8D23567FB2A91055E9
AB88B9D5BCE8C8673DC4D42FF30044040B77B88F2D5702B6
1E30F0CCB821FF8D23567FB2A91055E9
A2783646DB14E4F32E6EE97C4813FF47
3F4DEBFB42B175E39FBCE2692814A0F7251951F36544FDF1
A2783646DB14E4F32E6EE97C4813FF47
96459B3AF0AFFCDFFC6E47FD1CB516C5
5EFEDF01B202795709F97953D8BB5C28D977160E79F1EB34
96459B3AF0AFFCDFFC6E47FD1CB516C5
CC941F3F84C32005965539A2EBF42066
6B0C395F5AD6AD67C56D666C5C787C2D4F222FAC9205CB52
CC941F3F84C32005965539A2EBF42066
97D9B229DC1310479E12A20348D5410C
37D146192D2C069152B4D445806B6C6AD1308DAFDAD08A5E
97D9B229DC1310479E12A20348D5410C
762CC3B9AE258924D0A0D28021822665
BEDDBC12228A5A80249817FC2E4EE54E01905F2FFB52AC3B
762CC3B9AE258924D0A0D28021822665
BD1F7D617B96AB439BABC399E4B00F73
7D3B65621147072699876A9D55D84E0D9A3B9CB61FE2A348
BD1F7D617B96AB439BABC399E4B00F73
3F1231979FFAC0779D174AA5BA71D721
36D7EAE1996F2402A6955B0ACA228E7A072CD613A5937469
3F1231979FFAC0779D174AA5BA71D721
764A3ADADB308067D1B86A17003CA27D
6820EEC9A6577A02D0DF61D011120E1DD694BC04A5AFD614
764A3ADADB308067D1B86A17003CA27D
7DAD24212F4A372528B14FC2EA2B1547
749C34611C7562C4AD7245F13E583938FE25F3C64F84C353
7DAD24212F4A372528B14FC2EA2B1547
41755D43BE0F13D60760C524A7385E0E
B0931B14C6A4D1D9EC0718B280572AEEF94536E2E8BC9D5D
41755D43BE0F13D60760C524A7385E0E
78C91C2E1565B7F9D11115D7B8AC7248
F02016A6DC902D3194CE049C95329D17285423355010EF15
78C91C2E1565B7F9D11115D7B8AC7248
A964638CD4BA4B1C5CEF6BD0B5C389E8
8E6F5B682FB4BF333DAA67104188D60B74BB48E5E5D366FD
A964638CD4BA4B1C5CEF6BD0B5C389E8
CAC009F9B42C5EC49316DA79EB355CA0
D5054F53E2BCD00EF76A6EE9F5A488CFE7AD929C0EE63A5D
CAC009F9B42C5EC49316DA79EB355CA0
7437B8532BFB3F8BD298F6FBFD500989
25470C6C96F1D23F835DD6BADE5FB74435356467F3B633D4
7437B8532BFB3F8BD298F6FBFD500989
FB5D1E7FBF5FAE8C2EC94A97003071FF
091A9B282B5E7E057800C8C5610019C81BFC2EF0F386422B
FB5D1E7FBF5FAE8C2EC94A97003071FF
04C18F56D3A7C1A2D1586574D7BE01BD
2E531F9C37A125977CC14793B2A7D86ACAA44B8424384396
04C18F56D3A7C1A2D1586574D7BE01BD
78A1D8538F98C35A55BD17174820E75D
CDA6D6999472968604609FC03D3F1B309F195C936C18A4CB
78A1D8538F98C35A55BD17174820E75D
E63F8AC4155DC6E8A4DFF22E807EC31B
B0A1A4457B357AE4E25F15042862DDD83BC6AEBDEC6667D0
E63F8AC4155DC6E8A4DFF22E807EC31B
28DE7C655A069A3C2740F55B23AAD3DA
12569C294ABC574FCA816961726447E41C865BE6CFCCB40A
28DE7C655A069A3C2740F55B23AAD3DA
81ADBACE13FBB218EDB8373DFD77E32F
6B391B026D65DED94B2CD3AF619FF5FCF13E6CDB32BB5725
81ADBACE13FBB218EDB8373DFD77E32F
248901B08479738467CA9139D572BE7B
19E80ACA0BA44A986FA5D21FE5E6867896F4FDE2E7C9E95E
248901B08479738467CA9139D572BE7B
DAC6CDFAAD24005CEE423786508EF19C
A5AC2CFE957BD6E4B5631FE548C2862478B6CA64B74718C2
DAC6CDFAAD24005CEE423786508EF19C
63419C56F9C44CAE38E23DC198F34222
F92E6348F16B1FF8D62283B3B106CA8A4054F7A52FB45AE0
63419C56F9C44CAE38E23DC198F34222
81BE2598B7EB9F98B2E0914D62ECBE5C
F2466964811EABA8579CA62B06ED5512F2B466E84D58E4BC
81BE2598B7EB9F98B2E0914D62ECBE5C
4B4893271EF63320A8889785A7678181
8126F51BDCE505A81CD4350C181B66325A3CF16DEA3F653D
4B4893271EF63320A8889785A7678181
18873B8BAE9E3DBC199104C4D12C32C5
01331F1BB326619704530E87B6855B8E43ADF5A93B1357F8
18873B8BAE9E3DBC199104C4D12C32C5
19E44E3830DECF235D1DBDE381553B8E
1976F9CF1A1604751DB740BF865B94AD1EB0484ABA466C76
19E44E3830DECF235D1DBDE381553B8E
864632CAE75406B9A299B671700853A5
20862A9373CB60339BF17275610F9214BC29FE3BCA4E3FD3
864632CAE75406B9A299B671700853A5
3AF5C4EF729D702C5C50A0A773793CB8
/trunk/test_vectors/twofish_ecb_vk_testvalues_128bits.txt
0,0 → 1,256
80000000000000000000000000000000
6BFD32804A1C3206C4BF85EB11241F89
40000000000000000000000000000000
F097147AE851845984DC97D5FAE40CF9
20000000000000000000000000000000
6117F1977C5ABD9647C56544D9458444
10000000000000000000000000000000
75A6240AAE357DEDDF99936705618284
08000000000000000000000000000000
F026BFDF6BFBC7E50C46C533BD271C24
04000000000000000000000000000000
F3023228D77045D37D1B9CD77437395A
02000000000000000000000000000000
F67467BF6B490209809714D50679B2D7
01000000000000000000000000000000
2C8431B922C5F560095E9867B1A41256
00800000000000000000000000000000
1FB76E90D207BA4C770F67284D6B1359
00400000000000000000000000000000
A70AECE1D41DCA9F24BCE8393F6D54BF
00200000000000000000000000000000
D4580FC395979689221C57A23598358B
00100000000000000000000000000000
35CA62BA8126F015FABFEF8F9119AE6B
00080000000000000000000000000000
C81FACB16E087EEFA823CF34E02FE482
00040000000000000000000000000000
07400F04E4CC6625AE3FB41ECC863F2A
00020000000000000000000000000000
A0941008068D401DEAB6400C86CA53AD
00010000000000000000000000000000
2B63BEF50BA87A58BFFCA4CF44C22927
00008000000000000000000000000000
FD49069AE9F1874A264A7BFD894ED886
00004000000000000000000000000000
232755C754075BB5CC5B85ABFEA38779
00002000000000000000000000000000
41358B9C76E959037E13F7E5050E0B42
00001000000000000000000000000000
8978CD09C054BB1ABDFFBED09D1CF7EC
00000800000000000000000000000000
9F2A7CE5FD51FD5D7E2D42407EEF8F6A
00000400000000000000000000000000
6AA2F0627F312A77C68D1F15DF0E1379
00000200000000000000000000000000
BCD56984E45DBF087BAC8757FC4EFF5A
00000100000000000000000000000000
9D3C6C8ED48C9DE7A64CD05D8BF41D54
00000080000000000000000000000000
FCD577A23F455ACDE3732C262EBD2D86
00000040000000000000000000000000
022E2430D81858888C9E575411D4064F
00000020000000000000000000000000
5742CA8CF1193491C1FBC148627D856E
00000010000000000000000000000000
88BD93610040DFE248C2FE05EF9F4FE0
00000008000000000000000000000000
29A9D577BB3824209FEA64128247CE6C
00000004000000000000000000000000
AC4CDB534844EA86000B845FCDAD605F
00000002000000000000000000000000
AAC6098597D46B8145A60F40D4EC5308
00000001000000000000000000000000
3A7DFD0855A5BE0B16CACBD685FACEF5
00000000800000000000000000000000
ACEBA627EBA87AD051C3E0CA0DEF6CD7
00000000400000000000000000000000
F0A55DCDBC513EFDD603EA455EB9228C
00000000200000000000000000000000
2176DEBC78D6B4A6D0FB37AFA6B51081
00000000100000000000000000000000
FDB1B57379B85A85392613E8B4597B63
00000000080000000000000000000000
58AB1112E0598586E07FC8359DDFC7EC
00000000040000000000000000000000
DD6D1D2629F333528CB66869453BC273
00000000020000000000000000000000
932218D99553BB2D4BFC69F1EA67CAAE
00000000010000000000000000000000
399D066426F7FEF66F8983086DC044D8
00000000008000000000000000000000
3E1BC58269B6B8C8C8D00806975F8337
00000000004000000000000000000000
D50A1F966058C6D702D1AFCD700DA0E8
00000000002000000000000000000000
6E7A6BB3554F12AD1F88C289D621CD0F
00000000001000000000000000000000
9ED4EA506A0CBA89B246C14D1B5B96A9
00000000000800000000000000000000
C395A92C1A6884857B263F01F43542DB
00000000000400000000000000000000
06562AC497C60F802B68B47DB5B86B6A
00000000000200000000000000000000
255A726F2106177FEFA7006BDE05D059
00000000000100000000000000000000
B8FD6A8227D0565A4C174AD270EC1205
00000000000080000000000000000000
C2652FDB48B9DDBFC43B3F7CDD831D6F
00000000000040000000000000000000
913EB9205DB2E17A96A23A724EDF4C84
00000000000020000000000000000000
9A6694FEB5EA44FF0572124FDB265658
00000000000010000000000000000000
E347498DECA6B211C30E21FD0B47A333
00000000000008000000000000000000
E70F0D4ED829A81E05D42E511EDE9376
00000000000004000000000000000000
140BB7CAD8D6A3553BEF7A3D52347BD8
00000000000002000000000000000000
5FA55360F440DCCA20925A3E15B42764
00000000000001000000000000000000
6D5B969DFC3EA0A6682CC66488D221DA
00000000000000800000000000000000
E2799D5C380B49D2F6997009079D03D3
00000000000000400000000000000000
06AFBD8077909E847AF467BB2D47E893
00000000000000200000000000000000
46B1EB96EC9EB10897F1562E59287253
00000000000000100000000000000000
1793F1D4E1A1606F99C7019C19E85129
00000000000000080000000000000000
ED785D0BA19553CE73B69F4D570C3A9D
00000000000000040000000000000000
298DF7334670B7391BE203DF7E8890C7
00000000000000020000000000000000
150C12DEF6EDC844B0B45361C2B3AECE
00000000000000010000000000000000
06FFB5E13438BA8DBD8A3EDADFAC73A1
00000000000000008000000000000000
6C5E5719D5F31E929FF9C44F086EFADB
00000000000000004000000000000000
4C8D0E13996F4D32CB7984B7BB1B34FB
00000000000000002000000000000000
C9BDCFFD4B9F3BBBB33A2D2C51BA83F6
00000000000000001000000000000000
929B29DD0D952161FFDA8CB417B166EC
00000000000000000800000000000000
87F9DFCB07275916E7A446D3DCE74232
00000000000000000400000000000000
6FDFD0BC8F49BE420CD68A894C7CA4E9
00000000000000000200000000000000
CDDC09DE42DC2CBCD9287A2072A30D23
00000000000000000100000000000000
9B2FF668BA9D77AD1E9F30BA0173EBD4
00000000000000000080000000000000
DEF29890D59A511B32A30322D7471E38
00000000000000000040000000000000
5094EAEC9F23D0DBFAB8240A42ED5BF1
00000000000000000020000000000000
79CB87BC375F58DE8DA780B9BAD3DEA3
00000000000000000010000000000000
7139B3D980B85D3B77A3BBDB6CB79756
00000000000000000008000000000000
148ED6E8FEC02168377C96956AE18D93
00000000000000000004000000000000
0AFED5A710F2BF11C77F152951AE32CB
00000000000000000002000000000000
C265AC354817550FAE12A51C2DCD749C
00000000000000000001000000000000
A3B089F79D0A07EA0893BB48D508B35B
00000000000000000000800000000000
C0A7B6BCE0675A48E95D39A7659CB20A
00000000000000000000400000000000
6CE0A0BA02041CB5E6C0A46DE1B71A43
00000000000000000000200000000000
E54045C33A386555C5754ADB0A181244
00000000000000000000100000000000
BB652196955BB7BE7E8CB8E2E992A750
00000000000000000000080000000000
594B2917DE6119B62BE3DDF10A1A47E0
00000000000000000000040000000000
E8B4F95053617F6A10120DB196AAC4D1
00000000000000000000020000000000
79646B1CC19708973215B9891A2C1019
00000000000000000000010000000000
5E7E6175F6B548E5389C1B1C391CBEE2
00000000000000000000008000000000
C0860A7B47544872B9DB5C220088DE5C
00000000000000000000004000000000
325163F073E5A27EBAF339B1FA53682D
00000000000000000000002000000000
1A0C4583CEFF5810F3AB42A471415A1D
00000000000000000000001000000000
F8DDF239D19363957C7C8C9B537893FA
00000000000000000000000800000000
D3B9999669509564741F236EEF2401F3
00000000000000000000000400000000
3376DA406D82B76591B610C6C9FC3F9E
00000000000000000000000200000000
B6AD728D2970637642723FF06204EEAD
00000000000000000000000100000000
0ADF4A82FFE602BC13002AA8AB24EA71
00000000000000000000000080000000
D80D1378E30036D92B4A359F68D0CBFE
00000000000000000000000040000000
EDA13B315897290E4ACEB4B513E9749B
00000000000000000000000020000000
34589936B79E4F43260DC6CCD1820D6D
00000000000000000000000010000000
C7A8FF65CD38D008EC6745897E010122
00000000000000000000000008000000
3AFE23D89E79E9F8A54F103ED51EB14D
00000000000000000000000004000000
27994D1AA909806C7CC8E4AC4CD5479B
00000000000000000000000002000000
610D5528725B34FD70ADC66E83BAE266
00000000000000000000000001000000
3A3064DFF6E0B54D864E81FA76270065
00000000000000000000000000800000
5E9B5966ED3A2358005C9773F8690AD9
00000000000000000000000000400000
713738F580CED6E358D2CDCEDA64F99F
00000000000000000000000000200000
EC7FE3578906291B2DCF0AD7FF8B5358
00000000000000000000000000100000
0F714C096C244BED865A9E064576FE5D
00000000000000000000000000080000
B7C226C60B6F3031A1E2160823A62679
00000000000000000000000000040000
5C78C4BC8F15DC964FE9EC75203AD7D8
00000000000000000000000000020000
178FB7443FBD17DCF1AF122D4D117239
00000000000000000000000000010000
C55C99851BD135155A080A9C4E54B919
00000000000000000000000000008000
AD75C80D72EA278B3EDE380DAAB1F708
00000000000000000000000000004000
95054D1ECA74F75515AE8C17941D3A54
00000000000000000000000000002000
8E0B0D4F95C9C9D65420B4B1869A1D3E
00000000000000000000000000001000
7712EA2F0598CC8CFB9A934DEC848B5F
00000000000000000000000000000800
9D730E0F7450183C0804D6817CBE058E
00000000000000000000000000000400
3FA52E9B242F9AF61322FBB6BA583A01
00000000000000000000000000000200
3D47D74F667D60458188922EE8D8A7A0
00000000000000000000000000000100
036B4E4E02D84C56AC61007DAC33EC33
00000000000000000000000000000080
4E171141E51234DE6E4B236643A6DC85
00000000000000000000000000000040
DB720E7B04462829DFA258ED9E7C7F2F
00000000000000000000000000000020
8B10E11115FF4336DE57F2EA13AABBFA
00000000000000000000000000000010
F0E35BFF226C064E08368AF440298DB9
00000000000000000000000000000008
6C4C8811B4DF74F2A7D7F79A6253CEA7
00000000000000000000000000000004
7DD12AD3BC7A419F92753D8CC39637F0
00000000000000000000000000000002
A465B01EA32B2F4F87C85FD06F9B0A02
00000000000000000000000000000001
8DC902DDAE09F52B1A3A77EE89C1441E
/trunk/test_vectors/twofish_ecb_tbl_testvalues_128bits.txt
0,0 → 1,147
00000000000000000000000000000000
00000000000000000000000000000000
9F589F5CF6122C32B6BFEC2F2AE8C35A
00000000000000000000000000000000
9F589F5CF6122C32B6BFEC2F2AE8C35A
D491DB16E7B1C39E86CB086B789F5419
9F589F5CF6122C32B6BFEC2F2AE8C35A
D491DB16E7B1C39E86CB086B789F5419
019F9809DE1711858FAAC3A3BA20FBC3
D491DB16E7B1C39E86CB086B789F5419
019F9809DE1711858FAAC3A3BA20FBC3
6363977DE839486297E661C6C9D668EB
019F9809DE1711858FAAC3A3BA20FBC3
6363977DE839486297E661C6C9D668EB
816D5BD0FAE35342BF2A7412C246F752
6363977DE839486297E661C6C9D668EB
816D5BD0FAE35342BF2A7412C246F752
5449ECA008FF5921155F598AF4CED4D0
816D5BD0FAE35342BF2A7412C246F752
5449ECA008FF5921155F598AF4CED4D0
6600522E97AEB3094ED5F92AFCBCDD10
5449ECA008FF5921155F598AF4CED4D0
6600522E97AEB3094ED5F92AFCBCDD10
34C8A5FB2D3D08A170D120AC6D26DBFA
6600522E97AEB3094ED5F92AFCBCDD10
34C8A5FB2D3D08A170D120AC6D26DBFA
28530B358C1B42EF277DE6D4407FC591
34C8A5FB2D3D08A170D120AC6D26DBFA
28530B358C1B42EF277DE6D4407FC591
8A8AB983310ED78C8C0ECDE030B8DCA4
28530B358C1B42EF277DE6D4407FC591
8A8AB983310ED78C8C0ECDE030B8DCA4
48C758A6DFC1DD8B259FA165E1CE2B3C
8A8AB983310ED78C8C0ECDE030B8DCA4
48C758A6DFC1DD8B259FA165E1CE2B3C
CE73C65C101680BBC251C5C16ABCF214
48C758A6DFC1DD8B259FA165E1CE2B3C
CE73C65C101680BBC251C5C16ABCF214
C7ABD74AA060F78B244E24C71342BA89
CE73C65C101680BBC251C5C16ABCF214
C7ABD74AA060F78B244E24C71342BA89
D0F8B3B6409EBCB666D29C916565ABFC
C7ABD74AA060F78B244E24C71342BA89
D0F8B3B6409EBCB666D29C916565ABFC
DD42662908070054544FE09DA4263130
D0F8B3B6409EBCB666D29C916565ABFC
DD42662908070054544FE09DA4263130
7007BACB42F7BF989CF30F78BC50EDCA
DD42662908070054544FE09DA4263130
7007BACB42F7BF989CF30F78BC50EDCA
57B9A18EE97D90F435A16F69F0AC6F16
7007BACB42F7BF989CF30F78BC50EDCA
57B9A18EE97D90F435A16F69F0AC6F16
06181F0D53267ABD8F3BB28455B198AD
57B9A18EE97D90F435A16F69F0AC6F16
06181F0D53267ABD8F3BB28455B198AD
81A12D8449E9040BAAE7196338D8C8F2
06181F0D53267ABD8F3BB28455B198AD
81A12D8449E9040BAAE7196338D8C8F2
BE422651C56F2622DA0201815A95A820
81A12D8449E9040BAAE7196338D8C8F2
BE422651C56F2622DA0201815A95A820
113B19F2D778473990480CEE4DA238D1
BE422651C56F2622DA0201815A95A820
113B19F2D778473990480CEE4DA238D1
E6942E9A86E544CF3E3364F20BE011DF
113B19F2D778473990480CEE4DA238D1
E6942E9A86E544CF3E3364F20BE011DF
87CDC6AA487BFD0EA70188257D9B3859
E6942E9A86E544CF3E3364F20BE011DF
87CDC6AA487BFD0EA70188257D9B3859
D5E2701253DD75A11A4CFB243714BD14
87CDC6AA487BFD0EA70188257D9B3859
D5E2701253DD75A11A4CFB243714BD14
FD24812EEA107A9E6FAB8EABE0F0F48C
D5E2701253DD75A11A4CFB243714BD14
FD24812EEA107A9E6FAB8EABE0F0F48C
DAFA84E31A297F372C3A807100CD783D
FD24812EEA107A9E6FAB8EABE0F0F48C
DAFA84E31A297F372C3A807100CD783D
A55ED2D955EC8950FC0CC93B76ACBF91
DAFA84E31A297F372C3A807100CD783D
A55ED2D955EC8950FC0CC93B76ACBF91
2ABEA2A4BF27ABDC6B6F278993264744
A55ED2D955EC8950FC0CC93B76ACBF91
2ABEA2A4BF27ABDC6B6F278993264744
045383E219321D5A4435C0E491E7DE10
2ABEA2A4BF27ABDC6B6F278993264744
045383E219321D5A4435C0E491E7DE10
7460A4CD4F312F32B1C7A94FA004E934
045383E219321D5A4435C0E491E7DE10
7460A4CD4F312F32B1C7A94FA004E934
6BBF9186D32C2C5895649D746566050A
7460A4CD4F312F32B1C7A94FA004E934
6BBF9186D32C2C5895649D746566050A
CDBDD19ACF40B8AC0328C80054266068
6BBF9186D32C2C5895649D746566050A
CDBDD19ACF40B8AC0328C80054266068
1D2836CAE4223EAB5066867A71B1A1C3
CDBDD19ACF40B8AC0328C80054266068
1D2836CAE4223EAB5066867A71B1A1C3
2D7F37121D0D2416D5E2767FF202061B
1D2836CAE4223EAB5066867A71B1A1C3
2D7F37121D0D2416D5E2767FF202061B
D70736D1ABC7427A121CC816CD66D7FF
2D7F37121D0D2416D5E2767FF202061B
D70736D1ABC7427A121CC816CD66D7FF
AC6CA71CBCBEDCC0EA849FB2E9377865
D70736D1ABC7427A121CC816CD66D7FF
AC6CA71CBCBEDCC0EA849FB2E9377865
307265FF145CBBC7104B3E51C6C1D6B4
AC6CA71CBCBEDCC0EA849FB2E9377865
307265FF145CBBC7104B3E51C6C1D6B4
934B7DB4B3544854DBCA81C4C5DE4EB1
307265FF145CBBC7104B3E51C6C1D6B4
934B7DB4B3544854DBCA81C4C5DE4EB1
18759824AD9823D5961F84377D7EAEBF
934B7DB4B3544854DBCA81C4C5DE4EB1
18759824AD9823D5961F84377D7EAEBF
DEDDAC6029B01574D9BABB099DC6CA6C
18759824AD9823D5961F84377D7EAEBF
DEDDAC6029B01574D9BABB099DC6CA6C
5EA82EEA2244DED42CCA2F835D5615DF
DEDDAC6029B01574D9BABB099DC6CA6C
5EA82EEA2244DED42CCA2F835D5615DF
1E3853F7FFA57091771DD8CDEE9414DE
5EA82EEA2244DED42CCA2F835D5615DF
1E3853F7FFA57091771DD8CDEE9414DE
5C2EBBF75D31F30B5EA26EAC8782D8D1
1E3853F7FFA57091771DD8CDEE9414DE
5C2EBBF75D31F30B5EA26EAC8782D8D1
3A3CFA1F13A136C94D76E5FA4A1109FF
5C2EBBF75D31F30B5EA26EAC8782D8D1
3A3CFA1F13A136C94D76E5FA4A1109FF
91630CF96003B8032E695797E313A553
3A3CFA1F13A136C94D76E5FA4A1109FF
91630CF96003B8032E695797E313A553
137A24CA47CD12BE818DF4D2F4355960
91630CF96003B8032E695797E313A553
137A24CA47CD12BE818DF4D2F4355960
BCA724A54533C6987E14AA827952F921
137A24CA47CD12BE818DF4D2F4355960
BCA724A54533C6987E14AA827952F921
6B459286F3FFD28D49F15B1581B08E42
BCA724A54533C6987E14AA827952F921
6B459286F3FFD28D49F15B1581B08E42
5D9D4EEFFA9151575524F115815A12E0
/trunk/test_vectors/twofish_ecb_vk_testvalues_192bits.txt
0,0 → 1,384
800000000000000000000000000000000000000000000000
B5AED133641004F4121B66E7DB8F2FF0
400000000000000000000000000000000000000000000000
998110F200555A32C6C123E66CF87DE9
200000000000000000000000000000000000000000000000
2DBAEEEC682DCC957C2D51B0990E123A
100000000000000000000000000000000000000000000000
BAEC0A31F6557D6D13B888A94F63058C
080000000000000000000000000000000000000000000000
E51ADC9773E785730586E6812A0F0FA5
040000000000000000000000000000000000000000000000
97067E60FE010AEEA48C0D3224AD0941
020000000000000000000000000000000000000000000000
BB73A7C859E6377A5E42EFCD55CD2C5B
010000000000000000000000000000000000000000000000
914BFE25D7FDEE49B46FB5C2B60DACA5
008000000000000000000000000000000000000000000000
EFEF0047892A043A1D594118477CA513
004000000000000000000000000000000000000000000000
BE59CF7C4E4B482843E67B4EB65B3038
002000000000000000000000000000000000000000000000
35FFC8038CB124B8078EC5C7C7928F14
001000000000000000000000000000000000000000000000
086025FC1CC6056367304C51DE871DEA
000800000000000000000000000000000000000000000000
950F0B7BDFFC78AE3AFF022F78E1670E
000400000000000000000000000000000000000000000000
CADF4568B43C950FB688C6608AAF5FAE
000200000000000000000000000000000000000000000000
E2313E3CFCB5E745EBAB983BF2867579
000100000000000000000000000000000000000000000000
B4394412F7B4A1A4A22B73C93BAFD85D
000080000000000000000000000000000000000000000000
C014C9A992E6366B3BD2EABDF1508187
000040000000000000000000000000000000000000000000
4344D702AC78A5808F4AB566D5509B75
000020000000000000000000000000000000000000000000
937893DA40E9D7F2ECE9028FAA4DE6A4
000010000000000000000000000000000000000000000000
E77874759C6AACB611B715A52A37234A
000008000000000000000000000000000000000000000000
841FC7FC0EF6CE08CFC6056B3C557F23
000004000000000000000000000000000000000000000000
6AC04A6988F1CE601E4C48241D42C1CF
000002000000000000000000000000000000000000000000
5254F42B5DD207461693C278B6ABC855
000001000000000000000000000000000000000000000000
F58B1AE230B417541649CB035FB5231C
000000800000000000000000000000000000000000000000
5F015060D28C6CCB2E5FDCB5AFDCF309
000000400000000000000000000000000000000000000000
B0DBAA257FEFFE48A688FE247D0460B7
000000200000000000000000000000000000000000000000
1235DF200338F96E39E881484B6B11EE
000000100000000000000000000000000000000000000000
671D87102E35609B32F40A91A7E29E04
000000080000000000000000000000000000000000000000
F01FB3FA3E84DEA6057F3D88CD651876
000000040000000000000000000000000000000000000000
B96C1E40D0D407ED90D11892503A296F
000000020000000000000000000000000000000000000000
2E27350191DE6C2E9DCC51022A3C96CB
000000010000000000000000000000000000000000000000
BDD6CFE5D00E7F8D698143E653A0163B
000000008000000000000000000000000000000000000000
FEDABEF20F51910E57CF5ECEF878A8E1
000000004000000000000000000000000000000000000000
EEBF9FE247A78C6FF2A91428C54D70DA
000000002000000000000000000000000000000000000000
41714E55E90E0E154802FBBFC0BF58C5
000000001000000000000000000000000000000000000000
69480F26BC5DFF8F6D8A0F10E0959BF1
000000000800000000000000000000000000000000000000
A39E4BE5A7E13BA3C48CFD98A52CFA70
000000000400000000000000000000000000000000000000
95809A16888FB49F5053375A6533CD58
000000000200000000000000000000000000000000000000
5F0DEF37FB14F956BB31703F1FC968EB
000000000100000000000000000000000000000000000000
CF0A28C9598D7BBCA6992238B03EF4EB
000000000080000000000000000000000000000000000000
7FF241BA32E6878542978957F137856F
000000000040000000000000000000000000000000000000
8D489E0496B54F91A0254E4103804145
000000000020000000000000000000000000000000000000
9925949BE93F4A0BF4114CCA2E05B566
000000000010000000000000000000000000000000000000
6ED9A5F014FAFAE3D05C4AE027066873
000000000008000000000000000000000000000000000000
958453307A371EE2D3DA8DD327D9B51B
000000000004000000000000000000000000000000000000
1EE0680BF9A798A1C63636EA917B17B5
000000000002000000000000000000000000000000000000
C0CEFB2475B21AA8937E3048604D9928
000000000001000000000000000000000000000000000000
9034DDEFF43C9CC82FADE8DE0A2476BB
000000000000800000000000000000000000000000000000
09D32779D0C8D02E0670F377187756FC
000000000000400000000000000000000000000000000000
6557BDB19F03E62D823C0613BEA0FAFB
000000000000200000000000000000000000000000000000
83505664DED694967F2D9E7853BC4B43
000000000000100000000000000000000000000000000000
0BBABE3B7F381C3B3D8A9D846D8CCEAC
000000000000080000000000000000000000000000000000
E3AA0A67CDF79DBAB013103E39E8C822
000000000000040000000000000000000000000000000000
AF3D0C9B673C322355480E8681237D13
000000000000020000000000000000000000000000000000
60D325226EC8DFB9E08DFADB479649A0
000000000000010000000000000000000000000000000000
845B92A3C56880E8007B452B57B73B75
000000000000008000000000000000000000000000000000
76C59CD9185C518D65EC641EB73C6387
000000000000004000000000000000000000000000000000
735567D0B8A52203492220804F3D62E6
000000000000002000000000000000000000000000000000
E74FB07622191A053368131DA36FC299
000000000000001000000000000000000000000000000000
3CFF40E0E9A86F67D938D2483BDD08F0
000000000000000800000000000000000000000000000000
7C502AE730F5A9ABEACB15240EA1E8F6
000000000000000400000000000000000000000000000000
0B3CA10C02E24BA82261E65BE4413512
000000000000000200000000000000000000000000000000
F7D50E95931755A98B143AE254090F9D
000000000000000100000000000000000000000000000000
A4E84B8A7B8CC3766307D66A9C6AECB9
000000000000000080000000000000000000000000000000
5298367E93E9B9CB5CF402A8BA9EFC62
000000000000000040000000000000000000000000000000
03D44830C40510CE7866FB86FAC6E1DC
000000000000000020000000000000000000000000000000
978E4BA4EEA6739B1769FF4389F0367E
000000000000000010000000000000000000000000000000
707EF1166D2F11FD1519B37FB00D23EB
000000000000000008000000000000000000000000000000
435088DBDD8646A7FCA8851CA2FA1FB5
000000000000000004000000000000000000000000000000
F3DC32DD6931A302391F9B992A5B6122
000000000000000002000000000000000000000000000000
D93286DD8A05432614FD03169F36ED15
000000000000000001000000000000000000000000000000
59F83FEA4BC9B24BF69A98CA3959CEFC
000000000000000000800000000000000000000000000000
A689BC3A8DB36A22763E911370C9DE2B
000000000000000000400000000000000000000000000000
04EB5BA604BA64DD112BCAE830C27966
000000000000000000200000000000000000000000000000
7EF653E2D804E80BD678C3A6CB222625
000000000000000000100000000000000000000000000000
A94EC287E7F70C6503DC0B891920C622
000000000000000000080000000000000000000000000000
8A78497E9D18A365599444C972359F0D
000000000000000000040000000000000000000000000000
2F1832E285C8D24F226B50CCD71FE46A
000000000000000000020000000000000000000000000000
0B6675F4BD4BD6951BB96AF62D3C9B96
000000000000000000010000000000000000000000000000
D6DEDAAAECE52984A261155ED7AF5290
000000000000000000008000000000000000000000000000
7600A0FCF96F24A21419103466B937B5
000000000000000000004000000000000000000000000000
C3E359420C4C4AF445C470AB347B3667
000000000000000000002000000000000000000000000000
D915133DAA11BECB43E020266B709BEC
000000000000000000001000000000000000000000000000
A0001FC4E31664ED8C375644D02717AE
000000000000000000000800000000000000000000000000
D8E96A3F240666FC02F31E84CD1CEEF1
000000000000000000000400000000000000000000000000
DE0B6B80C40ED4447E36A84A62EB235D
000000000000000000000200000000000000000000000000
8B15F04C34FC0F35F96C86837665CB38
000000000000000000000100000000000000000000000000
02DAE104DA462934D87FDC73EB4011A9
000000000000000000000080000000000000000000000000
B1ECC134EB7221CE00EBB977E08020E2
000000000000000000000040000000000000000000000000
9F13CC1BF91C1B49AB6DDD7AF7A05ABA
000000000000000000000020000000000000000000000000
414D1178475679525B5EE7ED373E2A0A
000000000000000000000010000000000000000000000000
E69F2CC70EF18DBD360DFDD5C6573EBD
000000000000000000000008000000000000000000000000
FA45D9E00E4C221A14C359742AC25C35
000000000000000000000004000000000000000000000000
BC2AC98007820862150CC1B1E3E11ED1
000000000000000000000002000000000000000000000000
C7CABAB4D7DFFD44C5943EB8E9441C3D
000000000000000000000001000000000000000000000000
6DA6716020FDE292E8ADFB2A31BC6B24
000000000000000000000000800000000000000000000000
9516AE03F102950795E1869E07BE0AFB
000000000000000000000000400000000000000000000000
4748E60F70C6172E5D5B0C21E67F366C
000000000000000000000000200000000000000000000000
40C7CC6385BB634FB68F73CCB5C446C2
000000000000000000000000100000000000000000000000
7F0CE574F643711ECFC5011C0BCCD49A
000000000000000000000000080000000000000000000000
2628849CC2C62FEB305A1287F24B9693
000000000000000000000000040000000000000000000000
6E8C11B5EA12D40CE9F83693314BD836
000000000000000000000000020000000000000000000000
503FCDFCCB2AEBEEE6FB59326D06745E
000000000000000000000000010000000000000000000000
69698FE789F29872F0A4116CD8714255
000000000000000000000000008000000000000000000000
3072C09636828285E7135E92B04C3601
000000000000000000000000004000000000000000000000
00C19303036D6D3227B9C7AF806BEBDD
000000000000000000000000002000000000000000000000
E6B06BC172CA8892C8A04D6717AB08CE
000000000000000000000000001000000000000000000000
F7F08E268646EF8B9D728D422195A88B
000000000000000000000000000800000000000000000000
E6C0BEE988E017E708FF1A1DCFE38FC8
000000000000000000000000000400000000000000000000
33D0841FC04A6394056AC82D68DBFA02
000000000000000000000000000200000000000000000000
066AF29F6138FE67D676925DBC375ED1
000000000000000000000000000100000000000000000000
60E1109A80F56DBCBCAC75AF9EE3A982
000000000000000000000000000080000000000000000000
84E692562A2DBE9452CDC7F5F7DCD4E6
000000000000000000000000000040000000000000000000
DA5C0CB7DE7C2A9DEFC76348955FB51B
000000000000000000000000000020000000000000000000
26AC1CB6870A598585E211852F9C980A
000000000000000000000000000010000000000000000000
49776D30C4A10352FF0FBA170F09F275
000000000000000000000000000008000000000000000000
D02E72C408A05C89F80C9EC450419FBF
000000000000000000000000000004000000000000000000
993D122B38640477385BBFC79177C212
000000000000000000000000000002000000000000000000
1482C5D53BE2F16634C22B9294D6E10B
000000000000000000000000000001000000000000000000
4B9518E3188D68E20266DCAA5B26337F
000000000000000000000000000000800000000000000000
7D6C9C9F375EDDE4A23D83B8B62E198F
000000000000000000000000000000400000000000000000
FCCE30A6961099AD269080FF07A24E1E
000000000000000000000000000000200000000000000000
C822629D39268498E02E6E4D642E7921
000000000000000000000000000000100000000000000000
B96890D4CC0BD3C41A14D0547F98E077
000000000000000000000000000000080000000000000000
78665BAC269A5DB3FFE165526A42F688
000000000000000000000000000000040000000000000000
5EB1E7293616CD444011950212E53E78
000000000000000000000000000000020000000000000000
FD682F200B2D5D17D177E785EBCE6C08
000000000000000000000000000000010000000000000000
EAAEEA26A8AE037C288DDA6791580418
000000000000000000000000000000008000000000000000
AA525000B28A88169212096B6D5FF58D
000000000000000000000000000000004000000000000000
09C8F1F28B94167498D9377CB9909458
000000000000000000000000000000002000000000000000
847E4FFAD40194940A0F7FA0E34739B4
000000000000000000000000000000001000000000000000
50DCE06E775C1A6DDA24B2A926C9EF8E
000000000000000000000000000000000800000000000000
3896FB03AF06F69CFDDDFBFCDF8E10A7
000000000000000000000000000000000400000000000000
FED04C2F49DB4BE1D7BC5E187FB1612B
000000000000000000000000000000000200000000000000
69E749DFCA9AC8A990444E9FFB6CBA09
000000000000000000000000000000000100000000000000
9B2262EBF59AB552E04D57A72FE6F013
000000000000000000000000000000000080000000000000
8FF0BF7F0088916764CF9FF21E1BDA67
000000000000000000000000000000000040000000000000
5DE1FF41440B4CA0EEF22C8C3F96F23F
000000000000000000000000000000000020000000000000
FEBE3209C8D61E85024DEF2122AF0268
000000000000000000000000000000000010000000000000
DB63B702C6E39A283B64B90F36FBD426
000000000000000000000000000000000008000000000000
BB364F05F769FFBFE18288BD782D20EB
000000000000000000000000000000000004000000000000
8A929CBDE0CD9A9545A08DA2D16BA838
000000000000000000000000000000000002000000000000
C5AE232EB4F293497E79E20E436B5A4C
000000000000000000000000000000000001000000000000
3979A57AB9EB520E1475D745F897A9A9
000000000000000000000000000000000000800000000000
469B440BBD0711C31B9AAA2564ECB68A
000000000000000000000000000000000000400000000000
260AC31933A32B75C13364E868FD84DB
000000000000000000000000000000000000200000000000
D5A76D2E0D00BE53B401ACB0EE70F8FB
000000000000000000000000000000000000100000000000
C3475809C89275DE82F9F22D59A3DA37
000000000000000000000000000000000000080000000000
C9B8FBFBF1A120BF47D0F2F48DD23661
000000000000000000000000000000000000040000000000
C662358CCCD46730D243DEE03B871DC3
000000000000000000000000000000000000020000000000
F5BA874DAE43AD835B3F1344653411B6
000000000000000000000000000000000000010000000000
F0185396A6A69D48BBEADFE5B644EED4
000000000000000000000000000000000000008000000000
DA0DEC6F13B5AEFC056F5D040C5DA310
000000000000000000000000000000000000004000000000
7E1DBDE7B45F9C3E01A285EA575AD5ED
000000000000000000000000000000000000002000000000
7A814893FBF78A6F5345F4E250DA454C
000000000000000000000000000000000000001000000000
8C8B9E24399A6DF8293B0117307D6084
000000000000000000000000000000000000000800000000
11BB87A542E9135ECEB6143A07E0B65E
000000000000000000000000000000000000000400000000
495A92DB6E242E0A878EB4AC4C886802
000000000000000000000000000000000000000200000000
97A5A7E3DAB800B3D4E7D468B4CCB951
000000000000000000000000000000000000000100000000
C74D778D3F0440EB91981C23CC4F5669
000000000000000000000000000000000000000080000000
1B485B0E4A063B844BC2AE8B722D0757
000000000000000000000000000000000000000040000000
BF9D54F977A978797A4268CFC84132C4
000000000000000000000000000000000000000020000000
90C50CB6D84B6A74F3D64A419B0419EA
000000000000000000000000000000000000000010000000
776EED1A9849173A7AC46E94C9B2681B
000000000000000000000000000000000000000008000000
A42F612CBF53529173E148ABA2B55D63
000000000000000000000000000000000000000004000000
6F8B5F268B3DBEA72BF0D1F92B13684E
000000000000000000000000000000000000000002000000
9379DA858CEC7AC58856E7DBF79C4757
000000000000000000000000000000000000000001000000
17FE109D4638A9E1FAF130D621C160CB
000000000000000000000000000000000000000000800000
2BCFAD82613FFD8D9BCBC539C1158BC9
000000000000000000000000000000000000000000400000
8EA212BFBBF476CE35939066A7F1757D
000000000000000000000000000000000000000000200000
1BFAC7B1B8EB14C26ADA2055E0C9CD36
000000000000000000000000000000000000000000100000
9FCA8C1340C47C586D6A2FAD9FAA6833
000000000000000000000000000000000000000000080000
D22D10708CBA6566DC096B8ABE3F9679
000000000000000000000000000000000000000000040000
1FFC5754FC94465A073B714267DEC18C
000000000000000000000000000000000000000000020000
FDED0173236B23DF4DFC1953355AA78E
000000000000000000000000000000000000000000010000
FBE9178C4B27E51E24BF17053724AA2F
000000000000000000000000000000000000000000008000
F02818D3D58D1F3345594670D3009DF4
000000000000000000000000000000000000000000004000
6E148020BAB1DD04492299F6A9D9BA22
000000000000000000000000000000000000000000002000
8E045AE3022AF7562106681B2B8CB70E
000000000000000000000000000000000000000000001000
2C73832593114BF299424E30C5848625
000000000000000000000000000000000000000000000800
127FC7BCF85F44F5041158A5EB3D040C
000000000000000000000000000000000000000000000400
B25FABDA9D6E6704F23F33B0D907B762
000000000000000000000000000000000000000000000200
21B968BF3EFFC638F54BC1524D8D378F
000000000000000000000000000000000000000000000100
18F3BEB5D5A6B6AC512752AAA65EA3BD
000000000000000000000000000000000000000000000080
5588729059256CE49AF2DA14EE4C9D00
000000000000000000000000000000000000000000000040
A6EBD68D0A6F46DA22CD17D4B55BC4FE
000000000000000000000000000000000000000000000020
50434829C09BFB7C174E1BE33642FEFB
000000000000000000000000000000000000000000000010
682C20B72DDFE4F678B2379FA25715CA
000000000000000000000000000000000000000000000008
925721E954372C9EA115BFF97BBE9A12
000000000000000000000000000000000000000000000004
32929E53C8E8D85657B9B55A4911028C
000000000000000000000000000000000000000000000002
8EE624F18BF5AA25ACE8667643D0D80D
000000000000000000000000000000000000000000000001
30A61DCEB9A951B829DE01414A801807
/trunk/test_vectors/twofish_ecb_decryption_monte_carlo_testvalues_128bits.txt
0,0 → 1,1200
00000000000000000000000000000000
00000000000000000000000000000000
21D3F7F6724513946B72CFAE47DA2EED
21D3F7F6724513946B72CFAE47DA2EED
21D3F7F6724513946B72CFAE47DA2EED
DD7D3CBE24EC771704F531ED82CE8AEE
FCAECB4856A964836F87FE43C514A403
DD7D3CBE24EC771704F531ED82CE8AEE
A24CDF52A32A27AA1700AD46A70C44AB
5EE2141AF5834329788753056218E0A8
A24CDF52A32A27AA1700AD46A70C44AB
C46DA91E739DDB027E8D06CE28E77478
9A8FBD04861E982B060A55CB4AFF94D0
C46DA91E739DDB027E8D06CE28E77478
AAD1229FE482AAB37371C029B42F9D2C
305E9F9B629C3298757B95E2FED009FC
AAD1229FE482AAB37371C029B42F9D2C
8D35A9B3DE4CFF67E2C9C59BB8A2F347
BD6B3628BCD0CDFF97B250794672FABB
8D35A9B3DE4CFF67E2C9C59BB8A2F347
86A6BD91D8F36CDA669EE97E5C5E370D
3BCD8BB96423A125F12CB9071A2CCDB6
86A6BD91D8F36CDA669EE97E5C5E370D
0DAD0196F18CFEC957FEA525DA6BC8B0
36608A2F95AF5FECA6D21C22C0470506
0DAD0196F18CFEC957FEA525DA6BC8B0
7FD0715CC08F17AC663C2019900B3003
49B0FB7355204840C0EE3C3B504C3505
7FD0715CC08F17AC663C2019900B3003
4F037F7017594E3DF2D062B0BA2ECD0A
06B384034279067D323E5E8BEA62F80F
4F037F7017594E3DF2D062B0BA2ECD0A
2537320006439506387DB3E77A6403CD
2384B603443A937B0A43ED6C9006FBC2
2537320006439506387DB3E77A6403CD
B82015B8A98B198CC3E914903A152D25
9BA4A3BBEDB18AF7C9AAF9FCAA13D6E7
B82015B8A98B198CC3E914903A152D25
E959A594A3B8FAE4B7B99352E2BEA52A
72FD062F4E0970137E136AAE48AD73CD
E959A594A3B8FAE4B7B99352E2BEA52A
BE23D4F8F9A193CEF8AD571F5B20EA44
CCDED2D7B7A8E3DD86BE3DB1138D9989
BE23D4F8F9A193CEF8AD571F5B20EA44
9C530052EEA461761178E5993DB6618F
508DD285590C82AB97C6D8282E3BF806
9C530052EEA461761178E5993DB6618F
CDD4EF5D6DCA361EBB6D848CBCFC9678
9D593DD834C6B4B52CAB5CA492C76E7E
CDD4EF5D6DCA361EBB6D848CBCFC9678
F0B796AE6EF539A450B2E5F20910F4BD
6DEEAB765A338D117C19B9569BD79AC3
F0B796AE6EF539A450B2E5F20910F4BD
08E3F7A11460E0EAE8E4F91FBA261DC7
650D5CD74E536DFB94FD404921F18704
08E3F7A11460E0EAE8E4F91FBA261DC7
D751FAFABC966E2333F931DEA37E3C7F
B25CA62DF2C503D8A7047197828FBB7B
D751FAFABC966E2333F931DEA37E3C7F
7BDCB5ED0E05A2682032FF64B5A953A8
C98013C0FCC0A1B087368EF33726E8D3
7BDCB5ED0E05A2682032FF64B5A953A8
DE540C143481CFF94F638F0099AD0731
17D41FD4C8416E49C85501F3AE8BEFE2
DE540C143481CFF94F638F0099AD0731
CF171B07833A944FE656D1859E0B0DAD
D8C304D34B7BFA062E03D0763080E24F
CF171B07833A944FE656D1859E0B0DAD
C4DDFC017CB18A1C076B7F28A06D93CC
1C1EF8D237CA701A2968AF5E90ED7183
C4DDFC017CB18A1C076B7F28A06D93CC
0DE7C164D481A6C4370F8A97C15250A0
11F939B6E34BD6DE1E6725C951BF2123
0DE7C164D481A6C4370F8A97C15250A0
01712C581608F494F759381EF4B709F9
108815EEF543224AE93E1DD7A50828DA
01712C581608F494F759381EF4B709F9
FE3F3A004D08F71A71053CEDB80C090C
EEB72FEEB84BD550983B213A1D0421D6
FE3F3A004D08F71A71053CEDB80C090C
2515E545298F5184668F45F32030B893
CBA2CAAB91C484D4FEB464C93D349945
2515E545298F5184668F45F32030B893
C40180ED3A25D57A14C18EF6E35D9BD9
0FA34A46ABE151AEEA75EA3FDE69029C
C40180ED3A25D57A14C18EF6E35D9BD9
D535B9CDBD8CD6D954FEB376B2982525
DA96F38B166D8777BE8B59496CF127B9
D535B9CDBD8CD6D954FEB376B2982525
54934076503599B1EA85E14357D0CB3E
8E05B3FD46581EC6540EB80A3B21EC87
54934076503599B1EA85E14357D0CB3E
EF1718B0FA17353B1C809DB21F3E4EAA
6112AB4DBC4F2BFD488E25B8241FA22D
EF1718B0FA17353B1C809DB21F3E4EAA
1B270E187CE425C53AB785DB749048CE
7A35A555C0AB0E387239A063508FEAE3
1B270E187CE425C53AB785DB749048CE
94D8BDD758C50AFD1575284DEEAAC604
EEED1882986E04C5674C882EBE252CE7
94D8BDD758C50AFD1575284DEEAAC604
539CC82531A216674957290D660AC22B
BD71D0A7A9CC12A22E1BA123D82FEECC
539CC82531A216674957290D660AC22B
7600496A80C618FEE6382A6985246928
CB7199CD290A0A5CC8238B4A5D0B87E4
7600496A80C618FEE6382A6985246928
5379315390FBB08478F3DF7D85EFDB2B
9808A89EB9F1BAD8B0D05437D8E45CCF
5379315390FBB08478F3DF7D85EFDB2B
609805E778A1D963FFFF300561CAC1A8
F890AD79C15063BB4F2F6432B92E9D67
609805E778A1D963FFFF300561CAC1A8
B4FB3BFEED0B19742C6078989926C194
4C6B96872C5B7ACF634F1CAA20085CF3
B4FB3BFEED0B19742C6078989926C194
8765F0C8DE0AD1B098507E85254C62BE
CB0E664FF251AB7FFB1F622F05443E4D
8765F0C8DE0AD1B098507E85254C62BE
FFF32BF115D0DD8CBC36F5D8FC39D715
34FD4DBEE78176F3472997F7F97DE958
FFF32BF115D0DD8CBC36F5D8FC39D715
5D2D720FE33BA57EE4B9D3F78AFC939F
69D03FB104BAD38DA390440073817AC7
5D2D720FE33BA57EE4B9D3F78AFC939F
35BA26FF6EC12D75D66D434D163B0200
5C6A194E6A7BFEF875FD074D65BA78C7
35BA26FF6EC12D75D66D434D163B0200
34C2E8CD57585AB052936E9B5DC36A49
68A8F1833D23A448276E69D63879128E
34C2E8CD57585AB052936E9B5DC36A49
0460CDBFA2EBB915AD6FA847A31C0865
6CC83C3C9FC81D5D8A01C1919B651AEB
0460CDBFA2EBB915AD6FA847A31C0865
529FBAF61ED64174E8574759DE223E04
3E5786CA811E5C29625686C8454724EF
529FBAF61ED64174E8574759DE223E04
82893900A7A982D7E4C52315FEA1815E
BCDEBFCA26B7DEFE8693A5DDBBE6A5B1
82893900A7A982D7E4C52315FEA1815E
D88D99B1FE9736B6B44EF786CB27554C
6453267BD820E84832DD525B70C1F0FD
D88D99B1FE9736B6B44EF786CB27554C
934DB6C6D25896D4663168318C1F2E55
F71E90BD0A787E9C54EC3A6AFCDEDEA8
934DB6C6D25896D4663168318C1F2E55
47EFDBF2981C9D42CE4B07878FE339E9
B0F14B4F9264E3DE9AA73DED733DE741
47EFDBF2981C9D42CE4B07878FE339E9
63B4092EBFD7DF3D08FBB332C5D101DB
D34542612DB33CE3925C8EDFB6ECE69A
63B4092EBFD7DF3D08FBB332C5D101DB
CB73B555B2EC8B0ADEB7D6879B724208
1836F7349F5FB7E94CEB58582D9EA492
CB73B555B2EC8B0ADEB7D6879B724208
727BFDF0993CB1F841ED77F75C5AE35F
6A4D0AC4066306110D062FAF71C447CD
727BFDF0993CB1F841ED77F75C5AE35F
6E56F473B1A0C67C2DC4097FB627A02F
041BFEB7B7C3C06D20C226D0C7E3E7E2
6E56F473B1A0C67C2DC4097FB627A02F
8E802398B3E2AE1D8CDD48B58D8885B7
8A9BDD2F04216E70AC1F6E654A6B6255
8E802398B3E2AE1D8CDD48B58D8885B7
849D9811C2D74C86F90D8A04ADFB0207
0E06453EC6F622F65512E461E7906052
849D9811C2D74C86F90D8A04ADFB0207
7131130825F65071F6DA804E73F6B83E
7F375636E3007287A3C8642F9466D86C
7131130825F65071F6DA804E73F6B83E
C900826158FF17ACD68B7969CD6A58C8
B637D457BBFF652B75431D46590C80A4
C900826158FF17ACD68B7969CD6A58C8
1628579D540D1F70097B261D60253234
A01F83CAEFF27A5B7C383B5B3929B290
1628579D540D1F70097B261D60253234
E8167F6785510E4D1952B4A111CC62D1
4809FCAD6AA37416656A8FFA28E5D041
E8167F6785510E4D1952B4A111CC62D1
7CDF30F12F1EABD50FC66678C7041802
34D6CC5C45BDDFC36AACE982EFE1C843
7CDF30F12F1EABD50FC66678C7041802
344D55FEC1F7C8886816951420094E75
009B99A2844A174B02BA7C96CFE88636
344D55FEC1F7C8886816951420094E75
4BCA7A7E90450207A01970EA293A9696
4B51E3DC140F154CA2A30C7CE6D210A0
4BCA7A7E90450207A01970EA293A9696
70EE990B9884FF33D334589FEC7CF95E
3BBF7AD78C8BEA7F719754E30AAEE9FE
70EE990B9884FF33D334589FEC7CF95E
BBB39D59C311A3B8F2F2A95ABD933187
800CE78E4F9A49C78365FDB9B73DD879
BBB39D59C311A3B8F2F2A95ABD933187
F895327E6E3674CA050413870EE372A5
7899D5F021AC3D0D8661EE3EB9DEAADC
F895327E6E3674CA050413870EE372A5
3629A654A1F837A28862F854A0D14B8F
4EB073A480540AAF0E03166A190FE153
3629A654A1F837A28862F854A0D14B8F
52330AFC0129715F63C34ACB8015F807
1C837958817D7BF06DC05CA1991A1954
52330AFC0129715F63C34ACB8015F807
E6174CF07001E81DCADBD160543663FA
FA9435A8F17C93EDA71B8DC1CD2C7AAE
E6174CF07001E81DCADBD160543663FA
7230B88722F1A049F088407D7B79BF8E
88A48D2FD38D33A45793CDBCB655C520
7230B88722F1A049F088407D7B79BF8E
99383D9DB956C58AF0882C178CC647A6
119CB0B26ADBF62EA71BE1AB3A938286
99383D9DB956C58AF0882C178CC647A6
07922F989ECB5A387076D9644F6E2C20
160E9F2AF410AC16D76D38CF75FDAEA6
07922F989ECB5A387076D9644F6E2C20
B0B49DC2049637E17DA56C1DB8421852
A6BA02E8F0869BF7AAC854D2CDBFB6F4
B0B49DC2049637E17DA56C1DB8421852
732A71CBA18C2CB6BAC60A9D4E5FC7E5
D5907323510AB741100E5E4F83E07111
732A71CBA18C2CB6BAC60A9D4E5FC7E5
6E8D49AB3A53E1D3DFBDB3F8B977BA86
BB1D3A886B595692CFB3EDB73A97CB97
6E8D49AB3A53E1D3DFBDB3F8B977BA86
A2ED83E42411E32BFA183E62E289075A
19F0B96C4F48B5B935ABD3D5D81ECCCD
A2ED83E42411E32BFA183E62E289075A
ACC531C9FA8D3F51FE14BD156BC4B0BE
B53588A5B5C58AE8CBBF6EC0B3DA7C73
ACC531C9FA8D3F51FE14BD156BC4B0BE
BB444EE075DC11DD913D7C1A13E21DE8
0E71C645C0199B355A8212DAA038619B
BB444EE075DC11DD913D7C1A13E21DE8
4BB50202EDE555B1A7960C334D393EAC
45C4C4472DFCCE84FD141EE9ED015F37
4BB50202EDE555B1A7960C334D393EAC
08A6626A08E8C77EE37B5E410572E0C1
4D62A62D251409FA1E6F40A8E873BFF6
08A6626A08E8C77EE37B5E410572E0C1
1C02634303680770B779955CA9CE9427
5160C56E267C0E8AA916D5F441BD2BD1
1C02634303680770B779955CA9CE9427
C8EAC65E8D15670B6BD9D7F179C899FD
998A0330AB696981C2CF02053875B22C
C8EAC65E8D15670B6BD9D7F179C899FD
9E5BF62AE94D42C277F1E7C1111AA695
07D1F51A42242B43B53EE5C4296F14B9
9E5BF62AE94D42C277F1E7C1111AA695
F2F6F4B26BB0058A697B669F5D23311B
F52701A829942EC9DC45835B744C25A2
F2F6F4B26BB0058A697B669F5D23311B
41BDDF5F3695A3BDA8EE0DC20B1EB55E
B49ADEF71F018D7474AB8E997F5290FC
41BDDF5F3695A3BDA8EE0DC20B1EB55E
204CD5AD3F9440BA00C4ABF1C54398D8
94D60B5A2095CDCE746F2568BA110824
204CD5AD3F9440BA00C4ABF1C54398D8
AB267442B199B6C020D1035D4E85AE2C
3FF07F18910C7B0E54BE2635F494A608
AB267442B199B6C020D1035D4E85AE2C
66DC62651E1B1DDA4F792C008D204980
592C1D7D8F1766D41BC70A3579B4EF88
66DC62651E1B1DDA4F792C008D204980
93DC0BD30977AB6BCF6607D40C1634B6
CAF016AE8660CDBFD4A10DE175A2DB3E
93DC0BD30977AB6BCF6607D40C1634B6
A7EB89BF84DEF083CEFAEC60855FB4A1
6D1B9F1102BE3D3C1A5BE181F0FD6F9F
A7EB89BF84DEF083CEFAEC60855FB4A1
A54BD4D1A193DD0E6870BEA7ABE2741B
C8504BC0A32DE032722B5F265B1F1B84
A54BD4D1A193DD0E6870BEA7ABE2741B
1C58DEC7333494A34D2093DD95EFA1E1
D4089507901974913F0BCCFBCEF0BA65
1C58DEC7333494A34D2093DD95EFA1E1
21877A02E392C163F0C54748B86504B8
F58FEF05738BB5F2CFCE8BB37695BEDD
21877A02E392C163F0C54748B86504B8
194691BA696AEB824A1F8E97573B9821
ECC97EBF1AE15E7085D1052421AE26FC
194691BA696AEB824A1F8E97573B9821
1E5316FBB5177954DE7D7C077021B3C0
F29A6844AFF627245BAC7923518F953C
1E5316FBB5177954DE7D7C077021B3C0
8AD36EE3DD619B74018D80FBEE6C03CE
784906A77297BC505A21F9D8BFE396F2
8AD36EE3DD619B74018D80FBEE6C03CE
945019D5181DDB59C86043A101610CF4
EC191F726A8A67099241BA79BE829A06
945019D5181DDB59C86043A101610CF4
148009A04DFB8E2E1C596AB753A49E33
F89916D22771E9278E18D0CEED260435
148009A04DFB8E2E1C596AB753A49E33
129203D1F7DB68EC08149C5E6326AE7B
EA0B1503D0AA81CB860C4C908E00AA4E
129203D1F7DB68EC08149C5E6326AE7B
71B44A3354128BAE2C500F60B4FD6A19
9BBF5F3084B80A65AA5C43F03AFDC057
71B44A3354128BAE2C500F60B4FD6A19
BE3AD2A3B825896E3C71868583CCC14B
25858D933C9D830B962DC575B931011C
BE3AD2A3B825896E3C71868583CCC14B
43BCE2E42518DCAC06B8EEEB2A0DEECA
66396F7719855FA790952B9E933CEFD6
43BCE2E42518DCAC06B8EEEB2A0DEECA
2B131A2E21CB31D6011C71EEE6FFC440
4D2A7559384E6E7191895A7075C32B96
2B131A2E21CB31D6011C71EEE6FFC440
4655CFDA6DBC6457843E8C076CF5E299
0B7FBA8355F20A2615B7D6771936C90F
4655CFDA6DBC6457843E8C076CF5E299
46319A12CBA4344115B0E45C3BC782FB
4D4E20919E563E670007322B22F14BF4
46319A12CBA4344115B0E45C3BC782FB
D6DDC81017D1AFA0E18028F3259298A6
9B93E881898791C7E1871AD80763D352
D6DDC81017D1AFA0E18028F3259298A6
E8F5AB2E8F7DF2E3F0552FA822FB21A9
736643AF06FA632411D235702598F2FB
E8F5AB2E8F7DF2E3F0552FA822FB21A9
B9E9A7D2FCE4A9E7488F24C3D0D1E90E
CA8FE47DFA1ECAC3595D11B3F5491BF5
B9E9A7D2FCE4A9E7488F24C3D0D1E90E
6F72CD173B6D706E071989C7E8902975
A5FD296AC173BAAD5E4498741DD93280
6F72CD173B6D706E071989C7E8902975
1C60B54002A3821B141E273EB0F7DA5C
B99D9C2AC3D038B64A5ABF4AAD2EE8DC
1C60B54002A3821B141E273EB0F7DA5C
6CB7EA8B19BAAD7C62E8D0B620D3EA3C
D52A76A1DA6A95CA28B26FFC8DFD02E0
6CB7EA8B19BAAD7C62E8D0B620D3EA3C
67B2CD16D123F58258BA0E40B7F2B6DB
B298BBB70B496048700861BC3A0FB43B
67B2CD16D123F58258BA0E40B7F2B6DB
AE6D93C5EEDE74D622C66C6CBD0B1451
1CF52872E597149E52CE0DD08704A06A
AE6D93C5EEDE74D622C66C6CBD0B1451
42B6FE2D9A98737228B0589BE7CC6D61
5E43D65F7F0F67EC7A7E554B60C8CD0B
42B6FE2D9A98737228B0589BE7CC6D61
A16DEC609DF8C5BF8874FC6483461089
FF2E3A3FE2F7A253F20AA92FE38EDD82
A16DEC609DF8C5BF8874FC6483461089
E89F57064811186EEF62E63FDF45BA4B
17B16D39AAE6BA3D1D684F103CCB67C9
E89F57064811186EEF62E63FDF45BA4B
3DCAA0977F529AC5DD42641D5CC7BB34
2A7BCDAED5B420F8C02A2B0D600CDCFD
3DCAA0977F529AC5DD42641D5CC7BB34
E66E9D24AF8C51290A0285760F72DD8C
CC15508A7A3871D1CA28AE7B6F7E0171
E66E9D24AF8C51290A0285760F72DD8C
CEA048DAF5CE8ED22DEF0A4E1918EB5B
02B518508FF6FF03E7C7A4357666EA2A
CEA048DAF5CE8ED22DEF0A4E1918EB5B
38BD763CA9CACAB7FF2C6F09012C92D6
3A086E6C263C35B418EBCB3C774A78FC
38BD763CA9CACAB7FF2C6F09012C92D6
C8A92EA8D33F11E4036B1712392D3DAA
F2A140C4F50324501B80DC2E4E674556
C8A92EA8D33F11E4036B1712392D3DAA
E7CA7C34716CC0705F0D19E95B9CEC29
156B3CF0846FE420448DC5C715FBA97F
E7CA7C34716CC0705F0D19E95B9CEC29
D61B5261B65DA31DD064E7ECC0E1F003
C3706E913232473D94E9222BD51A597C
D61B5261B65DA31DD064E7ECC0E1F003
C13A703C2DBCA153A597C402EB9A15CB
024A1EAD1F8EE66E317EE6293E804CB7
C13A703C2DBCA153A597C402EB9A15CB
C7FC56346029E228667B24A44276CBCB
C5B648997FA704465705C28D7CF6877C
C7FC56346029E228667B24A44276CBCB
8F06046016B47E0EF85EBFA3B6B458D4
4AB04CF969137A48AF5B7D2ECA42DFA8
8F06046016B47E0EF85EBFA3B6B458D4
9C7DA19C88DA87074F92A1EA03F8E4EE
D6CDED65E1C9FD4FE0C9DCC4C9BA3B46
9C7DA19C88DA87074F92A1EA03F8E4EE
7A76B037E87803329C5B613FE76B897F
ACBB5D5209B1FE7D7C92BDFB2ED1B239
7A76B037E87803329C5B613FE76B897F
D3A5253C3D2C7781D9D39AA90485630C
7F1E786E349D89FCA54127522A54D135
D3A5253C3D2C7781D9D39AA90485630C
DB91CB6F7618440FABD6F976B2FF0C11
A48FB3014285CDF30E97DE2498ABDD24
DB91CB6F7618440FABD6F976B2FF0C11
A61911F77CB71F3C6764F1FEBE638F9E
0296A2F63E32D2CF69F32FDA26C852BA
A61911F77CB71F3C6764F1FEBE638F9E
501F4D19E0433196143800A4104C838B
5289EFEFDE71E3597DCB2F7E3684D131
501F4D19E0433196143800A4104C838B
1DD312E502521314A4F5E07931FC9E4B
4F5AFD0ADC23F04DD93ECF0707784F7A
1DD312E502521314A4F5E07931FC9E4B
9C1CB99E5E1CDAAC53E56F7553E0A395
D3464494823F2AE18ADBA0725498ECEF
9C1CB99E5E1CDAAC53E56F7553E0A395
987A6457E8D9ABC5CFB0661FEEBFAB36
4B3C20C36AE68124456BC66DBA2747D9
987A6457E8D9ABC5CFB0661FEEBFAB36
DC720076B4D32BFB004856D695F4879B
974E20B5DE35AADF452390BB2FD3C042
DC720076B4D32BFB004856D695F4879B
28272F8CC1F2AEECE57C42C278AFDA5E
BF690F391FC70433A05FD279577C1A1C
28272F8CC1F2AEECE57C42C278AFDA5E
EB8518209EDECA31C8963C43C73A20C8
54EC17198119CE0268C9EE3A90463AD4
EB8518209EDECA31C8963C43C73A20C8
1F79C7BC3A3C986A3BFEC0138B26B7DD
4B95D0A5BB25566853372E291B608D09
1F79C7BC3A3C986A3BFEC0138B26B7DD
E675CDB12BCE7524D15A629ACCD134D4
ADE01D1490EB234C826D4CB3D7B1B9DD
E675CDB12BCE7524D15A629ACCD134D4
0A3A27241AEEB090C9282C13F885A9D5
A7DA3A308A0593DC4B4560A02F341008
0A3A27241AEEB090C9282C13F885A9D5
987A4DCC92371689F79A2A08F7E0FB2D
3FA077FC18328555BCDF4AA8D8D4EB25
987A4DCC92371689F79A2A08F7E0FB2D
9FF44DAA1AB5587BC3B5C6FB9E5C089A
A0543A560287DD2E7F6A8C534688E3BF
9FF44DAA1AB5587BC3B5C6FB9E5C089A
CE496CADCC644BD5700AABB8F770AB17
6E1D56FBCEE396FB0F6027EBB1F848A8
CE496CADCC644BD5700AABB8F770AB17
B9CAA875E7E059B9E857DD04E73F126D
D7D7FE8E2903CF42E737FAEF56C75AC5
B9CAA875E7E059B9E857DD04E73F126D
99050F9774F691AE8964B35DB688ECC1
4ED2F1195DF55EEC6E5349B2E04FB604
99050F9774F691AE8964B35DB688ECC1
4BE4030797BC92AC9521F2EBC008089F
0536F21ECA49CC40FB72BB592047BE9B
4BE4030797BC92AC9521F2EBC008089F
121CDF5187FF7335F904C07EED3BF63C
172A2D4F4DB6BF7502767B27CD7C48A7
121CDF5187FF7335F904C07EED3BF63C
E824E61C522407C97D3666A2FDF6CB83
FF0ECB531F92B8BC7F401D85308A8324
E824E61C522407C97D3666A2FDF6CB83
FE547728F6FFBBAA90F9926746AC3516
015ABC7BE96D0316EFB98FE27626B632
FE547728F6FFBBAA90F9926746AC3516
D7C0B38E48FB2C4B42D00E394FDFABC2
D69A0FF5A1962F5DAD6981DB39F91DF0
D7C0B38E48FB2C4B42D00E394FDFABC2
23D28BCE9C18ABB87217DFB831D197AF
F548843B3D8E84E5DF7E5E6308288A5F
23D28BCE9C18ABB87217DFB831D197AF
73EF3E31D02299B4DE2D7285A82D1100
86A7BA0AEDAC1D5101532CE6A0059B5F
73EF3E31D02299B4DE2D7285A82D1100
1AA2B209D3D304993CC79108435FEC60
9C0508033E7F19C83D94BDEEE35A773F
1AA2B209D3D304993CC79108435FEC60
C256273DD070AB732DE11AEDE9401AB6
5E532F3EEE0FB2BB1075A7030A1A6D89
C256273DD070AB732DE11AEDE9401AB6
35D7F7429B9FBB98F419192E1EFB8CDC
6B84D87C75900923E46CBE2D14E1E155
35D7F7429B9FBB98F419192E1EFB8CDC
361085B424DE727EC0FAC7579C1AD346
5D945DC8514E7B5D2496797A88FB3213
361085B424DE727EC0FAC7579C1AD346
52C656CF07A9F9D677E0CE73456E79B4
0F520B0756E7828B5376B709CD954BA7
52C656CF07A9F9D677E0CE73456E79B4
2182A7D6AFC2C4F573AD93914597499F
2ED0ACD1F925467E20DB249888020238
2182A7D6AFC2C4F573AD93914597499F
8F4078BB6D99CC240B6B578EB1169ACB
A190D46A94BC8A5A2BB07316391498F3
8F4078BB6D99CC240B6B578EB1169ACB
31A8222E8261ACA072C4E24D0EEE0740
9038F64416DD26FA5974915B37FA9FB3
31A8222E8261ACA072C4E24D0EEE0740
EDF88AE58F83F708E255186ED6A3F93D
7DC07CA1995ED1F2BB218935E159668E
EDF88AE58F83F708E255186ED6A3F93D
311AB6AC640B86AB681390BD8BD09716
4CDACA0DFD555759D33219886A89F198
311AB6AC640B86AB681390BD8BD09716
E3C8B481959B5B73A3665D0C6B57D9FF
AF127E8C68CE0C2A7054448401DE2867
E3C8B481959B5B73A3665D0C6B57D9FF
930EF6980EE88561719A428A371C9E7A
3C1C88146626894B01CE060E36C2B61D
930EF6980EE88561719A428A371C9E7A
3F1CBDBDE2E2FB62DF2CC6B1E267750E
030035A984C47229DEE2C0BFD4A5C313
3F1CBDBDE2E2FB62DF2CC6B1E267750E
EE8FC3843F83EA6CD207F2C20F22FFAD
ED8FF62DBB4798450CE5327DDB873CBE
EE8FC3843F83EA6CD207F2C20F22FFAD
FAF56C4475CFFD5644D1B08D05D8D04A
177A9A69CE886513483482F0DE5FECF4
FAF56C4475CFFD5644D1B08D05D8D04A
3AC91A879A33CBDA9E427033AFCA92E8
2DB380EE54BBAEC9D676F2C371957E1C
3AC91A879A33CBDA9E427033AFCA92E8
6FD35EF5D14741B6238B3776DCE5EF3A
4260DE1B85FCEF7FF5FDC5B5AD709126
6FD35EF5D14741B6238B3776DCE5EF3A
640D25A4B6DE2F8863EB3C00C2A21651
266DFBBF3322C0F79616F9B56FD28777
640D25A4B6DE2F8863EB3C00C2A21651
F5F949731213AC6DBEAF443124094CD1
D394B2CC21316C9A28B9BD844BDBCBA6
F5F949731213AC6DBEAF443124094CD1
F96B87CE4065CB0E9A27319693D04629
2AFF35026154A794B29E8C12D80B8D8F
F96B87CE4065CB0E9A27319693D04629
A213B197B1FE8E2ED32E7CFC983C8416
88EC8495D0AA29BA61B0F0EE40370999
A213B197B1FE8E2ED32E7CFC983C8416
324530F5C565ECAAA104C1487AE52B09
BAA9B46015CFC510C0B431A63AD22290
324530F5C565ECAAA104C1487AE52B09
18F216A0123E930FD04FDEE10DE94C9C
A25BA2C007F1561F10FBEF47373B6E0C
18F216A0123E930FD04FDEE10DE94C9C
1DAC961C3C2053A9074C62D8BF96592E
BFF734DC3BD105B617B78D9F88AD3722
1DAC961C3C2053A9074C62D8BF96592E
92189CA29372049AC74B1ACDE6BCAB75
2DEFA87EA8A3012CD0FC97526E119C57
92189CA29372049AC74B1ACDE6BCAB75
04F197AF4573B576452B07B344F8E2E6
291E3FD1EDD0B45A95D790E12AE97EB1
04F197AF4573B576452B07B344F8E2E6
C48B77EEBFF333360307099DF38FED8D
ED95483F5223876C96D0997CD966933C
C48B77EEBFF333360307099DF38FED8D
95D89CCFF18CD68B00AA9F4EC974EF41
784DD4F0A3AF51E7967A063210127C7D
95D89CCFF18CD68B00AA9F4EC974EF41
2963FF2E301D771F55DF117320A81627
512E2BDE93B226F8C3A5174130BA6A5A
2963FF2E301D771F55DF117320A81627
82B8B3035006FBF80E41071D4D48C112
D39698DDC3B4DD00CDE4105C7DF2AB48
82B8B3035006FBF80E41071D4D48C112
C46489C2E5C13EF076B4618BFEB31985
17F2111F2675E3F0BB5071D78341B2CD
C46489C2E5C13EF076B4618BFEB31985
B17E473B73CD327A99A873AB63ED06D4
A68C562455B8D18A22F8027CE0ACB419
B17E473B73CD327A99A873AB63ED06D4
456A376A5708D2DADDF2E538EF3EA594
E3E6614E02B00350FF0AE7440F92118D
456A376A5708D2DADDF2E538EF3EA594
DDD2D1D0A754FDB16F27DEC0392EA9CF
3E34B09EA5E4FEE1902D398436BCB842
DDD2D1D0A754FDB16F27DEC0392EA9CF
9E5694E5E1B00236DD4103B293D271F0
A062247B4454FCD74D6C3A36A56EC9B2
9E5694E5E1B00236DD4103B293D271F0
E18E2105BD35BE596B223BE82A607DC5
41EC057EF961428E264E01DE8F0EB477
E18E2105BD35BE596B223BE82A607DC5
2E3958BB30E15F04AEE15193C76E2CED
6FD55DC5C9801D8A88AF504D4860989A
2E3958BB30E15F04AEE15193C76E2CED
BC9537736B951AD31F995829E2438A8B
D3406AB6A215075997360864AA231211
BC9537736B951AD31F995829E2438A8B
BF6883EBEC01FCAB2B9A3092DAFDD195
6C28E95D4E14FBF2BCAC38F670DEC384
BF6883EBEC01FCAB2B9A3092DAFDD195
D28433E4032E9BB6B954B8CC887AE655
BEACDAB94D3A604405F8803AF8A425D1
D28433E4032E9BB6B954B8CC887AE655
B32D388D1A83507370CB702F5BD49DE7
0D81E23457B930377533F015A370B836
B32D388D1A83507370CB702F5BD49DE7
2F19EA9EB68B456CE7F6096E098D412A
229808AAE132755B92C5F97BAAFDF91C
2F19EA9EB68B456CE7F6096E098D412A
57EA8F356BC6B45BFC5FF5A5EF44B593
7572879F8AF4C1006E9A0CDE45B94C8F
57EA8F356BC6B45BFC5FF5A5EF44B593
A69335D7A7B15DBB86159FC256FD9684
D3E1B2482D459CBBE88F931C1344DA0B
A69335D7A7B15DBB86159FC256FD9684
F7F873D709DF17EC385F3659477B8B06
2419C19F249A8B57D0D0A545543F510D
F7F873D709DF17EC385F3659477B8B06
DD76485CE85A994F672E0CFA723B6C46
F96F89C3CCC01218B7FEA9BF26043D4B
DD76485CE85A994F672E0CFA723B6C46
CE9A43923B61F0D68047B996BEA609A2
37F5CA51F7A1E2CE37B9102998A234E9
CE9A43923B61F0D68047B996BEA609A2
6C017921CBA1B998A7F9A7E3BF039A24
5BF4B3703C005B569040B7CA27A1AECD
6C017921CBA1B998A7F9A7E3BF039A24
C9ED5C2FFB7C30504507E96C21DA21A4
9219EF5FC77C6B06D5475EA6067B8F69
C9ED5C2FFB7C30504507E96C21DA21A4
462FAB7FF40C8C4F13F5B150EA2A7ECF
D43644203370E749C6B2EFF6EC51F1A6
462FAB7FF40C8C4F13F5B150EA2A7ECF
2B739200A39C6690CEBBFEB99D2CF686
FF45D62090EC81D90809114F717D0720
2B739200A39C6690CEBBFEB99D2CF686
D2AE7822E38B9B41D159068CB94C54EF
2DEBAE0273671A98D95017C3C83153CF
D2AE7822E38B9B41D159068CB94C54EF
01ACE5C14A3BF2C7D4D3449493487C6B
2C474BC3395CE85F0D8353575B792FA4
01ACE5C14A3BF2C7D4D3449493487C6B
7C946CBECCDEE6B458C1CEAC9BCAB0F1
50D3277DF5820EEB55429DFBC0B39F55
7C946CBECCDEE6B458C1CEAC9BCAB0F1
55A578A33E41BF6FB57DD1D74EC705A8
05765FDECBC3B184E03F4C2C8E749AFD
55A578A33E41BF6FB57DD1D74EC705A8
A1377C01E67028AF5F460E055530273A
A44123DF2DB3992BBF794229DB44BDC7
A1377C01E67028AF5F460E055530273A
AC61501BA68CFDC4473725C381A73E46
082073C48B3F64EFF84E67EA5AE38381
AC61501BA68CFDC4473725C381A73E46
6671548297936A8B4EB29D40EB18F8A5
6E5127461CAC0E64B6FCFAAAB1FB7B24
6671548297936A8B4EB29D40EB18F8A5
CC59206F9EBA04C953198086C06F6F91
A208072982160AADE5E57A2C719414B5
CC59206F9EBA04C953198086C06F6F91
F5511D945BDBA657C39331980FD5B9DF
57591ABDD9CDACFA26764BB47E41AD6A
F5511D945BDBA657C39331980FD5B9DF
04EB0912913EA3AD514CAF8F0F166BDB
53B213AF48F30F57773AE43B7157C6B1
04EB0912913EA3AD514CAF8F0F166BDB
ECF30EC6ABC5302BC98E5F3B0FC356CF
BF411D69E3363F7CBEB4BB007E94907E
ECF30EC6ABC5302BC98E5F3B0FC356CF
E53E14B36AFA404518A8A09FC56EC0FD
5A7F09DA89CC7F39A61C1B9FBBFA5083
E53E14B36AFA404518A8A09FC56EC0FD
AF9ED027A8999D332EFB89F5ABAD9579
F5E1D9FD2155E20A88E7926A1057C5FA
AF9ED027A8999D332EFB89F5ABAD9579
3A07F49A49670C02A6499934D571F133
CFE62D676832EE082EAE0B5EC52634C9
3A07F49A49670C02A6499934D571F133
C9308E7567F9E7F4D88D10D20DDF3192
06D6A3120FCB09FCF6231B8CC8F9055B
C9308E7567F9E7F4D88D10D20DDF3192
107C6122AFD2923F40C9A78B92201863
16AAC230A0199BC3B6EABC075AD91D38
107C6122AFD2923F40C9A78B92201863
2C1E5BECCB0E3A9FB9B128FF86B5BF7F
3AB499DC6B17A15C0F5B94F8DC6CA247
2C1E5BECCB0E3A9FB9B128FF86B5BF7F
4370D4E5196814325214A236B29D6097
79C44D39727FB56E5D4F36CE6EF1C2D0
4370D4E5196814325214A236B29D6097
DB46FA9A9E9E9414C11DFBF43433EAA5
A282B7A3ECE1217A9C52CD3A5AC22875
DB46FA9A9E9E9414C11DFBF43433EAA5
E735406EFCCC1C3D25EB385F64293690
45B7F7CD102D3D47B9B9F5653EEB1EE5
E735406EFCCC1C3D25EB385F64293690
52AB7DFC862C08F1EDDA0E485AC161A0
171C8A31960135B65463FB2D642A7F45
52AB7DFC862C08F1EDDA0E485AC161A0
CA8BE7C8F4B7096C0EDA16EFF2CDAA45
DD976DF962B63CDA5AB9EDC296E7D500
CA8BE7C8F4B7096C0EDA16EFF2CDAA45
CD1B5A044B227E4381903CC833F52599
108C37FD29944299DB29D10AA512F099
CD1B5A044B227E4381903CC833F52599
0F9628254D6AA1C04F47685F77F2CF97
1F1A1FD864FEE359946EB955D2E03F0E
0F9628254D6AA1C04F47685F77F2CF97
51C2873ADD0E5FB772CD5E5376B10A8B
4ED898E2B9F0BCEEE6A3E706A4513585
51C2873ADD0E5FB772CD5E5376B10A8B
968D2567C8CFABAF027203AA99F1AC67
D855BD85713F1741E4D1E4AC3DA099E2
968D2567C8CFABAF027203AA99F1AC67
6F7B6B49A1C77D4828E3A7DDD8E7156F
B72ED6CCD0F86A09CC324371E5478C8D
6F7B6B49A1C77D4828E3A7DDD8E7156F
6DBCFB33955924F61F2B683D941785D3
DA922DFF45A14EFFD3192B4C7150095E
6DBCFB33955924F61F2B683D941785D3
85AC677CDBEA9F985CFB53F689B21832
5F3E4A839E4BD1678FE278BAF8E2116C
85AC677CDBEA9F985CFB53F689B21832
11A669D9569891FA050B785BB013F8D0
4E98235AC8D3409D8AE900E148F1E9BC
11A669D9569891FA050B785BB013F8D0
D86D4D3EBD6AD30BCE1A92B041BEEFD4
96F56E6475B9939644F39251094F0668
D86D4D3EBD6AD30BCE1A92B041BEEFD4
748B2907B67AA09650FABEE5255B5F84
E27E4763C3C3330014092CB42C1459EC
748B2907B67AA09650FABEE5255B5F84
282662ABF3046990566153BFFC4FFDD5
CA5825C830C75A9042687F0BD05BA439
282662ABF3046990566153BFFC4FFDD5
67315D3A112BB71598F62FC6336FC548
AD6978F221ECED85DA9E50CDE3346171
67315D3A112BB71598F62FC6336FC548
10428CA8006236834AAE638F64C39376
BD2BF45A218EDB069030334287F7F207
10428CA8006236834AAE638F64C39376
D95120A85497A3DD812AF5BB9F7745B0
647AD4F2751978DB111AC6F91880B7B7
D95120A85497A3DD812AF5BB9F7745B0
D02222726DE3319F6B7E24AB8BFBCB02
B458F68018FA49447A64E252937B7CB5
D02222726DE3319F6B7E24AB8BFBCB02
2DBBD9008F1DA98D276182275FA3BEDE
99E32F8097E7E0C95D056075CCD8C26B
2DBBD9008F1DA98D276182275FA3BEDE
D2A7638A029415258F4292219F4136A1
4B444C0A9573F5ECD247F2545399F4CA
D2A7638A029415258F4292219F4136A1
332BDA19BC08B51147A6C98DEC360D32
786F9613297B40FD95E13BD9BFAFF9F8
332BDA19BC08B51147A6C98DEC360D32
4E6FAB5A82077755846E0704F051878B
36003D49AB7C37A8118F3CDD4FFE7E73
4E6FAB5A82077755846E0704F051878B
418D51D7396A08A277FB05CA0446470F
778D6C9E92163F0A667439174BB8397C
418D51D7396A08A277FB05CA0446470F
19130F77D1028EF92E3932C64C3FF9A2
6E9E63E94314B1F3484D0BD10787C0DE
19130F77D1028EF92E3932C64C3FF9A2
1FE942E105F11A3A84EF4FEBAC1F47CC
7177210846E5ABC9CCA2443AAB988712
1FE942E105F11A3A84EF4FEBAC1F47CC
03572F6412BCF0838CB299F9772A280F
72200E6C54595B4A4010DDC3DCB2AF1D
03572F6412BCF0838CB299F9772A280F
9948A2F228A396C3D3DF65D662764894
EB68AC9E7CFACD8993CFB815BEC4E789
9948A2F228A396C3D3DF65D662764894
FF494FD3E3175691B067304E789611BB
1421E34D9FED9B1823A8885BC652F632
FF494FD3E3175691B067304E789611BB
0A3D930619218F705B2EBD824B148574
1E1C704B86CC1468788635D98D467346
0A3D930619218F705B2EBD824B148574
92A6E3F4909927D566B5A8D09A3DB27A
8CBA93BF165533BD1E339D09177BC13C
92A6E3F4909927D566B5A8D09A3DB27A
8CE9F7331BE83F9BD532B3494DDF6623
0053648C0DBD0C26CB012E405AA4A71F
8CE9F7331BE83F9BD532B3494DDF6623
E8D2A3D56F5C410B9DD95E16F84A9116
E881C75962E14D2D56D87056A2EE3609
E8D2A3D56F5C410B9DD95E16F84A9116
AD13CF919E0406EA17EE78BC1155C840
459208C8FCE54BC7413608EAB3BBFE49
AD13CF919E0406EA17EE78BC1155C840
2099909819654969E440264CD4AD8B47
650B9850E58002AEA5762EA66716750E
2099909819654969E440264CD4AD8B47
38D9206247F1E37A415D9F9889BAAA23
5DD2B832A271E1D4E42BB13EEEACDF2D
38D9206247F1E37A415D9F9889BAAA23
31B2FB2D466F95FA5F02E36B20F23DFE
6C60431FE41E742EBB295255CE5EE2D3
31B2FB2D466F95FA5F02E36B20F23DFE
49E9ED3F888741BCF46D24A0E69FE542
2589AE206C9935924F4476F528C10791
49E9ED3F888741BCF46D24A0E69FE542
442358147C9A6DAE31C9A223E237F7C2
61AAF6341003583C7E8DD4D6CAF6F053
442358147C9A6DAE31C9A223E237F7C2
A6DDA5285EEDB992A5FDD7B850A5F168
C777531C4EEEE1AEDB70036E9A53013B
A6DDA5285EEDB992A5FDD7B850A5F168
92873FCD8A5121BC6C0C348A448D70A9
55F06CD1C4BFC012B77C37E4DEDE7192
92873FCD8A5121BC6C0C348A448D70A9
BD91A8EA60C6EA171D60CA9AFE9B7E21
E861C43BA4792A05AA1CFD7E20450FB3
BD91A8EA60C6EA171D60CA9AFE9B7E21
047A9FE7A3D76CA15F8893098B275BDD
EC1B5BDC07AE46A4F5946E77AB62546E
047A9FE7A3D76CA15F8893098B275BDD
08B820B1E773F5893D70CC0ADDC39FED
E4A37B6DE0DDB32DC8E4A27D76A1CB83
08B820B1E773F5893D70CC0ADDC39FED
F8503E5B2D70DEFEE2EDCD4DCD42F58D
1CF34536CDAD6DD32A096F30BBE33E0E
F8503E5B2D70DEFEE2EDCD4DCD42F58D
672B7C34775B34603D05E1B07477279A
7BD83902BAF659B3170C8E80CF941994
672B7C34775B34603D05E1B07477279A
66EFCE73AF392E0C0E957B3474A1004B
1D37F77115CF77BF1999F5B4BB3519DF
66EFCE73AF392E0C0E957B3474A1004B
F831F6ABF81C15643F8983115ED720DA
E50601DAEDD362DB261076A5E5E23905
F831F6ABF81C15643F8983115ED720DA
528CAB1D932E16FAE6966C8E616E3CAA
B78AAAC77EFD7421C0861A2B848C05AF
528CAB1D932E16FAE6966C8E616E3CAA
508ED3EF5914894BB61553C8B5C2FCB6
E704792827E9FD6A769349E3314EF919
508ED3EF5914894BB61553C8B5C2FCB6
695A59D1E1EC9FACFD7CCFCAF551B417
8E5E20F9C60562C68BEF8629C41F4D0E
695A59D1E1EC9FACFD7CCFCAF551B417
78008D196361F23476B1E71FA662DE82
F65EADE0A56490F2FD5E6136627D938C
78008D196361F23476B1E71FA662DE82
BAF5FC09CBDB62D922799BA84EB31B86
4CAB51E96EBFF22BDF27FA9E2CCE880A
BAF5FC09CBDB62D922799BA84EB31B86
18D1EE605BB79E08646492155D9CEAD1
547ABF8935086C23BB43688B715262DB
18D1EE605BB79E08646492155D9CEAD1
3694C50555F73EE943CA423FD25040B2
62EE7A8C60FF52CAF8892AB4A3022269
3694C50555F73EE943CA423FD25040B2
D3DC1634DFC953AAD45CC0FFA1050557
B1326CB8BF3601602CD5EA4B0207273E
D3DC1634DFC953AAD45CC0FFA1050557
0A0B11BAF039F264DC9FA97E03A0A8FF
BB397D024F0FF304F04A433501A78FC1
0A0B11BAF039F264DC9FA97E03A0A8FF
67BD031B65C8D651F0104A3356FB1625
DC847E192AC72555005A0906575C99E4
67BD031B65C8D651F0104A3356FB1625
2CDA45A4A55BA7812C3B34519E346820
F05E3BBD8F9C82D42C613D57C968F1C4
2CDA45A4A55BA7812C3B34519E346820
5BB40D00DED187B76F814C874148771B
ABEA36BD514D056343E071D0882086DF
5BB40D00DED187B76F814C874148771B
F20597F3E309768BCCBA279464159F70
59EFA14EB24473E88F5A5644EC3519AF
F20597F3E309768BCCBA279464159F70
DE9C0934018D0484611A8E8C235A2F13
8773A87AB3C9776CEE40D8C8CF6F36BC
DE9C0934018D0484611A8E8C235A2F13
08FB2A6466F311AA23B51EA0A2C9F4BD
8F88821ED53A66C6CDF5C6686DA6C201
08FB2A6466F311AA23B51EA0A2C9F4BD
3EBA3E550BF719874AE3600D580DA23F
B132BC4BDECD7F418716A66535AB603E
3EBA3E550BF719874AE3600D580DA23F
568F08A927672A02B394EF97451E13E2
E7BDB4E2F9AA5543348249F270B573DC
568F08A927672A02B394EF97451E13E2
0A3E8ED7334E386A39E575836DD196E8
ED833A35CAE46D290D673C711D64E534
0A3E8ED7334E386A39E575836DD196E8
9A33292E5A3D236CF9F9427DC67A0D70
77B0131B90D94E45F49E7E0CDB1EE844
9A33292E5A3D236CF9F9427DC67A0D70
44AE9A0089F605523EED4B03D2CA11A7
331E891B192F4B17CA73350F09D4F9E3
44AE9A0089F605523EED4B03D2CA11A7
2B723E2341F31B7CEC1E8DFFAABE8480
186CB73858DC506B266DB8F0A36A7D63
2B723E2341F31B7CEC1E8DFFAABE8480
D818F7C9F4AE4701ABB55669FD938E5F
C07440F1AC72176A8DD8EE995EF9F33C
D818F7C9F4AE4701ABB55669FD938E5F
687140E9B1BCE07A82483A42F68C88A9
A80500181DCEF7100F90D4DBA8757B95
687140E9B1BCE07A82483A42F68C88A9
F55BC710859F498DFC650174D895FD37
5D5EC7089851BE9DF3F5D5AF70E086A2
F55BC710859F498DFC650174D895FD37
2B7219EAE5B6C6561AF455B88D58D466
762CDEE27DE778CBE9018017FDB852C4
2B7219EAE5B6C6561AF455B88D58D466
F37543723A24D1B5A76C1BED2931CDE2
85599D9047C3A97E4E6D9BFAD4899F26
F37543723A24D1B5A76C1BED2931CDE2
97138B79B391515189D75580F1CADE04
124A16E9F452F82FC7BACE7A25434122
97138B79B391515189D75580F1CADE04
ACCEF78C050A5F38222C058EA530084A
BE84E165F158A717E596CBF480734968
ACCEF78C050A5F38222C058EA530084A
FCBBB702DC7811EC9E5C92BC652FB64F
423F56672D20B6FB7BCA5948E55CFF27
FCBBB702DC7811EC9E5C92BC652FB64F
C6ADD7929003DABED0F3160D2C3DCEF5
849281F5BD236C45AB394F45C96131D2
C6ADD7929003DABED0F3160D2C3DCEF5
3A434CDFB60E0ACDA8E5448C39E1BFBA
BED1CD2A0B2D668803DC0BC9F0808E68
3A434CDFB60E0ACDA8E5448C39E1BFBA
177F90EC31D8EABFF912AAA8EB76B07E
A9AE5DC63AF58C37FACEA1611BF63E16
177F90EC31D8EABFF912AAA8EB76B07E
ED46792089418EB1C4A4C7DC4C242238
44E824E6B3B402863E6A66BD57D21C2E
ED46792089418EB1C4A4C7DC4C242238
C4200202CCFCA933829DCE18A450525A
80C826E47F48ABB5BCF7A8A5F3824E74
C4200202CCFCA933829DCE18A450525A
AF65F6FAFF0C5D40ED17055105AC7FB5
2FADD01E8044F6F551E0ADF4F62E31C1
AF65F6FAFF0C5D40ED17055105AC7FB5
02AED99536B634F09D221CF37577515D
2D03098BB6F2C205CCC2B1078359609C
02AED99536B634F09D221CF37577515D
254E06D67742F35411B515ED95177DAA
084D0F5DC1B03151DD77A4EA164E1D36
254E06D67742F35411B515ED95177DAA
3EA8A72156D39B9149F982C03BDC3D1A
36E5A87C9763AAC0948E262A2D92202C
3EA8A72156D39B9149F982C03BDC3D1A
7E6248002557E5FCD1C4547C4C1AD010
4887E07CB2344F3C454A72566188F03C
7E6248002557E5FCD1C4547C4C1AD010
3574D493E09D14A7E48949350BABC134
7DF334EF52A95B9BA1C33B636A233108
3574D493E09D14A7E48949350BABC134
424F263288A89938B3A1F415495F661C
3FBC12DDDA01C2A31262CF76237C5714
424F263288A89938B3A1F415495F661C
E35428A290869A678352BA6D6E30A113
DCE83A7F4A8758C49130751B4D4CF607
E35428A290869A678352BA6D6E30A113
8BBCDF639BD5780FDA494595C9A9454E
5754E51CD15220CB4B79308E84E5B349
8BBCDF639BD5780FDA494595C9A9454E
BBD9E6BC00EEE6700EB53AFF061BB115
EC8D03A0D1BCC6BB45CC0A7182FE025C
BBD9E6BC00EEE6700EB53AFF061BB115
D3C2753CFE39A4BA8BCD7E6E1221E62D
3F4F769C2F856201CE01741F90DFE471
D3C2753CFE39A4BA8BCD7E6E1221E62D
64BF02963ADB33ED277DAA571018DAA8
5BF0740A155E51ECE97CDE4880C73ED9
64BF02963ADB33ED277DAA571018DAA8
381D4569272D8F0A9E8C4EB74A4851DB
63ED31633273DEE677F090FFCA8F6F02
381D4569272D8F0A9E8C4EB74A4851DB
D3C0A949B5396733FE9F5DA72251A34B
B02D982A874AB9D5896FCD58E8DECC49
D3C0A949B5396733FE9F5DA72251A34B
35EA3C1F86E819AE445888A9EEE2B360
85C7A43501A2A07BCD3745F1063C7F29
35EA3C1F86E819AE445888A9EEE2B360
15E3AC2B4EFBE5C6ACF1089E01296448
9024081E4F5945BD61C64D6F07151B61
15E3AC2B4EFBE5C6ACF1089E01296448
B930304B28B00FA8CE9A6F5C37582380
2914385567E94A15AF5C2233304D38E1
B930304B28B00FA8CE9A6F5C37582380
BBC352FC06C9B7324D31D2ADA8CC4885
92D76AA96120FD27E26DF09E98817064
BBC352FC06C9B7324D31D2ADA8CC4885
8F2AA3E2BF0DA805A7831081D6DB7CD5
1DFDC94BDE2D552245EEE01F4E5A0CB1
8F2AA3E2BF0DA805A7831081D6DB7CD5
3A9CB1D1B001ED20BB033D4C2FBE15CB
2761789A6E2CB802FEEDDD5361E4197A
3A9CB1D1B001ED20BB033D4C2FBE15CB
1923439531DF3254AC35DCAAD4EDABAA
3E423B0F5FF38A5652D801F9B509B2D0
1923439531DF3254AC35DCAAD4EDABAA
D04E3BC48BA20D40DA63CA47F50E06D0
EE0C00CBD451871688BBCBBE4007B400
D04E3BC48BA20D40DA63CA47F50E06D0
5254203D48713C5F7118BD7B091B0D30
BC5820F69C20BB49F9A376C5491CB930
5254203D48713C5F7118BD7B091B0D30
0813D186D36F6223E952D563E5AF8F38
B44BF1704F4FD96A10F1A3A6ACB33608
0813D186D36F6223E952D563E5AF8F38
8890B06B1262E93B0FAB43869CB294E2
3CDB411B5D2D30511F5AE0203001A2EA
8890B06B1262E93B0FAB43869CB294E2
B8DB57655F98BB452E0EFA993392F527
8400167E02B58B1431541AB9039357CD
B8DB57655F98BB452E0EFA993392F527
0FE0B8F28632CC53E2B473E26B2712BB
8BE0AE8C84874747D3E0695B68B44576
0FE0B8F28632CC53E2B473E26B2712BB
D93E5EEEA1A238151EF9502CF8470EA8
52DEF06225257F52CD19397790F34BDE
D93E5EEEA1A238151EF9502CF8470EA8
B0985EEB0876F6DEE45178468B68D340
E246AE892D53898C294841311B9B989E
B0985EEB0876F6DEE45178468B68D340
96A98B6DBFFD0B840B3006B90E5E2493
74EF25E492AE82082278478815C5BC0D
96A98B6DBFFD0B840B3006B90E5E2493
4E951F8044D19EB2408D94FC619BE566
3A7A3A64D67F1CBA62F5D374745E596B
4E951F8044D19EB2408D94FC619BE566
396809B9A2ECF11833ABB5747BE0D483
031233DD7493EDA2515E66000FBE8DE8
396809B9A2ECF11833ABB5747BE0D483
EE4536FA15B1CCFAAA8D9A290846F03E
ED57052761222158FBD3FC2907F87DD6
EE4536FA15B1CCFAAA8D9A290846F03E
536295B5C0039FD47BC4D76A88F61BB4
BE359092A121BE8C80172B438F0E6662
536295B5C0039FD47BC4D76A88F61BB4
5002C2F4CC9B87A1348DD57FFAA52347
EE3752666DBA392DB49AFE3C75AB4525
5002C2F4CC9B87A1348DD57FFAA52347
54AC4630D92CF8F5F6559CC59B9B6E6D
BA9B1456B496C1D842CF62F9EE302B48
54AC4630D92CF8F5F6559CC59B9B6E6D
464B4110DCC4FEE7137883A3F6439920
FCD0554668523F3F51B7E15A1873B268
464B4110DCC4FEE7137883A3F6439920
92B4B683AD3079ACE7F409373C83F3BD
6E64E3C5C5624693B643E86D24F041D5
92B4B683AD3079ACE7F409373C83F3BD
BD5B58EEC2488AC688E0EAE34AA119EC
D33FBB2B072ACC553EA3028E6E515839
BD5B58EEC2488AC688E0EAE34AA119EC
FE00A425B72123ACD92756FAAF370693
2D3F1F0EB00BEFF9E7845474C1665EAA
FE00A425B72123ACD92756FAAF370693
DF4661AD9D0B29FFE8D9F808DB035688
F2797EA32D00C6060F5DAC7C1A650822
DF4661AD9D0B29FFE8D9F808DB035688
40DF812CC77C4543B2D9D08979D4909A
B2A6FF8FEA7C8345BD847CF563B198B8
40DF812CC77C4543B2D9D08979D4909A
405116E5932735FCFD43024190B9C578
F2F7E96A795BB6B940C77EB4F3085DC0
405116E5932735FCFD43024190B9C578
88477B255CE23CF914D1B0E40E122C67
7AB0924F25B98A405416CE50FD1A71A7
88477B255CE23CF914D1B0E40E122C67
0D4F4EE0C95A87BD383EF14F98A74F44
77FFDCAFECE30DFD6C283F1F65BD3EE3
0D4F4EE0C95A87BD383EF14F98A74F44
B0E8235F5082CB40067A947752DDE135
C717FFF0BC61C6BD6A52AB683760DFD6
B0E8235F5082CB40067A947752DDE135
91235967C6E6F84A1CC4A5C07F1392CB
5634A6977A873EF776960EA848734D1D
91235967C6E6F84A1CC4A5C07F1392CB
7297A67C80DF8893D32CEF6B8C834320
24A300EBFA58B664A5BAE1C3C4F00E3D
7297A67C80DF8893D32CEF6B8C834320
761208CEDEFB9AE0042A3A5C41134B70
52B1082524A32C84A190DB9F85E3454D
761208CEDEFB9AE0042A3A5C41134B70
D5672C5B90EF6A12F98637BE9714FAA4
87D6247EB44C46965816EC2112F7BFE9
D5672C5B90EF6A12F98637BE9714FAA4
13E3A3C16E8D6FC4162C97D542C7A55C
943587BFDAC129524E3A7BF450301AB5
13E3A3C16E8D6FC4162C97D542C7A55C
9A0817D9E99A759210750985FAA196F1
0E3D9066335B5CC05E4F7271AA918C44
9A0817D9E99A759210750985FAA196F1
FF62E5E22B1609E2385FB0C389614E38
F15F7584184D55226610C2B223F0C27C
FF62E5E22B1609E2385FB0C389614E38
FBD2EDACBACD451B7774BA08FB4EB398
0A8D9828A2801039116478BAD8BE71E4
FBD2EDACBACD451B7774BA08FB4EB398
E09AB371873125CB87C059694B4BEF43
EA172B5925B135F296A421D393F59EA7
E09AB371873125CB87C059694B4BEF43
3EEB1B5BAC91763DF2614989C178FB92
D4FC3002892043CF64C5685A528D6535
3EEB1B5BAC91763DF2614989C178FB92
95888435855F4388036EF81A6212DE7F
4174B4370C7F004767AB9040309FBB4A
95888435855F4388036EF81A6212DE7F
40080B6873B7F61FE90B7B62F8137E18
017CBF5F7FC8F6588EA0EB22C88CC552
40080B6873B7F61FE90B7B62F8137E18
D5C56E02343F2AA3EE97C62F275BE9AF
D4B9D15D4BF7DCFB60372D0DEFD72CFD
D5C56E02343F2AA3EE97C62F275BE9AF
7CEED6069D47E705A38A3ADEEDC7823A
A857075BD6B03BFEC3BD17D30210AEC7
7CEED6069D47E705A38A3ADEEDC7823A
C809862CE5C77E0E8E2F6ED942007499
605E8177337745F04D92790A4010DA5E
C809862CE5C77E0E8E2F6ED942007499
3C736485566EFBDA655A5ACD7A6288B3
5C2DE5F26519BE2A28C823C73A7252ED
3C736485566EFBDA655A5ACD7A6288B3
9F98FF3B9CB864ED0DE5D072B399A6EE
C3B51AC9F9A1DAC7252DF3B589EBF403
9F98FF3B9CB864ED0DE5D072B399A6EE
4A1129FCBA2B2AC26EB8F60848649098
89A43335438AF0054B9505BDC18F649B
4A1129FCBA2B2AC26EB8F60848649098
D962ED837611FE9B8C7DB30F3D6E569D
50C6DEB6359B0E9EC7E8B6B2FCE13206
D962ED837611FE9B8C7DB30F3D6E569D
30B60F421CB2A069DF59AC4109B0048C
6070D1F42929AEF718B11AF3F551368A
30B60F421CB2A069DF59AC4109B0048C
A029062617FB93F65562B3D235E70620
C059D7D23ED23D014DD3A921C0B630AA
A029062617FB93F65562B3D235E70620
2D196011378334D7D0166C006A68B9F6
ED40B7C3095109D69DC5C521AADE895C
2D196011378334D7D0166C006A68B9F6
996248CFD3BC4EA9512AF2BE16F2CB24
7422FF0CDAED477FCCEF379FBC2C4278
996248CFD3BC4EA9512AF2BE16F2CB24
6AD7E2B113554C21C64E9E68BA892133
1EF51DBDC9B80B5E0AA1A9F706A5634B
6AD7E2B113554C21C64E9E68BA892133
D2D9F77A616AB7A881780DA1FDD1DDC1
CC2CEAC7A8D2BCF68BD9A456FB74BE8A
D2D9F77A616AB7A881780DA1FDD1DDC1
80C44C72B66B6011186FC6A0D9329F73
4CE8A6B51EB9DCE793B662F6224621F9
80C44C72B66B6011186FC6A0D9329F73
95C68FF9D104D023980C06A0A38F33B8
D92E294CCFBD0CC40BBA645681C91241
95C68FF9D104D023980C06A0A38F33B8
2A9A0BB91C1AD66BAD9E8CC69BA245EC
F3B422F5D3A7DAAFA624E8901A6B57AD
2A9A0BB91C1AD66BAD9E8CC69BA245EC
F3D8823B0937209B325FC0318A8F4463
006CA0CEDA90FA34947B28A190E413CE
F3D8823B0937209B325FC0318A8F4463
E4D0D11DBFAF24B52ACF98EE48F9622C
E4BC71D3653FDE81BEB4B04FD81D71E2
E4D0D11DBFAF24B52ACF98EE48F9622C
40D2A6D36DE1508A62D594A21E7D4DB0
A46ED70008DE8E0BDC6124EDC6603C52
40D2A6D36DE1508A62D594A21E7D4DB0
66E273561AFE607C06C6FB72BC9840A9
C28CA4561220EE77DAA7DF9F7AF87CFB
66E273561AFE607C06C6FB72BC9840A9
C07C7027DA1F0CCCF503EB69CD82F479
02F0D471C83FE2BB2FA434F6B77A8882
C07C7027DA1F0CCCF503EB69CD82F479
2EB718C5F4D8E55123008F7AECBCC4DC
2C47CCB43CE707EA0CA4BB8C5BC64C5E
2EB718C5F4D8E55123008F7AECBCC4DC
8E2C9ECE9E97397DF773CDF35AF8FB9B
A26B527AA2703E97FBD7767F013EB7C5
8E2C9ECE9E97397DF773CDF35AF8FB9B
7751070058B5BEBDDBC594F9CB3D9C49
D53A557AFAC5802A2012E286CA032B8C
7751070058B5BEBDDBC594F9CB3D9C49
482D346E86F2DAF04FC4527175673F27
9D1761147C375ADA6FD6B0F7BF6414AB
482D346E86F2DAF04FC4527175673F27
B811DAAD6D2869581E0FE9025A82F9F3
2506BBB9111F338271D959F5E5E6ED58
B811DAAD6D2869581E0FE9025A82F9F3
9CDAC6A48E41DFA0921EA132B720E621
B9DC7D1D9F5EEC22E3C7F8C752C60B79
9CDAC6A48E41DFA0921EA132B720E621
813DBD2F2ECEAD1E053A50232BC12CD7
38E1C032B190413CE6FDA8E4790727AE
813DBD2F2ECEAD1E053A50232BC12CD7
2DBD2DDF7DE9A8FB74EABFCCD221959A
155CEDEDCC79E9C792171728AB26B234
2DBD2DDF7DE9A8FB74EABFCCD221959A
87A7AB060653672016C54ADAE2E72EC8
92FB46EBCA2A8EE784D25DF249C19CFC
87A7AB060653672016C54ADAE2E72EC8
68CE13A2C55F9FC2F412C0CAAAB2E490
FA3555490F75112570C09D38E373786C
68CE13A2C55F9FC2F412C0CAAAB2E490
8AF91A0FD7770820272F69B43A995FFE
70CC4F46D802190557EFF48CD9EA2792
8AF91A0FD7770820272F69B43A995FFE
B2200D9E32DB1FEB18D56F466D3BC1AE
C2EC42D8EAD906EE4F3A9BCAB4D1E63C
B2200D9E32DB1FEB18D56F466D3BC1AE
C2D00483E0B41E5B21FDBC1D2F032CAB
003C465B0A6D18B56EC727D79BD2CA97
C2D00483E0B41E5B21FDBC1D2F032CAB
9DF308F5CFA1FA0EF0D3D709214D0CC6
9DCF4EAEC5CCE2BB9E14F0DEBA9FC651
9DF308F5CFA1FA0EF0D3D709214D0CC6
41C6093CED70F13741B9C0CD1B589CBB
DC09479228BC138CDFAD3013A1C75AEA
41C6093CED70F13741B9C0CD1B589CBB
4C33BB241F9B36414DE9E4A2E4020FFB
903AFCB6372725CD9244D4B145C55511
4C33BB241F9B36414DE9E4A2E4020FFB
FFCAD9403FA450EA7B2EBB197AFE6713
6FF025F608837527E96A6FA83F3B3202
FFCAD9403FA450EA7B2EBB197AFE6713
A86CEEE664902053FCD3575C3CBBC876
/trunk/test_vectors/twofish_ecb_tbl_testvalues_192bits.txt
0,0 → 1,147
000000000000000000000000000000000000000000000000
00000000000000000000000000000000
EFA71F788965BD4453F860178FC19101
000000000000000000000000000000000000000000000000
EFA71F788965BD4453F860178FC19101
88B2B2706B105E36B446BB6D731A1E88
EFA71F788965BD4453F860178FC191010000000000000000
88B2B2706B105E36B446BB6D731A1E88
39DA69D6BA4997D585B6DC073CA341B2
88B2B2706B105E36B446BB6D731A1E88EFA71F788965BD44
39DA69D6BA4997D585B6DC073CA341B2
182B02D81497EA45F9DAACDC29193A65
39DA69D6BA4997D585B6DC073CA341B288B2B2706B105E36
182B02D81497EA45F9DAACDC29193A65
7AFF7A70CA2FF28AC31DD8AE5DAAAB63
182B02D81497EA45F9DAACDC29193A6539DA69D6BA4997D5
7AFF7A70CA2FF28AC31DD8AE5DAAAB63
D1079B789F666649B6BD7D1629F1F77E
7AFF7A70CA2FF28AC31DD8AE5DAAAB63182B02D81497EA45
D1079B789F666649B6BD7D1629F1F77E
3AF6F7CE5BD35EF18BEC6FA787AB506B
D1079B789F666649B6BD7D1629F1F77E7AFF7A70CA2FF28A
3AF6F7CE5BD35EF18BEC6FA787AB506B
AE8109BFDA85C1F2C5038B34ED691BFF
3AF6F7CE5BD35EF18BEC6FA787AB506BD1079B789F666649
AE8109BFDA85C1F2C5038B34ED691BFF
893FD67B98C550073571BD631263FC78
AE8109BFDA85C1F2C5038B34ED691BFF3AF6F7CE5BD35EF1
893FD67B98C550073571BD631263FC78
16434FC9C8841A63D58700B5578E8F67
893FD67B98C550073571BD631263FC78AE8109BFDA85C1F2
16434FC9C8841A63D58700B5578E8F67
9594CF62D48ACD347A68A3161F0F3EE7
16434FC9C8841A63D58700B5578E8F67893FD67B98C55007
9594CF62D48ACD347A68A3161F0F3EE7
B23E8C2C731C514017D1F2B88D77D208
9594CF62D48ACD347A68A3161F0F3EE716434FC9C8841A63
B23E8C2C731C514017D1F2B88D77D208
93CC592BC96D95FA8AC32DA894F6AB89
B23E8C2C731C514017D1F2B88D77D2089594CF62D48ACD34
93CC592BC96D95FA8AC32DA894F6AB89
26516E6BD4AEF86AF4F4AD58FA41A14C
93CC592BC96D95FA8AC32DA894F6AB89B23E8C2C731C5140
26516E6BD4AEF86AF4F4AD58FA41A14C
00A8FFFAB8616BE710A6592438FC40BE
26516E6BD4AEF86AF4F4AD58FA41A14C93CC592BC96D95FA
00A8FFFAB8616BE710A6592438FC40BE
A19B811C77482D97C842EC62DB2EDCCE
00A8FFFAB8616BE710A6592438FC40BE26516E6BD4AEF86A
A19B811C77482D97C842EC62DB2EDCCE
D7FF438678D818CAA26A676342F98E8B
A19B811C77482D97C842EC62DB2EDCCE00A8FFFAB8616BE7
D7FF438678D818CAA26A676342F98E8B
84EAFFC0C091582ABB717086E0807A5F
D7FF438678D818CAA26A676342F98E8BA19B811C77482D97
84EAFFC0C091582ABB717086E0807A5F
5500AF1C79503FEF1BACF35A81DC2865
84EAFFC0C091582ABB717086E0807A5FD7FF438678D818CA
5500AF1C79503FEF1BACF35A81DC2865
7282B2F3E766C83664930A19D201D7E7
5500AF1C79503FEF1BACF35A81DC286584EAFFC0C091582A
7282B2F3E766C83664930A19D201D7E7
6796085C32FBDD2AB43E81EAC1262743
7282B2F3E766C83664930A19D201D7E75500AF1C79503FEF
6796085C32FBDD2AB43E81EAC1262743
5839F9E148B9FD2B5A52751D4F178FDC
6796085C32FBDD2AB43E81EAC12627437282B2F3E766C836
5839F9E148B9FD2B5A52751D4F178FDC
A88F34056742E55408A7A9E7B6D4C8C0
5839F9E148B9FD2B5A52751D4F178FDC6796085C32FBDD2A
A88F34056742E55408A7A9E7B6D4C8C0
9C8C304CB1F937C6E42528459FA8872F
A88F34056742E55408A7A9E7B6D4C8C05839F9E148B9FD2B
9C8C304CB1F937C6E42528459FA8872F
EA3668C0D96529A7F3BF0F7C2B5C5BE2
9C8C304CB1F937C6E42528459FA8872FA88F34056742E554
EA3668C0D96529A7F3BF0F7C2B5C5BE2
A8FB6EEFCAAF9C4041072D570984CED2
EA3668C0D96529A7F3BF0F7C2B5C5BE29C8C304CB1F937C6
A8FB6EEFCAAF9C4041072D570984CED2
ABF4662E5D50F71B15FE3B428AFE3500
A8FB6EEFCAAF9C4041072D570984CED2EA3668C0D96529A7
ABF4662E5D50F71B15FE3B428AFE3500
3B3AED23958DA6E2FA4493BCBE59A806
ABF4662E5D50F71B15FE3B428AFE3500A8FB6EEFCAAF9C40
3B3AED23958DA6E2FA4493BCBE59A806
CFBF446E33C3DCD4DD5161CA00D4BA8F
3B3AED23958DA6E2FA4493BCBE59A806ABF4662E5D50F71B
CFBF446E33C3DCD4DD5161CA00D4BA8F
072ADBFA7EB962BA199AFC720339FF29
CFBF446E33C3DCD4DD5161CA00D4BA8F3B3AED23958DA6E2
072ADBFA7EB962BA199AFC720339FF29
AAB346D9123A8140AC563EF17E7054C8
072ADBFA7EB962BA199AFC720339FF29CFBF446E33C3DCD4
AAB346D9123A8140AC563EF17E7054C8
3C7DDC5FE6E5888FE61DEDA0C69CD320
AAB346D9123A8140AC563EF17E7054C8072ADBFA7EB962BA
3C7DDC5FE6E5888FE61DEDA0C69CD320
34AA645C7E3532098ADA91BB128ED821
3C7DDC5FE6E5888FE61DEDA0C69CD320AAB346D9123A8140
34AA645C7E3532098ADA91BB128ED821
7A5D12E315038522DA01EC0834B1322C
34AA645C7E3532098ADA91BB128ED8213C7DDC5FE6E5888F
7A5D12E315038522DA01EC0834B1322C
86E235A1CB091FF7FE6FBBCA0D73BE58
7A5D12E315038522DA01EC0834B1322C34AA645C7E353209
86E235A1CB091FF7FE6FBBCA0D73BE58
F3CE81CACE5D6BA9C558111DCDB22F5D
86E235A1CB091FF7FE6FBBCA0D73BE587A5D12E315038522
F3CE81CACE5D6BA9C558111DCDB22F5D
FB30A5D67D5F5BE4048C77E2AD3BC9D1
F3CE81CACE5D6BA9C558111DCDB22F5D86E235A1CB091FF7
FB30A5D67D5F5BE4048C77E2AD3BC9D1
31E69DD3D2D90E81C9EBFAC257E9823D
FB30A5D67D5F5BE4048C77E2AD3BC9D1F3CE81CACE5D6BA9
31E69DD3D2D90E81C9EBFAC257E9823D
87579B3F19A9CDE12BB882FFEAF665AE
31E69DD3D2D90E81C9EBFAC257E9823DFB30A5D67D5F5BE4
87579B3F19A9CDE12BB882FFEAF665AE
24A8572AA844FEF25F7670FAE30F1CD2
87579B3F19A9CDE12BB882FFEAF665AE31E69DD3D2D90E81
24A8572AA844FEF25F7670FAE30F1CD2
0CFA32E5E33F3B2DAC9F34D25979319A
24A8572AA844FEF25F7670FAE30F1CD287579B3F19A9CDE1
0CFA32E5E33F3B2DAC9F34D25979319A
3C64D7FC881B9B82ABA21FF122B98F54
0CFA32E5E33F3B2DAC9F34D25979319A24A8572AA844FEF2
3C64D7FC881B9B82ABA21FF122B98F54
A794CAEE6756281B7A64894E4E4F70A8
3C64D7FC881B9B82ABA21FF122B98F540CFA32E5E33F3B2D
A794CAEE6756281B7A64894E4E4F70A8
89A9BF6B893BC5E6FEF4C77F3D0F29A6
A794CAEE6756281B7A64894E4E4F70A83C64D7FC881B9B82
89A9BF6B893BC5E6FEF4C77F3D0F29A6
5DBE44032769DF543EAD7AD13A5F3310
89A9BF6B893BC5E6FEF4C77F3D0F29A6A794CAEE6756281B
5DBE44032769DF543EAD7AD13A5F3310
DEA4F3DA75EC7A8EAC3861A9912402CD
5DBE44032769DF543EAD7AD13A5F331089A9BF6B893BC5E6
DEA4F3DA75EC7A8EAC3861A9912402CD
FB66522C332FCC4C042ABE32FA9E902F
DEA4F3DA75EC7A8EAC3861A9912402CD5DBE44032769DF54
FB66522C332FCC4C042ABE32FA9E902F
F0AB73301125FA21EF70BE5385FB76B6
FB66522C332FCC4C042ABE32FA9E902FDEA4F3DA75EC7A8E
F0AB73301125FA21EF70BE5385FB76B6
E75449212BEEF9F4A390BD860A640941
/trunk/test_vectors/twofish_ecb_decryption_monte_carlo_testvalues_192bits.txt
0,0 → 1,1200
000000000000000000000000000000000000000000000000
00000000000000000000000000000000
B4582FA55072FCFEF538F39072F234A9
372CA9B80824B018B4582FA55072FCFEF538F39072F234A9
B4582FA55072FCFEF538F39072F234A9
6F168851543EA0ADAF932CD68A3C2563
5E91A3280E919E62DB4EA7F4044C5C535AABDF46F8CE11CA
6F168851543EA0ADAF932CD68A3C2563
02CE0B206F0560B84AB8CEB08685056B
391B703B46748F28D980ACD46B493CEB101311F67E4B14A1
02CE0B206F0560B84AB8CEB08685056B
9FBE781AC7240292C4B9D2137EF9BB80
5977FFC55FF71FB7463ED4CEAC6D3E79D4AAC3E500B2AF21
9FBE781AC7240292C4B9D2137EF9BB80
189CCF7178D4FBD43AE162941241157E
43BDA8FDB3F631FB5EA21BBFD4B9C5ADEE4BA17112F3BA5F
189CCF7178D4FBD43AE162941241157E
680A22B067C46FAD966B58A12B9E9441
FED7197F74877EAA36A8390FB37DAA007820F9D0396D2E1E
680A22B067C46FAD966B58A12B9E9441
2157E3051D9A4DD689298FCEB6DE489B
D0ADDAC3AF78A16417FFDA0AAEE7E7D6F109761E8FB36685
2157E3051D9A4DD689298FCEB6DE489B
089DD062187D1451C48BED9CA1D8BA6A
BDC3FF623FC0DD1A1F620A68B69AF38735829B822E6BDCEF
089DD062187D1451C48BED9CA1D8BA6A
01D95E3D282B86BDFF040E8DD2BAF528
874AA10C068BFF7A1EBB54559EB1753ACA86950FFCD129C7
01D95E3D282B86BDFF040E8DD2BAF528
E0B45E51FA90DD84A28A7229FCA3E8D2
A77089F643B50287FE0F0A046421A8BE680CE7260072C115
E0B45E51FA90DD84A28A7229FCA3E8D2
B8C5B15027FAF6CAD757E0019410A9BE
11FA1B0CA046EC3446CABB5443DB5E74BF5B0727946268AB
B8C5B15027FAF6CAD757E0019410A9BE
3D7F95C7A27C18AE0CD2219C6E6463BD
9D53D82B92D494B57BB52E93E1A746DAB38926BBFA060B16
3D7F95C7A27C18AE0CD2219C6E6463BD
4E976563833F1EAB4F8DCF4C8F9C2D0B
70ED3FBCFA47834B35224BF062985871FC04E9F7759A261D
4E976563833F1EAB4F8DCF4C8F9C2D0B
5F167799710DC15F79B4024EB56912AE
93E0C9D39B86A3DA6A343C691395992E85B0EBB9C0F334B3
5F167799710DC15F79B4024EB56912AE
70BBCC9557F2830AFF925B82711B7D46
7431F4425DA571C81A8FF0FC44671A247A22B03BB1E849F5
70BBCC9557F2830AFF925B82711B7D46
A9AC02E9C920CC3D09470F0186C6CC79
76E25340BFAE6595B323F2158D47D6197365BF3A372E858C
A9AC02E9C920CC3D09470F0186C6CC79
6F95D3E22407563AB8308A78D26FA7B7
791587DDD2D4367DDCB621F7A9408023CB553542E541223B
6F95D3E22407563AB8308A78D26FA7B7
FE61ECB38BA07DD29089E7C13D1D0318
EA5DE131BD898B2F22D7CD4422E0FDF15BDCD283D85C2123
FE61ECB38BA07DD29089E7C13D1D0318
7B85B6D74DC6D8DDD732512E08BDA56E
A022C3198AA8CFAD59527B936F26252C8CEE83ADD0E1844D
7B85B6D74DC6D8DDD732512E08BDA56E
B04638694E42A37DB30D31F6E1E4C4B2
4D06E62A80A666A3E91443FA216486513FE3B25B310540FF
B04638694E42A37DB30D31F6E1E4C4B2
EE2A858CF5C481E07BEF872150254460
FAEC13A33CC5C36B073EC676D4A007B1440C357A6120049F
EE2A858CF5C481E07BEF872150254460
79D47AFDED20F4F1E83493470CC68465
BDD8A03ABDA551DA7EEABC8B3980F340AC38A63D6DE680FA
79D47AFDED20F4F1E83493470CC68465
39C6E696DC4289A09126CB4183CE97EC
FC0476844E79BD44472C5A1DE5C27AE03D1E6D7CEE281716
39C6E696DC4289A09126CB4183CE97EC
BB9B514D0EFAA769D64B239B1103C3B9
798A0E586AF76EB6FCB70B50EB38DD89EB554EE7FF2BD4AF
BB9B514D0EFAA769D64B239B1103C3B9
66E6CA4743424332F3DC1698FD3D3696
477DD1F18F08F1889A51C117A87A9EBB1889587F0216E239
66E6CA4743424332F3DC1698FD3D3696
A7C0DF509F9DEB46FFFDA65D7577D985
84AA94BE6DEC733D3D911E4737E775FDE774FE2277613BBC
A7C0DF509F9DEB46FFFDA65D7577D985
6914FA09BD842B8F488277CC5FFDB15B
7BAEADD0A04A40225485E44E8A635E72AFF689EE289C8AE7
6914FA09BD842B8F488277CC5FFDB15B
FB2E023EB5F8CCE152416CA322F5DD04
12FB944752DD9D18AFABE6703F9B9293FDB7E54D0A6957E3
FB2E023EB5F8CCE152416CA322F5DD04
3B06B6C87C7241AC8E0C32121CFA95BB
0C1F508C2B1710CA94AD50B843E9D33F73BBD75F1693C258
3B06B6C87C7241AC8E0C32121CFA95BB
2064A086989CCF2D1A8A59BC55CF333A
68BDC8F97AB78D8BB4C9F03EDB751C1269318EE3435CF162
2064A086989CCF2D1A8A59BC55CF333A
01DE0BD51068BA25AA5987796574CBDD
424B3AE8127515A4B517FBEBCB1DA637C368099A26283ABF
01DE0BD51068BA25AA5987796574CBDD
6128C7606898FA67409F1F2F73959CEE
3C73EB94D1EDCE7ED43F3C8BA3855C5083F716B555BDA651
6128C7606898FA67409F1F2F73959CEE
9A85BB35AC9AD23279790E8DD82ED505
C039B1EAE0F1D3EA4EBA87BE0F1F8E62FA8E18388D937354
9A85BB35AC9AD23279790E8DD82ED505
B51399472059483200753ADD45FEC98E
3B7FD92B49B29786FBA91EF92F46C650FAFB22E5C86DBADA
B51399472059483200753ADD45FEC98E
428FDE7A656738DEBAF1954E38F940E3
04A3DC797A9A6BB5B926C0834A21FE8E400AB7ABF094FA39
428FDE7A656738DEBAF1954E38F940E3
81A0D60B282BC80D93A99AF4A0860ACD
CF2C02938DCD764438861688620A3683D3A32D5F5012F0F4
81A0D60B282BC80D93A99AF4A0860ACD
B7DBB6681763D9211D5C2C2C18E69540
F8076F397E91F5878F5DA0E07569EFA2CEFF017348F465B4
B7DBB6681763D9211D5C2C2C18E69540
73483935C88D40AD51867EDE32E53AAD
2B0C9C820EAF0FF6FC1599D5BDE4AF0F9F797FAD7A115F19
73483935C88D40AD51867EDE32E53AAD
ACB8BAD902E546136964E0AF05A4DD3F
462C342FD440E6C350AD230CBF01E91CF61D9F027FB58226
ACB8BAD902E546136964E0AF05A4DD3F
D40A85FB40149D92797314E0A5F05F0D
CA9E96AF9BE5CBF884A7A6F7FF15748E8F6E8BE2DA45DD2B
D40A85FB40149D92797314E0A5F05F0D
DF6F8E74D63E908E03CA7D8F0EC19F2E
E04805219909272B5BC82883292BE4008CA4F66DD4844205
DF6F8E74D63E908E03CA7D8F0EC19F2E
90AF45A18463D85D5D0759F9DD3372B6
62A9C0E8C40FC626CB676D22AD483C5DD1A3AF9409B730B3
90AF45A18463D85D5D0759F9DD3372B6
2A92C2967C00DEBF40DA2E0CD6D3D95D
93DC0EA1BFF03F5AE1F5AFB4D148E2E291798198DF64E9EE
2A92C2967C00DEBF40DA2E0CD6D3D95D
DEE8FF584C1A291B52DF091F882E46CF
56698ACC7BC6F7E13F1D50EC9D52CBF9C3A68887574AAF21
DEE8FF584C1A291B52DF091F882E46CF
6E79BEA3F9939EACF12C188B455C9E00
AC06297E6FFCED545164EE4F64C15555328A900C12163121
6E79BEA3F9939EACF12C188B455C9E00
D4621B6A369C008D5192A80E138C1820
2F9B5911FC33B8AE8506F525525D55D863183802019A2901
D4621B6A369C008D5192A80E138C1820
D63B5F90EBFCD1A74A31FCFF0F8298AF
4514E90BD9A240B8533DAAB5B9A1847F2929C4FD0E18B1AE
D63B5F90EBFCD1A74A31FCFF0F8298AF
AE87E55C45E91E3995735BB6825109D5
FFBB845E22A640E0FDBA4FE9FC489A46BC5A9F4B8C49B87B
AE87E55C45E91E3995735BB6825109D5
FAB0D27C8D50BD5C1D472BAF54492761
9C7A6F5D92CAB36F070A9D957118271AA11DB4E4D8009F1A
FAB0D27C8D50BD5C1D472BAF54492761
85BC82CB69B9573E2DEAE8EB457CE6A4
6EEA3478871D10B082B61F5E18A170248CF75C0F9D7C79BE
85BC82CB69B9573E2DEAE8EB457CE6A4
91A4C25420DE7F9B29413EFD2F7CE998
27F62994C8BEA9221312DD0A387F0FBFA5B662F2B2009026
91A4C25420DE7F9B29413EFD2F7CE998
693A581099E1A70A2444AC8E40D05C69
026E7B38651019B67A28851AA19EA8B581F2CE7CF2D0CC4F
693A581099E1A70A2444AC8E40D05C69
21F302E4F33F48B61EF382B54540D212
EF6BB6B217C719E05BDB87FE52A1E0039F014CC9B7901E5D
21F302E4F33F48B61EF382B54540D212
5D8B568E14DF09446A4C7057F4E93100
328292440CBAD4F40650D170467EE947F54D3C9E43792F5D
5D8B568E14DF09446A4C7057F4E93100
565C0DC09B08478E1877788E9B908A00
089B5F27304A966F500CDCB0DD76AEC9ED3A4410D8E9A55D
565C0DC09B08478E1877788E9B908A00
94F99AEF75177FED907A9BFC3A32B274
C2C49A5F4CD08662C4F5465FA861D1247D40DFECE2DB1729
94F99AEF75177FED907A9BFC3A32B274
B63E3BC17A9F4DF87CD2F9D31AF2DC89
91F380D940AC6DA072CB7D9ED2FE9CDC0192263FF829CBA0
B63E3BC17A9F4DF87CD2F9D31AF2DC89
6A9EAFEA3F5691DCFA060926FD12FAD5
967141A3D8431CCE1855D274EDA80D00FB942F19053B3175
6A9EAFEA3F5691DCFA060926FD12FAD5
588D71854B8014BB6D4FCA47E256C015
D345A04D2E88099140D8A3F1A62819BB96DBE55EE76DF160
588D71854B8014BB6D4FCA47E256C015
87CBC5411FD7BDFEB108BC4E16993E7E
085A0E090792403AC71366B0B9FFA44527D35910F1F4CF1E
87CBC5411FD7BDFEB108BC4E16993E7E
C3A00D84EF791F5A90A70587379A35F6
09F1A38E54D1BFAB04B36B345686BB1FB7745C97C66EFAE8
C3A00D84EF791F5A90A70587379A35F6
193062C819EF6FE8C12AC76F4C56B3D4
ACF1739A73C811191D8309FC4F69D4F7765E9BF88A38493C
193062C819EF6FE8C12AC76F4C56B3D4
3CB806771D6DDE38FFA26078A2CB52FF
FF8ABCB7A7E05270213B0F8B52040ACF89FCFB8028F31BC3
3CB806771D6DDE38FFA26078A2CB52FF
E9078AAF7F774B834DD383722FE0663E
F7146317743D38F3C83C85242D73414CC42F78F207137DFD
E9078AAF7F774B834DD383722FE0663E
896D3DB0E424DAE1D94D8CD9249AC332
06F30588EDA818614151B894C9579BAD1D62F42B2389BECF
896D3DB0E424DAE1D94D8CD9249AC332
D4DD1919B7C2EB5C9F0F5EEF95126F42
66F92B8FDDC1CF0A958CA18D7E9570F1826DAAC4B69BD18D
D4DD1919B7C2EB5C9F0F5EEF95126F42
261D53D23F19DD72A8DBD19BDFA40406
D76C3670E1F6877EB391F25F418CAD832AB67B5F693FD58B
261D53D23F19DD72A8DBD19BDFA40406
5DC59CC804B35650BE64B9E56C2E0CCF
46C874E20624D7DFEE546E97453FFBD394D2C2BA0511D944
5DC59CC804B35650BE64B9E56C2E0CCF
F2E66CACBB5EDDA90FE434A76C05AC60
6B20DFDB58D782501CB2023BFE61267A9B36F61D69147524
F2E66CACBB5EDDA90FE434A76C05AC60
7ACE6880B93C1EE2E7C84FF54AEE5EB0
0413F7A4924471A9667C6ABB475D38987CFEB9E823FA2B94
7ACE6880B93C1EE2E7C84FF54AEE5EB0
0F21B52A040B6B3D0ABF570D8C7B0D27
7890A4AC975ECECA695DDF91435653A57641EEE5AF8126B3
0F21B52A040B6B3D0ABF570D8C7B0D27
26C0D652CD82519962B8B6D14567A50E
B58CF235F6C60DF34F9D09C38ED4023C14F95834EAE683BD
26C0D652CD82519962B8B6D14567A50E
1B9992FC4E01CE2CB909F5EE0F398587
FC2F15D1B45AE1AB54049B3FC0D5CC10ADF0ADDAE5DF063A
1B9992FC4E01CE2CB909F5EE0F398587
45E98F8651EB08DB72CE06FBFE1AE248
0CB2604E6F837EA011ED14B9913EC4CBDF3EAB211BC5E472
45E98F8651EB08DB72CE06FBFE1AE248
C20F387A649C6242344E9FCF058D3852
ECEFC4395F14D276D3E22CC3F5A2A689EB7034EE1E48DC20
C20F387A649C6242344E9FCF058D3852
8F8926FB61A0975610D20237F15F870F
8A6D8EACD60EEB545C6B0A38940231DFFBA236D9EF175B2F
8F8926FB61A0975610D20237F15F870F
2814DA447D3851E2A24073BF230D3A3F
894C83EEB3F32C4E747FD07CE93A603D59E24566CC1A6110
2814DA447D3851E2A24073BF230D3A3F
AEE34F8399BEF560BC69D9DA80299588
3550A274C9A5488FDA9C9FFF7084955DE58B9CBC4C33F498
AEE34F8399BEF560BC69D9DA80299588
6702B4DD7FFAF09733E59C7983B2C7D1
6A3AFF154C80A108BD9E2B220F7E65CAD66E00C5CF813349
6702B4DD7FFAF09733E59C7983B2C7D1
02568409CB3DDB7AA82FBE4B1A1E7C1A
0B4E59964BA25DD9BFC8AF2BC443BEB07E41BE8ED59F4F53
02568409CB3DDB7AA82FBE4B1A1E7C1A
D44425B4BDD2BECB4C0DACEF6D932941
CB7EE78519844ABD6B8C8A9F7991007B324C1261B80C6612
D44425B4BDD2BECB4C0DACEF6D932941
744BCF348C5135231A9E40D3BA79D0A9
31667DE6A133C2881FC745ABF5C0355828D252B20275B6BB
744BCF348C5135231A9E40D3BA79D0A9
44097B0E98C9930DEB06E9F8470FF06A
E82F4B2D797C36095BCE3EA56D09A655C3D4BB4A457A46D1
44097B0E98C9930DEB06E9F8470FF06A
9B4650C55EE0862C891355A8F6BD71E1
288092405487D598C0886E6033E920794AC7EEE2B3C73730
9B4650C55EE0862C891355A8F6BD71E1
9377269EB890354F753C91344F3879DC
24AD7C15416C403E53FF48FE8B7915363FFB7FD6FCFF4EEC
9377269EB890354F753C91344F3879DC
BEB0AA708936954112484126F04BE9EF
CABC406EF241DD77ED4FE28E024F80772DB33EF00CB4A703
BEB0AA708936954112484126F04BE9EF
DB66B831ED7A2A2202C03EFF014F5E22
913E066DC805ECD136295ABFEF35AA552F73000F0DFBF921
DB66B831ED7A2A2202C03EFF014F5E22
958B167F19813EB5C20B80895F34E5BF
215BF61090259956A3A24CC0F6B494E0ED78808652CF1C9E
958B167F19813EB5C20B80895F34E5BF
71DD94AD5E2583B6641E53AF88850E12
59D45C8FEC48942FD27FD86DA89117568966D329DA4A128C
71DD94AD5E2583B6641E53AF88850E12
84ADC1A0013DA900EFFDB0F7E99E1BB7
3A4001E78BD911A056D219CDA9ACBE56669B63DE33D4093B
84ADC1A0013DA900EFFDB0F7E99E1BB7
BB844AA5A967CB5CE048EE6B47C2A14F
C045A1E75D04D8A0ED56536800CB750A86D38DB57416A874
BB844AA5A967CB5CE048EE6B47C2A14F
D88D3B7E5451A1D49B17B974EC69813C
71E247D43986916035DB6816549AD4DE1DC434C1987F2948
D88D3B7E5451A1D49B17B974EC69813C
5F693A68CB81C1EC08CB797D52CFB73D
A44A10AF477A6FAD6AB2527E9F1B1532150F4DBCCAB09E75
5F693A68CB81C1EC08CB797D52CFB73D
D154ADB87474D112F79E61C16C58276E
FA59BC186C908B41BBE6FFC6EB6FC420E2912C7DA6E8B91B
D154ADB87474D112F79E61C16C58276E
76DC5202F8BC64E05AFA46FFC3E9B758
964051A5AE7E524ECD3AADC413D3A0C0B86B6A8265010E43
76DC5202F8BC64E05AFA46FFC3E9B758
715893F63873A11484AD7ADA586595D8
9C71DEFC60039961BC623E322BA001D43CC610583D649B9B
715893F63873A11484AD7ADA586595D8
7E3421D25E5B5AE3E667BF403521963A
1AA41D0C47938B20C2561FE075FB5B37DAA1AF1808450DA1
7E3421D25E5B5AE3E667BF403521963A
E7B9935645C650BD5ADA663A54ACD37E
7F1EBD9A46B4D19825EF8CB6303D0B8A807BC9225CE9DEDF
E7B9935645C650BD5ADA663A54ACD37E
0B659EDF2C1A2C38540C33862F282147
FE0349D3F2AD3C372E8A12691C2727B2D477FAA473C1FF98
0B659EDF2C1A2C38540C33862F282147
7EA496D68B07EA65970B5E2E5D68299D
292A1528EF295304502E84BF9720CDD7437CA48A2EA9D605
7EA496D68B07EA65970B5E2E5D68299D
341DEEF12979D31B201C255853A3B303
32A929E11DCE1FF664336A4EBE591ECC636081D27D0A6506
341DEEF12979D31B201C255853A3B303
4C7B7EFF830399945692B6513DB4546E
FFEB99DE6B028FF1284814B13D5A875835F2378340BE3168
4C7B7EFF830399945692B6513DB4546E
2C06E830A156A194517433F57B45F6AD
550BF1F8815F53A3044EFC819C0C26CC648604763BFBC7C5
2C06E830A156A194517433F57B45F6AD
6E0ACDBE9EAA37E3593AC4F37609D32C
7874507364867F096A44313F02A6112F3DBCC0854DF214E9
6E0ACDBE9EAA37E3593AC4F37609D32C
24525DBD7767C91417D85B5060955CDC
1E4D24CB176769F64E166C8275C1D83B2A649BD52D674835
24525DBD7767C91417D85B5060955CDC
318ABED8D12BA8298CBE720C281B7B25
8BE5272DAEE773AC7F9CD25AA4EA7012A6DAE9D9057C3310
318ABED8D12BA8298CBE720C281B7B25
768C08C6FA78CB458721963367BCC6E1
CE55B75A141031AD0910DA9C5E92BB5721FB7FEA62C0F5F1
768C08C6FA78CB458721963367BCC6E1
5FE1BA5BF85E6C44E1F1E57E339F81ED
02D0329A092E568956F160C7A6CCD713C00A9A94515F741C
5FE1BA5BF85E6C44E1F1E57E339F81ED
165474E8ACB187347F634468D32F105C
B4C4DBF7F1D170E640A5142F0A7D5027BF69DEFC82706440
165474E8ACB187347F634468D32F105C
69E5B6234C0D1A98C1686230BEA736CF
52648968CDE7ED992940A20C46704ABF7E01BCCC3CD7528F
69E5B6234C0D1A98C1686230BEA736CF
B68E86ED8180A997658E43BCEF821C4C
BBCA0333679236E99FCE24E1C7F0E3281B8FFF70D3554EC3
B68E86ED8180A997658E43BCEF821C4C
EA463E1B2226C13DAA5F190D915F22DD
40950F8292C790D775881AFAE5D62215B1D0E67D420A6C1E
EA463E1B2226C13DAA5F190D915F22DD
0E24085F6B25ED9204A84BB5634F52E4
55A5E0A372216D367BAC12A58EF3CF87B578ADC821453EFA
0E24085F6B25ED9204A84BB5634F52E4
B284C40EB99C9DA9D671233B4FF4FF34
A7D02C83A7CC764EC928D6AB376F522E63098EF36EB1C1CE
B284C40EB99C9DA9D671233B4FF4FF34
7E0B40011128F3A82D63B1B0BF047EE1
7672D98BE15D3C08B72396AA2647A1864E6A3F43D1B5BF2F
7E0B40011128F3A82D63B1B0BF047EE1
42D4173D9AEC1A21A8951D72991DD532
346EE0453CA16105F5F78197BCABBBA7E6FF223148A86A1D
42D4173D9AEC1A21A8951D72991DD532
55B2759AC10C591716763E4367B22A28
B3C30D32951F20FEA045F40D7DA7E2B0F0891C722F1A4035
55B2759AC10C591716763E4367B22A28
6BCEB2DBD2F07AA0E9DCB7A3FCA6D00E
1C5ABBDCECBC5054CB8B46D6AF5798101955ABD1D3BC903B
6BCEB2DBD2F07AA0E9DCB7A3FCA6D00E
AEED93D54F59A8DBF4D73DC4F96C8676
1F0395B01BB5F5576566D503E00E30CBED8296152AD0164D
AEED93D54F59A8DBF4D73DC4F96C8676
448939EB419C6478983ACBA67CAB1E3D
B04F0B93BB62668421EFECE8A19254B375B85DB3567B0870
448939EB419C6478983ACBA67CAB1E3D
9CDD4EF21BAC8CBA84A3078FBC6A3EE4
A47B957CD690CDAEBD32A21ABA3ED809F11B5A3CEA113694
9CDD4EF21BAC8CBA84A3078FBC6A3EE4
1BFBF0E0FC8AC1D72BA94CA2F31F63C3
F188D0D4F73F5596A6C952FA46B419DEDAB2169E190E5557
1BFBF0E0FC8AC1D72BA94CA2F31F63C3
072F5CE6B795A3AC312C446FA4F58A7E
4CABB12DC8078EBEA1E60E1CF121BA72EB9E52F1BDFBDF29
072F5CE6B795A3AC312C446FA4F58A7E
D12539E93B45F0A872B55F029BCB66BD
3BC30821D48AC28770C337F5CA644ADA992B0DF32630B994
D12539E93B45F0A872B55F029BCB66BD
68ACA6D99335C9DC325606B0A14FB41F
E6601E511623FDFF186F912C59518306AB7D0B43877F0D8B
68ACA6D99335C9DC325606B0A14FB41F
5CB21044B45E8F3F62934EA9EF6AD4B0
ECF10C9B3B045C9644DD8168ED0F0C39C9EE45EA6815D93B
5CB21044B45E8F3F62934EA9EF6AD4B0
3AA80AE537F6A80DD51F515DA5FDA1B7
FFAE28CE29B31C497E758B8DDAF9A4341CF114B7CDE8788C
3AA80AE537F6A80DD51F515DA5FDA1B7
33E90B3232835AAE4095CC18B59F13AC
C88064321C0CE87B4D9C80BFE87AFE9A5C64D8AF78776B20
33E90B3232835AAE4095CC18B59F13AC
A1F3F0273CE24A8DEAD5C26AEF914F49
5C4D6DCFD5BF6B6AEC6F7098D498B417B6B11AC597E62469
A1F3F0273CE24A8DEAD5C26AEF914F49
9354C88FA3F91F1D73FAD9C9F58A2FFC
C42826EFFA58BEDD7F3BB8177761AB0AC54BC30C626C0B95
9354C88FA3F91F1D73FAD9C9F58A2FFC
4738B0255A229D4F6A2ECA95B83B0A59
601CF2F747DD1141380308322D433645AF650999DA5701CC
4738B0255A229D4F6A2ECA95B83B0A59
549053609C673CAF506A93BA3C3BD0E5
C0F53F02C289B0726C935B52B1240AEAFF0F9A23E66CD129
549053609C673CAF506A93BA3C3BD0E5
64C6F659BE61BE1578B2AEE87E45C656
79CCB805DA7365F50855AD0B0F45B4FF87BD34CB9829177F
64C6F659BE61BE1578B2AEE87E45C656
770C11F1ED21F8562FD35DDDA9C94F6F
6984C8005806949C7F59BCFAE2644CA9A86E691631E05810
770C11F1ED21F8562FD35DDDA9C94F6F
60B8A3B0CB46E01B54A5D9F98DEECB31
612390834CA760951FE11F4A2922ACB2FCCBB0EFBC0E9321
60B8A3B0CB46E01B54A5D9F98DEECB31
7355CE147DB002CF0DD3B395156C5649
C04EBA350ACBF1B36CB4D15E5492AE7DF118037AA962C568
7355CE147DB002CF0DD3B395156C5649
2D75174C00DA9E12D6AA3A10840391F4
055B2087845811A041C1C6125448306F27B2396A2D61549C
2D75174C00DA9E12D6AA3A10840391F4
8E5B8BCB3661B0FC82003B54470E2244
05EF62E1D348D862CF9A4DD962298093A5B2023E6A6F76D8
8E5B8BCB3661B0FC82003B54470E2244
24385A7A48095914CBABD3FFF6C606CB
15022BD6ECB4EBFBEBA217A32A20D9876E19D1C19CA97013
24385A7A48095914CBABD3FFF6C606CB
51B26C9EB00EAF46328B7BE8BA2982E2
9793DEE6AC26FECFBA107B3D9A2E76C15C92AA292680F2F1
51B26C9EB00EAF46328B7BE8BA2982E2
9549FEB835F62FA51C9DCF31688C7C9A
B8EECD626D18B0FE2F598585AFD85964400F65184E0C8E6B
9549FEB835F62FA51C9DCF31688C7C9A
1F46CA3ED0E088C8E1878C0268C7C0BA
6FCA1E9D03653025301F4FBB7F38D1ACA188E91A26CB4ED1
1F46CA3ED0E088C8E1878C0268C7C0BA
98C79DB16BF4DD9A4860EFD29EDFB857
581FAF16BA55EB04A8D8D20A14CC0C36E9E806C8B814F686
98C79DB16BF4DD9A4860EFD29EDFB857
24D638588046C992660150D34EEC67E8
605DE0809D45D0658C0EEA52948AC5A48FE9561BF6F8916E
24D638588046C992660150D34EEC67E8
501A0C4484B3438F7F5E9F90F054A70B
C386603593386C18DC14E6161039862BF0B7C98B06AC3665
501A0C4484B3438F7F5E9F90F054A70B
E186E835E5293DD11E87924AFF054392
359A37C4BFA459BD3D920E23F510BBFAEE305BC1F9A975F7
E186E835E5293DD11E87924AFF054392
F6DDF0688D31779364774EA44A13EC96
B0A002E08D2AAA64CB4FFE4B7821CC698A471565B3BA9961
F6DDF0688D31779364774EA44A13EC96
BA1B8AFAD2926E2E412FE8DC5ADAC230
A02B23B58B93D5BC715474B1AAB3A247CB68FDB9E9605B51
BA1B8AFAD2926E2E412FE8DC5ADAC230
A3CB1AAF98BE131549B2D750467038EE
0786E304DDDE4E54D29F6E1E320DB15282DA2AE9AF1063BF
A3CB1AAF98BE131549B2D750467038EE
1B9AED390D55809C8F9CC603A171BB78
457C6476B642ED80C90583273F5831CE0D46ECEA0E61D8C7
1B9AED390D55809C8F9CC603A171BB78
224D72021AE8964757041E6C1DE83D7F
C399DEBF0B046DA8EB48F12525B0A7895A42F2861389E5B8
224D72021AE8964757041E6C1DE83D7F
3D1D9A6140E5F04E7DA078268A2805AE
EFE66CE75187442AD6556B44655557C727E28AA099A1E016
3D1D9A6140E5F04E7DA078268A2805AE
ED09B31C0EC9E26A1A8B5F26F610A833
47B6DFF8AA50426B3B5CD8586B9CB5AD3D69D5866FB14825
ED09B31C0EC9E26A1A8B5F26F610A833
D90BE61BA9E5DE233F873ED1D5027BFC
375F34BC98A5D09FE2573E43C2796B8E02EEEB57BAB333D9
D90BE61BA9E5DE233F873ED1D5027BFC
3615ABD544449201E3261097AEC4F790
C0069DD0403F1A93D4429596863DF98FE1C8FBC01477C449
3615ABD544449201E3261097AEC4F790
64F4047841EDFDDD6441D817F0AE2A77
634B92FE33076EC7B0B691EEC7D00452858923D7E4D9EE3E
64F4047841EDFDDD6441D817F0AE2A77
DECA1B17AB3A300A93AD6EFB96A1E373
5F0746DCFEEEAA296E7C8AF96CEA345816244D2C72780D4D
DECA1B17AB3A300A93AD6EFB96A1E373
BF1444BEBCFE1191467A9D87DDABFB80
E48B1B340CDCA178D168CE47D01425C9505ED0ABAFD3F6CD
BF1444BEBCFE1191467A9D87DDABFB80
23E77F3517963D34266675F69D3067FF
DD982F394A1831F7F28FB172C78218FD7638A55D32E39132
23E77F3517963D34266675F69D3067FF
8D0C055C9DB47336EC60AE090A4A48CA
6B02F9D83531BBD27F83B42E5A366BCB9A580B5438A9D9F8
8D0C055C9DB47336EC60AE090A4A48CA
ADE2C55C3AEAF37A0BA7BA31A845259A
21F27834A427375ED261717260DC98B191FFB16590ECFC62
ADE2C55C3AEAF37A0BA7BA31A845259A
AE6AEFDFB0AA5F659CD088D8B42E94A8
CBF135F2A3C81A377C0B9EADD076C7D40D2F39BD24C268CA
AE6AEFDFB0AA5F659CD088D8B42E94A8
C38F21FFE2B3E5F5B99FEDBCCC2F0962
4E430A1889DF5D15BF84BF5232C52221B4B0D401E8ED61A8
C38F21FFE2B3E5F5B99FEDBCCC2F0962
67470494490E213306819E0B9E739C1A
950A6F448B0A87DBD8C3BBC67BCB0312B2314A0A769EFDB2
67470494490E213306819E0B9E739C1A
CC1448D2B51D9AACDB64D6C7FD98488C
64845B592F22343314D7F314CED699BE69559CCD8B06B53E
CC1448D2B51D9AACDB64D6C7FD98488C
A5CACB61758B7014051F2097031880EB
02CE914FDD4D2C8EB11D3875BB5DE9AA6C4ABC5A881E35D5
A5CACB61758B7014051F2097031880EB
0657D465DBB3FCAF6BE6EDEFC61B6F95
13D6E9BCB0B3D481B74AEC1060EE150507AC51B54E055A40
0657D465DBB3FCAF6BE6EDEFC61B6F95
4349915B48DFD2B350B921F5974C7B9B
39C8F0FB9DA28C68F4037D4B2831C7B657157040D94921DB
4349915B48DFD2B350B921F5974C7B9B
689FCF9271E2FCE287738273813AA24D
8CA4384F72C5C6589C9CB2D959D33B54D066F23358738396
689FCF9271E2FCE287738273813AA24D
F8FBD95A3670D528CF508381570E229F
8A0AAD3BD327833564676B836FA3EE7C1F3671B20F7DA109
F8FBD95A3670D528CF508381570E229F
0EC1A09D68AD51B986C3027E129D5A8C
3F47743AA5A411596AA6CB1E070EBFC599F573CC1DE0FB85
0EC1A09D68AD51B986C3027E129D5A8C
F6E4B70D031360B6020A668477890707
CB155B87B49D445A9C427C13041DDF739BFF15486A69FC82
F6E4B70D031360B6020A668477890707
789A8D2416EA0E298B516169BA2EAEAE
F9DF61337AD27FB7E4D8F13712F7D15A10AE7421D047522C
789A8D2416EA0E298B516169BA2EAEAE
D3F07CC23A82C1BE642C5C8912DF3439
B43DEECF2FE4B52D37288DF5287510E4748228A8C2986615
D3F07CC23A82C1BE642C5C8912DF3439
868BF79683802C4E5A40E8D41DF7B63F
974C62483CE593F3B1A37A63ABF53CAA2EC2C07CDF6FD02A
868BF79683802C4E5A40E8D41DF7B63F
D20AC96572073B648167F79E96D4215E
70DB07A3D532012963A9B306D9F207CEAFA537E249BBF174
D20AC96572073B648167F79E96D4215E
D3660EBAB3F1AB62773EE477BC02BF89
A1E9836A8649E2F0B0CFBDBC6A03ACACD89BD395F5B94EFD
D3660EBAB3F1AB62773EE477BC02BF89
5E46830B64D5D546B1926E94E3F49FC3
53BC45E8E9424D00EE893EB70ED679EA6909BD01164DD13E
5E46830B64D5D546B1926E94E3F49FC3
595CC509212A5CCEB561FA56A13FD899
C0D184A7044023C8B7D5FBBE2FFC2524DC684757B77209A7
595CC509212A5CCEB561FA56A13FD899
280C3C7F5595EE47E15CF37138CC6A8F
F429E53F3C420A6D9FD9C7C17A69CB633D34B4268FBE6328
280C3C7F5595EE47E15CF37138CC6A8F
0B1377D7D9BA882725E7D16EF16ED655
055916217BA9BEC294CAB016A3D3434418D365487ED0B57D
0B1377D7D9BA882725E7D16EF16ED655
E4D85097A379636EBDAC2471F7576EAA
ADCB873B2D7158397012E08100AA202AA57F41398987DBD7
E4D85097A379636EBDAC2471F7576EAA
EAB03CF2BEC74F61306DC510546E10EE
CF28C8FAF10D6AE19AA2DC73BE6D6F4B95128429DDE9CB39
EAB03CF2BEC74F61306DC510546E10EE
7801213266A5142E80951F4A302BA8A8
DA94088BC3086987E2A3FD41D8C87B6515879B63EDC26391
7801213266A5142E80951F4A302BA8A8
C08E85998DD8F24D94CBB1DB6443FEC6
BB0163D9CEFFC614222D78D855108928814C2AB889819D57
C08E85998DD8F24D94CBB1DB6443FEC6
7D5355A7ABF9CDAF99C1FA7A2E98C845
A0D50ADC387545345F7E2D7FFEE94487188DD0C2A7195512
7D5355A7ABF9CDAF99C1FA7A2E98C845
CAE48C544D935A11BB8288D70969CDEC
C57CB955D7CF62D9959AA12BB37A1E96A30F5815AE7098FE
CAE48C544D935A11BB8288D70969CDEC
9ADCC7F0898673CEA124248899A41645
F26A55A1C8D136930F4666DB3AFC6D58022B7C9D37D48EBB
9ADCC7F0898673CEA124248899A41645
7E5D78E06FB670865668334DC4C338E0
083E11180BB2132D711B1E3B554A1DDE54434FD0F317B65B
7E5D78E06FB670865668334DC4C338E0
C266C5C963EC4F3A3641F356AED5F211
83C29AC504219B43B37DDBF236A652E46202BC865DC2444A
C266C5C963EC4F3A3641F356AED5F211
F5EC8DFA40C21F9B4751C335A8E9B994
AEF7178CCCFAB2E64691560876644D7F25537FB3F52BFDDE
F5EC8DFA40C21F9B4751C335A8E9B994
743F0EDD121B7EAB69F57F5DD912732D
F11A6E68D06E59F932AE58D5647F33D44CA600EE2C398EF3
743F0EDD121B7EAB69F57F5DD912732D
EC64C702187F80BE463C20E9E6D31A50
7D1E13BBCF0F56A4DECA9FD77C00B36A0A9A2007CAEA94A3
EC64C702187F80BE463C20E9E6D31A50
1982E89AF4C6CF658FB9A19DDAFD0AF9
071E663934BF5792C748774D88C67C0F8523819A10179E5A
1982E89AF4C6CF658FB9A19DDAFD0AF9
E86BD139472B66771EC63FB17A046981
91E26DEE3D339E942F23A674CFED1A789BE5BE2B6A13F7DB
E86BD139472B66771EC63FB17A046981
F5A5A13FBC40191C64D515F15B19E5F5
66D2772EEE8A5F01DA86074B73AD0364FF30ABDA310A122E
F5A5A13FBC40191C64D515F15B19E5F5
7B588BD3D334D5359F021831B182C4B2
1DE4EF7F828D9E4BA1DE8C98A099D6516032B3EB8088D69C
7B588BD3D334D5359F021831B182C4B2
F2EE29736FC378B4BDBB0924B3103C17
9C64A5D22E2C79775330A5EBCF5AAEE5DD89BACF3398EA8B
F2EE29736FC378B4BDBB0924B3103C17
EA93B463B8C6DB5680B0A71CAE42BC95
27C3D889A6CCB980B9A31188779C75B35D391DD39DDA561E
EA93B463B8C6DB5680B0A71CAE42BC95
C228B7F73552FC35D4A9FCBD7A2AE0DA
685D696D6C9D14C07B8BA67F42CE89868990E16EE7F0B6C4
C228B7F73552FC35D4A9FCBD7A2AE0DA
4BA77B24364F30EEA9AB1FB7B048DA15
5FA097B35A506148302CDD5B7481B968203BFED957B86CD1
4BA77B24364F30EEA9AB1FB7B048DA15
44B1ACDC5AF7117AEE3505293F4E2B9B
E60E111184947F70749D71872E76A812CE0EFBF068F6474A
44B1ACDC5AF7117AEE3505293F4E2B9B
C8FF3A90D4531A55A7C28260466B5990
9B32E93B5573676FBC624B17FA25B24769CC79902E9D1EDA
C8FF3A90D4531A55A7C28260466B5990
18221CA22B80EA46B199930837FE4C5D
4B2657161326EB25A44057B5D1A55801D855EA9819635287
18221CA22B80EA46B199930837FE4C5D
CCF0365873DD099519F1FBB667F6DB96
3332FA67742B2E7E68B061EDA2785194C1A4112E7E958911
CCF0365873DD099519F1FBB667F6DB96
A4AF8E12873D06DD65700217DB99EC98
0DFDC0464D9A983ECC1FEFFF25455749A4D41339A50C6589
A4AF8E12873D06DD65700217DB99EC98
057080A8DD48CAC2273C51348932B2DA
085F8EAA396FE90CC96F6F57F80D9D8B83E8420D2C3ED753
057080A8DD48CAC2273C51348932B2DA
4A27562143ABC28C31CCFC1533E18E60
F22D6D3A58980F4E83483976BBA65F07B224BE181FDF5933
4A27562143ABC28C31CCFC1533E18E60
8DFA73FB57E58CCA370228C18F4CA37C
FE5E1921CC38C94F0EB24A8DEC43D3CD852696D99093FA4F
8DFA73FB57E58CCA370228C18F4CA37C
D5F9554B542B132BBAB5F888236C1CA9
72A14067F0031FD8DB4B1FC6B868C0E63F936E51B3FFE6E6
D5F9554B542B132BBAB5F888236C1CA9
1BC7EC9E21202A1BA6271A1831027B21
8A7AEB0A1A616549C08CF3589948EAFD99B4744982FD9DC7
1BC7EC9E21202A1BA6271A1831027B21
CF85B8CA7F300FA43BCC8DAAD38CDAC9
ACBE645DFD4810E40F094B92E678E559A278F9E35171470E
CF85B8CA7F300FA43BCC8DAAD38CDAC9
CF102551EF58D627D652814C34F7D441
70F2D4AF0926D224C0196EC30920337E742A78AF6586934F
CF102551EF58D627D652814C34F7D441
3F5B466ECF3A79055C88DB67573A8495
AB5B7C162592F053FF4228ADC61A4A7B28A2A3C832BC17DA
3F5B466ECF3A79055C88DB67573A8495
BD67C0AAE2AFC022382E6DD181C3167D
C810CFF2C3DE84E94225E80724B58A59108CCE19B37F01A7
BD67C0AAE2AFC022382E6DD181C3167D
9DC2626DB626234F9D0745CC6A02676C
6FDE1D1E6F27DA1FDFE78A6A9293A9168D8B8BD5D97D66CB
9DC2626DB626234F9D0745CC6A02676C
F94D803CC44ECBC0E1CE7282598898A8
DB5901582DB3610426AA0A5656DD62D66C45F95780F5FE63
F94D803CC44ECBC0E1CE7282598898A8
6FB092B9FF03A5A12ECEC8ED545DE5CD
D7F605F535A1DBF8491A98EFA9DEC777428B31BAD4A81BAE
6FB092B9FF03A5A12ECEC8ED545DE5CD
796B87FF3A5027352DD9F5DEFA4BD7EE
D1E636BD1C3143CD30711F10938EE0426F52C4642EE3CC40
796B87FF3A5027352DD9F5DEFA4BD7EE
BB9566C82BD194611B6949D1028F978A
B5F18AC4995CD6718BE479D8B85F7423743B8DB52C6C5BCA
BB9566C82BD194611B6949D1028F978A
B609210EA7C1A99137F79663F44C32BC
5154B68C5843E55D3DED58D61F9EDDB243CC1BD6D8206976
B609210EA7C1A99137F79663F44C32BC
B204A46CD72AFD054B1A5223A78AF0C4
AC60094EA3E7545D8FE9FCBAC8B420B708D649F57FAA99B2
B204A46CD72AFD054B1A5223A78AF0C4
004A6BB4C73B49E51FF10F04884CB209
A48F97BCFCF7208A8FA3970E0F8F6952172746F1F7E62BBB
004A6BB4C73B49E51FF10F04884CB209
DA5A41D3B2E09D7E4E934BDF5660EA53
D2248F2D374CB9F555F9D6DDBD6FF42C59B40D2EA186C1E8
DA5A41D3B2E09D7E4E934BDF5660EA53
33A4AFF41163A02B954FB7D2462F64EF
A727ECB34E09E869665D7929AC0C5407CCFBBAFCE7A9A507
33A4AFF41163A02B954FB7D2462F64EF
5CBF30D227D063E7B4A439148347B11E
50EEB696ADD0231C3AE249FB8BDC37E0785F83E864EE1419
5CBF30D227D063E7B4A439148347B11E
0875DEDDC493D9049E8EE18664562675
7BE394345FAFA871329797264F4FEEE4E6D1626E00B8326C
0875DEDDC493D9049E8EE18664562675
612F2798009D267F1D76A4D242096B34
58D3C1007E14B79B53B8B0BE4FD2C89BFBA7C6BC42B15958
612F2798009D267F1D76A4D242096B34
48A7F0007C322088FF3CD8798BB98C82
18D03EE6A3425EF61B1F40BE33E0E813049B1EC5C908D5DA
48A7F0007C322088FF3CD8798BB98C82
C9A37D065EC3E6B14BBE9A81B8638B58
C1F10C9A34BFF512D2BC3DB86D230EA24F258444716B5E82
C9A37D065EC3E6B14BBE9A81B8638B58
4F42D42805CCB83EC64D75151A272027
AC8857E11681A4FE9DFEE99068EFB69C8968F1516B4C7EA5
4F42D42805CCB83EC64D75151A272027
6C5EFC61493AEE68B0151A0255C376B9
6E46FAE25B3CDDE6F1A015F121D558F4397DEB533E8F081C
6C5EFC61493AEE68B0151A0255C376B9
646777B614553646590571CC6F927EF2
83191DA6431A78A695C7624735806EB260789A9F511D76EE
646777B614553646590571CC6F927EF2
AF9976024A5AA7412A085D51BF408EDE
A1504DCB4FB212BD3A5E14457FDAC9F34A70C7CEEE5DF830
AF9976024A5AA7412A085D51BF408EDE
2064CAABA6D8EB4BEB96E0AA972BCCD4
0F19C3552E5FD0F91A3ADEEED90222B8A1E62764797634E4
2064CAABA6D8EB4BEB96E0AA972BCCD4
152CA8313C94F64E34692AD8F8575B81
EE675A1180BE04A60F1676DFE596D4F6958F0DBC81216F65
152CA8313C94F64E34692AD8F8575B81
1E6F4CC417A3C9456B0112238B182D3D
B5DD41800A6B705C11793A1BF2351DB3FE8E1F9F0A394258
1E6F4CC417A3C9456B0112238B182D3D
D849D9F908FFD3CF65E7E9153E769391
614309905C3BCB72C930E3E2FACACE7C9B69F68A344FD1C9
D849D9F908FFD3CF65E7E9153E769391
EB501DA0251B68D7659D295A9111DBA3
7654AE27B74B3CEB2260FE42DFD1A6ABFEF4DFD0A55E0A6A
EB501DA0251B68D7659D295A9111DBA3
93C46FD68533430305E9D7B2C85D2638
7C9D058075ED6894B1A491945AE2E5A8FB1D08626D032C52
93C46FD68533430305E9D7B2C85D2638
A70C4855541403B5E2875F4EB7C4DDD8
621070F4E17105BB16A8D9C10EF6E61D199A572CDAC7F18A
A70C4855541403B5E2875F4EB7C4DDD8
9AADDC9528E032EA4EA864113DA29E88
11EDE87C9A8908F08C0505542616D4F75732333DE7656F02
9AADDC9528E032EA4EA864113DA29E88
4EC762AF0F59689EECFE6DF0C0FA1454
9DEB7DD1770252B1C2C267FB294FBC69BBCC5ECD279F7B56
4EC762AF0F59689EECFE6DF0C0FA1454
C73D56C99ECC763A3CD96861FAC5D0A6
86D34AA4ACA01A0F05FF3132B783CA53871536ACDD5AABF0
C73D56C99ECC763A3CD96861FAC5D0A6
F336F6838A59454D9C811D6665EDB04C
05FC86A675FAD2BEF6C9C7B13DDA8F1E1B942BCAB8B71BBC
F336F6838A59454D9C811D6665EDB04C
BE2EA0EF61B4D6D31AD6F7C75493473D
5725F59717B1439448E7675E5C6E59CD0142DC0DEC245C81
BE2EA0EF61B4D6D31AD6F7C75493473D
A246073315F6EDD11E3DA929861893A9
8C3E825A64049209EAA1606D4998B41C1F7F75246A3CCF28
A246073315F6EDD11E3DA929861893A9
9C8BB129E9D64C12D6940626CBD2DA54
10AC1F040C8CD004762AD144A04EF80EC9EB7302A1EE157C
9C8BB129E9D64C12D6940626CBD2DA54
2A08B6BDB68B7A5022D22C42BC924D9B
5BDE5357BE5A590D5C2267F916C5825EEB395F401D7C58E7
2A08B6BDB68B7A5022D22C42BC924D9B
621228B90E35A0C4E7E42C6B2BBB8B25
893319C5F39C8B973E304F4018F0229A0CDD732B36C7D3C2
621228B90E35A0C4E7E42C6B2BBB8B25
E54EFEFF80071D0DF3416C843A9C75CD
2ACFC14C2C7D5B19DB7EB1BF98F73F97FF9C1FAF0C5BA60F
E54EFEFF80071D0DF3416C843A9C75CD
EC558F576E58D2B2139A3036AD60CCB6
B7651A1789F457D3372B3EE8F6AFED25EC062F99A13B6AB9
EC558F576E58D2B2139A3036AD60CCB6
2DF07D03FD41752A8FB651F7114D2B25
8F3C0B37E14490E91ADB43EB0BEE980F63B07E6EB076419C
2DF07D03FD41752A8FB651F7114D2B25
EE5064678F52B164C8FB51498FC1FC14
4254CE5D496625F9F48B278C84BC296BAB4B2F273FB7BD88
EE5064678F52B164C8FB51498FC1FC14
9A7DB6982CA271D06FEACBBE640969FA
3AA08BB6B93256426EF69114A81E58BBC4A1E4995BBED472
9A7DB6982CA271D06FEACBBE640969FA
EFCC40CF19DD5554766479C904C1025B
C1398C7F2124ECC7813AD1DBB1C30DEFB2C59D505F7FD629
EFCC40CF19DD5554766479C904C1025B
BA880B3DB81B0192E9AB20BC979C95EC
CF0FC36FCC7A2B603BB2DAE609D80C7D5B6EBDECC8E343C5
BA880B3DB81B0192E9AB20BC979C95EC
8753614C6D2D081859B11BBB9C3A5239
F65843642BB607DBBCE1BBAA64F5046502DFA65754D911FC
8753614C6D2D081859B11BBB9C3A5239
4839C36AE2B7CF7FB9D06E9E6185D254
E6A8025F6E79198CF4D878C08642CB1ABB0FC8C9355CC3A8
4839C36AE2B7CF7FB9D06E9E6185D254
4F1E34CE99A4F063255879BC05692460
8D36D963585A89DDBBC64C0E1FE63B799E57B1753035E7C8
4F1E34CE99A4F063255879BC05692460
04C7C2DF41E0DBD8F88B344252714274
AB70D56B30039E4BBF018ED15E06E0A166DC85376244A5BC
04C7C2DF41E0DBD8F88B344252714274
BC8C22D4F97E7F9100D0A542EAC0215C
1FA57794C8355DE9038DAC05A7789F30660C2075888484E0
BC8C22D4F97E7F9100D0A542EAC0215C
2BBD327B7A7EAF3A8286B3D5FEF58D8A
4DD8C43C5BFBD95B28309E7EDD06300AE48A93A07671096A
2BBD327B7A7EAF3A8286B3D5FEF58D8A
48F8963962618C382BE4E9F59ABA8E42
78C7AAA3226DE50160C80847BF67BC32CF6E7A55ECCB8728
48F8963962618C382BE4E9F59ABA8E42
319433723DEE8A0609A0BB28187860AE
679763465A44E9DF515C3B3582893634C6CEC17DF4B3E786
319433723DEE8A0609A0BB28187860AE
FDDA489B30C4101DBF37ABD3CB31B55D
3E2AAAC4209DE3DDAC8673AEB24D262979F96AAE3F8252DB
FDDA489B30C4101DBF37ABD3CB31B55D
30D9470C074F102AA0781C0DA3CC17BC
0B26735954279B1D9C5F34A2B5023603D98176A39C4E4567
30D9470C074F102AA0781C0DA3CC17BC
70783C21696FFE76385F6DB9FCE139E9
664D678CBA838ABEEC270883DC6DC875E1DE1B1A60AF7C8E
70783C21696FFE76385F6DB9FCE139E9
7551EC028C18762C23D11E1B0094F41D
685AA000ECB8086F9976E4815075BE59C20F0501603B8893
7551EC028C18762C23D11E1B0094F41D
17EFDC818C2218AA477ACB356A0A5744
61377981C56C7A508E993800DC57A6F38575CE340A31DFD7
17EFDC818C2218AA477ACB356A0A5744
5C4201FBD1A457EC0C00956675E5C1D5
965A94B22F7D8354D2DB39FB0DF3F11F89755B527FD41E02
5C4201FBD1A457EC0C00956675E5C1D5
1B061EDBD83B07DC5623C11851F2975B
07308CBFD26E3D40C9DD2720D5C8F6C3DF569A4A2E268959
1B061EDBD83B07DC5623C11851F2975B
175FD80BF99A8CB2898D76BFB0AF1B1A
AD6636CD2DFB69DFDE82FF2B2C527A7156DBECF59E899243
175FD80BF99A8CB2898D76BFB0AF1B1A
517B3A35C2B8367024BDA582A29411E9
62A6CFF3D376A8258FF9C51EEEEA4C01726649773C1D83AA
517B3A35C2B8367024BDA582A29411E9
60EA30A18FAE1B628B9A7BD17F354F03
4EB7DA2647EA9A34EF13F5BF61445763F9FC32A64328CCA9
60EA30A18FAE1B628B9A7BD17F354F03
5833281A9DB309ADC828B729CC1EFA31
1838EDA2F7570CD6B720DDA5FCF75ECE31D4858F8F363698
5833281A9DB309ADC828B729CC1EFA31
988B2C9E41969DED2A18986E298CEB05
4E97DFDFC0A606D92FABF13BBD61C3231BCC1DE1A6BADD9D
988B2C9E41969DED2A18986E298CEB05
F1A7BB8DBA584F10A49D6C1266AEDB3B
0AFA9386DC8757E9DE0C4AB607398C33BF5171F3C01406A6
F1A7BB8DBA584F10A49D6C1266AEDB3B
E9FCAF1D705FE3A0696404E859D585E5
3A4D638FCDEECD3937F0E5AB77666F93D635751B99C18343
E9FCAF1D705FE3A0696404E859D585E5
48DB90E54E77497B44E6D72B8ED74C3E
E2513B339F77C4B87F2B754E391126E892D3A2301716CF7D
48DB90E54E77497B44E6D72B8ED74C3E
BC0EADFBEBD60B00FB1B84EDE6E7B170
7381E612C07EE688C325D8B5D2C72DE869C826DDF1F17E0D
BC0EADFBEBD60B00FB1B84EDE6E7B170
AEFD18553BD167EA1A3E5343F98A2435
592A96B3EE48C7E56DD8C0E0E9164A0273F6759E087B5A38
AEFD18553BD167EA1A3E5343F98A2435
97E774DBA7F8BB68DF1E64BAA08AAB30
076928CDF5329D90FA3FB43B4EEEF16AACE81124A8F1F108
97E774DBA7F8BB68DF1E64BAA08AAB30
218772EDCF411B1C41C28FB77928C9D5
33054A53971636D9DBB8C6D681AFEA76ED2A9E93D1D938DD
218772EDCF411B1C41C28FB77928C9D5
7BA3577E919BAF6A74711DC9A9B061F2
CB79C8A0ADBEB561A01B91A81034451C995B835A7869592F
7BA3577E919BAF6A74711DC9A9B061F2
1D0EEF4BA05CAC076F7F68B54F0EA505
A585CFBE75333FE9BD157EE3B068E91BF624EBEF3767FC2A
1D0EEF4BA05CAC076F7F68B54F0EA505
8C2801D5A10F3512CD56B05B7A75E328
815A2D31C9742D67313D7F361167DC093B725BB44D121F02
8C2801D5A10F3512CD56B05B7A75E328
CA9C0A460F535D5108FC3DEC6557285F
34DFFFE9D6C97A0DFBA175701E348158338E66582845375D
CA9C0A460F535D5108FC3DEC6557285F
20D5105735C6CBC35C0A6D8271859CBB
927A101928CDE04BDB7465272BF24A9B6F840BDA59C0ABE6
20D5105735C6CBC35C0A6D8271859CBB
5B0F7B96D6EC95A63346141A7DC2102D
C04ED1A94E66E11B807B1EB1FD1EDF3D5CC21FC02402BBCB
5B0F7B96D6EC95A63346141A7DC2102D
542142FAE9AB9D9131CBAB40BD132A43
352880C7E7CF73BBD45A5C4B14B542AC6D09B48099119188
542142FAE9AB9D9131CBAB40BD132A43
83EF409E84F760155EAF617FC33AF497
3D1BA1DE4521264957B51CD5904222B933A6D5FF5A2B651F
83EF409E84F760155EAF617FC33AF497
BB2DD45D072E2CB93B9F265AB138B54B
3D53FCDD9DEDBE4DEC98C888976C0E000839F3A5EB13D054
BB2DD45D072E2CB93B9F265AB138B54B
C79DBED8CCB1444E7A151F562946C6F7
E85BE885B5D600B52B0576505BDD4A4E722CECF3C25516A3
C79DBED8CCB1444E7A151F562946C6F7
6BE709ECD6D9C2C7AC93CAFE4ABA2864
5E9721FE644BFCD840E27FBC8D048889DEBF260D88EF3EC7
6BE709ECD6D9C2C7AC93CAFE4ABA2864
6BEF6C1A480FBA3CD2D63ACD0898DE28
8A45516D2409CD6B2B0D13A6C50B32B50C691CC08077E0EF
6BEF6C1A480FBA3CD2D63ACD0898DE28
31A5C0DAEB407578FC1B3B0F5C67AEB5
FD057E0CBD0FA7CC1AA8D37C2E4B47CDF07227CFDC104E5A
31A5C0DAEB407578FC1B3B0F5C67AEB5
732DD6ABF55361ACD55BB1C80658EFB1
8417E27874C20A2B698505D7DB18266125299607DA48A1EB
732DD6ABF55361ACD55BB1C80658EFB1
C6B634BED406CE84B27A5DBDBD133738
2FABD0B3434DF4A7AF3331690F1EE8E59753CBBA675B96D3
C6B634BED406CE84B27A5DBDBD133738
7D905891DFDF22A8CDBAEF697E36174E
4032081628768541D2A369F8D0C1CA4D5AE924D3196D819D
7D905891DFDF22A8CDBAEF697E36174E
CCA298FCF96054C806D41DC7E3C9B9D5
666B2803BC105C391E01F10429A19E855C3D3914FAA43848
CCA298FCF96054C806D41DC7E3C9B9D5
7024BC00CEE583BE62D13A4C08AD353C
CB2A0D4EB7FEF9F26E254D04E7441D3B3EEC0358F2090D74
7024BC00CEE583BE62D13A4C08AD353C
28C261DC8A4516E8F770915763096F66
E662E64F376204F546E72CD86D010BD3C99C920F91006212
28C261DC8A4516E8F770915763096F66
BEBD9FDF42FFF00D7FD1FD8089A20466
E7EA3B9D2065263BF85AB3072FFEFBDEB64D6F8F18A26674
BEBD9FDF42FFF00D7FD1FD8089A20466
545C94C38D0E1BEF536FAB0F077E129C
652F3C83588F2C9EAC0627C4A2F0E031E522C4801FDC74E8
545C94C38D0E1BEF536FAB0F077E129C
3A01A304CD32DF99112D274888B78827
302FAB649C613B93960784C06FC23FA8F40FE3C8976BFCCF
3A01A304CD32DF99112D274888B78827
07DA90AC31CA3269F84B3452E78C12BE
2A97B7D9DC09A08791DD146C5E080DC10C44D79A70E7EE71
07DA90AC31CA3269F84B3452E78C12BE
8A2C66654844F91581CC8225ADDF465B
1F4731A3E13AB15E1BF17209164CF4D48D8855BFDD38A82A
8A2C66654844F91581CC8225ADDF465B
34140D50DCB1E1D11D90EB5992E83E6D
675E60D72D97D9312FE57F59CAFD15059018BEE64FD09647
34140D50DCB1E1D11D90EB5992E83E6D
423BD209DA393D25CB2C760BFC46A8D6
5F315444455543486DDEAD5010C428205B34C8EDB3963E91
423BD209DA393D25CB2C760BFC46A8D6
1518A7E14712770163CDBCB2C72B9818
F29B983C99D694A578C60AB157D65F2138F9745F74BDA689
1518A7E14712770163CDBCB2C72B9818
ABB344C0841A3909FE1A62D2D40187E5
2570022A994EA94FD3754E71D3CC6628C6E3168DA0BC216C
ABB344C0841A3909FE1A62D2D40187E5
17E91A4CEFD480A93C9862EFABF908C9
CF3155880D224B22C49C543D3C18E681FA7B74620B4529A5
17E91A4CEFD480A93C9862EFABF908C9
6DF801200115C5ACCD4F2D454E62C711
2D5829CE95526A04A964551D3D0D232D373459274527EEB4
6DF801200115C5ACCD4F2D454E62C711
9477A66FE74AE493F41B435A6FF238C9
CE9B78833108D5EB3D13F372DA47C7BEC32F1A7D2AD5D67D
9477A66FE74AE493F41B435A6FF238C9
39DF8AA58951C3D40C031EEB2E1FBA88
F05EA1F7D560BBCA04CC79D75316046ACF2C049604CA6CF5
39DF8AA58951C3D40C031EEB2E1FBA88
A0C1CE0B0DE4DE0D3A85C29231045AB9
87B9D52BF2728768A40DB7DC5EF2DA67F5A9C60435CE364C
A0C1CE0B0DE4DE0D3A85C29231045AB9
F85107581D9DD450140C3300F3FB1855
71EFA77BE2C7A0645C5CB084436F0E37E1A5F504C6352E19
F85107581D9DD450140C3300F3FB1855
40B46F72B6E581196D0D8449A75D77AA
F04E573C9D92F72D1CE8DFF6F58A8F2E8CA8714D616859B3
40B46F72B6E581196D0D8449A75D77AA
6E94D068A4E11D66D95FDA7DE6FF12BB
90A6AC4487AFAB40727C0F9E516B924855F7AB3087974B08
6E94D068A4E11D66D95FDA7DE6FF12BB
F4616E21D04AEEB83EFE58CE8946E642
23FEA30B338CD8FE861D61BF81217CF06B09F3FE0ED1AD4A
F4616E21D04AEEB83EFE58CE8946E642
8C1A80F830CAE656ECB86930E9ED8215
BDD5D775BA6195F90A07E147B1EB9AA687B19ACEE73C2F5F
8C1A80F830CAE656ECB86930E9ED8215
0C49087B312B378942A76C113968FA03
97FC48241DED9AD1064EE93C80C0AD2FC516F6DFDE54D55C
0C49087B312B378942A76C113968FA03
92FA17AC362A9289AC3623540FC81B36
8A2451368B2AF42494B4FE90B6EA3FA66920D58BD19CCE6A
92FA17AC362A9289AC3623540FC81B36
36FB4E0954E41EEAA7B1D26D59656A23
A5C0A0C59EDDB9C3A24FB099E20E214CCE9107E688F9A449
36FB4E0954E41EEAA7B1D26D59656A23
1FE1D9EEEB717B088B55553CBDA5385C
3FF44067872AC346BDAE6977097F5A4445C452DA355C9C15
1FE1D9EEEB717B088B55553CBDA5385C
1ED99FDF74DC46F7D14D99F1CE6BBCF0
FC393B7A6DAE59D0A377F6A87DA31CB39489CB2BFB3720E5
1ED99FDF74DC46F7D14D99F1CE6BBCF0
B985DBAB0BFD4FFE5A232D1332DB1C6C
8EFE2C189DC1B1D61AF22D03765E534DCEAAE638C9EC3C89
B985DBAB0BFD4FFE5A232D1332DB1C6C
E34243EAB0BDA754E717398AB164451E
5B75158AD19BD26EF9B06EE9C6E3F41929BDDFB278887997
E34243EAB0BDA754E717398AB164451E
FCF06877196FF6B929CCDCE7B35A7FAC
4A3C98C88927230E0540069EDF8C02A000710355CBD2063B
FCF06877196FF6B929CCDCE7B35A7FAC
0B5EE2E9D005651C1A8FF6A350B670D2
4577AC92B5AE945E0E1EE4770F8967BC1AFEF5F69B6476E9
0B5EE2E9D005651C1A8FF6A350B670D2
01EDE07D7BE8DCC96DAE753169A96C5F
39D8B07DE971FF490FF3040A7461BB75775080C7F2CD1AB6
01EDE07D7BE8DCC96DAE753169A96C5F
6BD48151159C35C2993B035EBF9E4AA7
5C2D4EEABEA1EA4A6427855B61FD8EB7EE6B83994D535011
6BD48151159C35C2993B035EBF9E4AA7
72A1A301E09C97022B3223332FC8DE7B
8BC11FCB6F033B041686265A816119B5C559A0AA629B8E6A
72A1A301E09C97022B3223332FC8DE7B
AAC1AD29ECC8C4E9924483AA65DF54E9
7D80D61238F986A8BC478B736DA9DD5C571D23000744DA83
AAC1AD29ECC8C4E9924483AA65DF54E9
3449C6D4DB09C5D4FBD4363EECE6CFBF
FB1137DADB2EAF81880E4DA7B6A01888ACC9153EEBA2153C
3449C6D4DB09C5D4FBD4363EECE6CFBF
A8EF951366FB5F39913E262C980ED753
D265E34814F5C96820E1D8B4D05B47B13DF7331273ACC26F
A8EF951366FB5F39913E262C980ED753
321B73FD2EE7E632E8E897A9A2CD6560
C49616B63015113512FAAB49FEBCA183D51FA4BBD161A70F
321B73FD2EE7E632E8E897A9A2CD6560
EB46C05EE7BFF6E2035F1F0B1300DD55
1EA6AF1ADD95D015F9BC6B1719035761D640BBB0C2617A5A
EB46C05EE7BFF6E2035F1F0B1300DD55
A5EDDF81D51B883FC67E56B5EB7D00D1
76AF61BF7636DAFD5C51B496CC18DF5E103EED05291C7A8B
A5EDDF81D51B883FC67E56B5EB7D00D1
A716097EFF68E2A372E2C70BA2DB27E5
44C8AA79CEBC2965FB47BDE833703DFD62DC2A0E8BC75D6E
A716097EFF68E2A372E2C70BA2DB27E5
800330E1DA44DE21CBE297EEE0CBE73F
C9BB855104FFEF4A7B448D09E934E3DCA93EBDE06B0CBA51
800330E1DA44DE21CBE297EEE0CBE73F
335A3A7357A54C97E3458652277653D3
1D81EE6833965F05481EB77ABE91AF4B4A7B3BB24C7AE982
335A3A7357A54C97E3458652277653D3
32585C83EAAA7B11F746F684F15C63BD
D6DA79EFB57EF1EE7A46EBF9543BD45ABD3DCD36BD268A3F
32585C83EAAA7B11F746F684F15C63BD
D03C94FDD1BACE02BD33749B509E3DBE
2F070E379F25FAC6AA7A7F0485811A58000EB9ADEDB8B781
D03C94FDD1BACE02BD33749B509E3DBE
56EECE797A31D89D44CDAA4104160847
1B0D84B573CE866BFC94B17DFFB0C2C544C313ECE9AEBFC6
56EECE797A31D89D44CDAA4104160847
D9B202A32695D1FBFD6533D866050DC7
F3F299BD025AB5BD2526B3DED925133EB9A620348FABB201
D9B202A32695D1FBFD6533D866050DC7
06D4B7ABDF997D45E636D07E1CE28ED7
E7123B5681913A2723F2047506BC6E7B5F90F04A93493CD6
06D4B7ABDF997D45E636D07E1CE28ED7
9A2ABAECFF947E54786630FF0FD69A23
571BF4EFED162C14B9D8BE99F928102F27F6C0B59C9FA6F5
9A2ABAECFF947E54786630FF0FD69A23
E629203A04803AFE1A7714EA04E11E45
6447382CA07B13175FF19EA3FDA82AD13D81D45F987EB8B0
E629203A04803AFE1A7714EA04E11E45
0E8DCC7A5EACE13A87D88F5EB26D77F5
4DDF720187342581517C52D9A304CBEBBA595B012A13CF45
0E8DCC7A5EACE13A87D88F5EB26D77F5
34013614353132936A2290807AB9B46A
ADA72B30B740D718657D64CD9635F978D07BCB8150AA7B2F
34013614353132936A2290807AB9B46A
DD78D43876B20BFEBF31BAFC737430C5
66E63D6C81FECE67B805B0F5E087F2866F4A717D23DE4BEA
DD78D43876B20BFEBF31BAFC737430C5
9610C506674DD68EA3D52AACB14D7FB7
F1F962ACDE04BD822E1575F387CA2408CC9F5BD19293345D
9610C506674DD68EA3D52AACB14D7FB7
3F9A6AA9233A3FDFF9201511F5057BF4
C70C8C88E7EFBCE9118F1F5AA4F01BD735BF4EC067964FA9
3F9A6AA9233A3FDFF9201511F5057BF4
D04D63748D675793B139B94F9F7622B2
9FB60DC4B5838A93C1C27C2E29974C448486F78FF8E06D1B
D04D63748D675793B139B94F9F7622B2
D25D1296645D344D1A94FA47B805FFD5
887B522AEC0306DD139F6EB84DCA78099E120DC840E592CE
D25D1296645D344D1A94FA47B805FFD5
E15EB0C3D57589CEAB36298BA3172C6D
AFD3CD5969A9E646F2C1DE7B98BFF1C735242443E3F2BEA3
E15EB0C3D57589CEAB36298BA3172C6D
EF8ADCEE9642ACEB12DB094D680CB92F
88DEC7A41A21EF9E1D4B02950EFD5D2C27FF2D0E8BFE078C
EF8ADCEE9642ACEB12DB094D680CB92F
473713019655DBD4F07037CDAD3D7B73
7776A8A8F729A0375A7C119498A886F8D78F1AC326C37CFF
473713019655DBD4F07037CDAD3D7B73
9F2B37C73485FE84D14482DDE0644213
A186572EB354C86CC5572653AC2D787C06CB981EC6A73EEC
9F2B37C73485FE84D14482DDE0644213
C262CFCA2B2DBE19DA58F5C51B643492
0774958842EB5D320735E9998700C665DC936DDBDDC30A7E
C262CFCA2B2DBE19DA58F5C51B643492
888C243464B15A0445EC13773183D948
E5EB2F42757994798FB9CDADE3B19C61997F7EACEC40D336
888C243464B15A0445EC13773183D948
CF2217025803CC49CD0CA9A4470E470F
9C359166DB7ED4D9409BDAAFBBB250285473D708AB4E9439
CF2217025803CC49CD0CA9A4470E470F
A419B6196B98A5D2262E08302F182BC0
B62DED2B9AA661BDE4826CB6D02AF5FA725DDF388456BFF9
A419B6196B98A5D2262E08302F182BC0
84FAD860CE2BF97B77E78F8EA8A080F2
C35E23FBCD756C066078B4D61E010C8105BA50B62CF63F0B
84FAD860CE2BF97B77E78F8EA8A080F2
1500CA4570616D1267AD214CC8F4711F
8AF1AA957375369575787E936E606193621771FAE4024E14
1500CA4570616D1267AD214CC8F4711F
44119E1CE86F8BBD522E640942DFE3DB
0C95A0228601170D3169E08F860FEA2E303915F3A6DDADCF
44119E1CE86F8BBD522E640942DFE3DB
5B7B02FE1BD5BAAC98107274C9A9098A
1F476EA3D0CE2FFA6A12E2719DDA5082A82967876F74A445
5B7B02FE1BD5BAAC98107274C9A9098A
702A2670AF5013074361E9699C49EC2C
7D4CE448393B67211A38C401328A4385EB488EEEF33D4869
702A2670AF5013074361E9699C49EC2C
77D3A73D0B1455D1E0A7D29500D209B1
8BED42C692E6BF236DEB633C399E16540BEF5C7BF3EF41D8
77D3A73D0B1455D1E0A7D29500D209B1
79DDFA651CABAB7DFC822FA5D4ED321F
4A59D94FAAF54C23143699592535BD29F76D73DE270273C7
79DDFA651CABAB7DFC822FA5D4ED321F
2ECEEF039791ADE5F78CA4D37BD0A34C
7FA2BAED7B48FB953AF8765AB2A410CC00E1D70D5CD2D08B
2ECEEF039791ADE5F78CA4D37BD0A34C
86C563FF19E661303E38EABC3B8B12BB
5853B450AE11DA3CBC3D15A5AB4271FC3ED93DB16759C230
86C563FF19E661303E38EABC3B8B12BB
968BC16A84558573B7FEE34BF691A463
39CEF23D602B76872AB6D4CF2F17F48F8927DEFA91C86653
968BC16A84558573B7FEE34BF691A463
AB940CD8F22173380047933380D47B12
0785F0B4703D25668122D817DD3687B789604DC9111C1D41
AB940CD8F22173380047933380D47B12
C74F2FE6A12D12BEC112987A750E5DD6
56043F537E1FB728466DF7F17C1B95094872D5B364124097
C74F2FE6A12D12BEC112987A750E5DD6
32BFE9F0515926152CEAD1135FE9E48E
EAC858453296526F74D21E012D42B31C649804A03BFBA419
32BFE9F0515926152CEAD1135FE9E48E
2FEC305D8C0DCB9BADBC5C1F320F7D10
D8B0097B42B5011A5B3E2E5CA14F7887C92458BF09F4D909
2FEC305D8C0DCB9BADBC5C1F320F7D10
2F7BE1E05B3418D2A1BFC9F69ADF1937
6CBA2AC6ACE0B0F17445CFBCFA7B6055689B9149932BC03E
2F7BE1E05B3418D2A1BFC9F69ADF1937
DD1F9A841FF4E3D719DDA95DAB114B60
EDC1671F4111A801A95A5538E58F838271463814383A8B5E
DD1F9A841FF4E3D719DDA95DAB114B60
C18F434054A1DFDCB3E2A9E5B9FCCAF1
6F0EF7D96E6A0DC868D51678B12E5C5EC2A491F181C641AF
C18F434054A1DFDCB3E2A9E5B9FCCAF1
0C66499960C11D0BA49697D00267A36E
517EA3C1405CEF5664B35FE1D1EF41556632062183A1E2C1
0C66499960C11D0BA49697D00267A36E
B90BF2702F401AE27460301998935C43
D6D64D6C0808705ADDB8AD91FEAF5BB7125236381B32BE82
B90BF2702F401AE27460301998935C43
3B3AB35365A0CC61B28FC380FB22FB4B
92E0340B2ADE4954E6821EC29B0F97D6A0DDF5B8E01045C9
3B3AB35365A0CC61B28FC380FB22FB4B
4780E597799C2931115FB468706E0B63
4508FF206C0E668FA102FB55E293BEE7B18241D0907E4EAA
4780E597799C2931115FB468706E0B63
078B5C7D340FF9E1E404508C5A0D2907
BCEC8E985E8D448DA689A728D69C47065586115CCA7367AD
078B5C7D340FF9E1E404508C5A0D2907
A9FA4AB447CF0AD87FBCF54C3D82C8B0
5E762ED2363CCEB70F73ED9C91534DDE2A3AE410F7F1AF1D
A9FA4AB447CF0AD87FBCF54C3D82C8B0
F8CABFE34774744780BF7C5207375136
A79CC1657E4E652AF7B9527FD6273999AA859842F0C6FE2B
F8CABFE34774744780BF7C5207375136
60829D12329D109983EC68A4C042B4A9
6F7EBF5FDCFB9882973BCF6DE4BA29002969F0E630844A82
60829D12329D109983EC68A4C042B4A9
AD8DD355BA0C822027F74DFAF3B69410
EB72173AF1E745743AB61C385EB6AB200E9EBD1CC332DE92
AD8DD355BA0C822027F74DFAF3B69410
0A713623451415FAF7F815787CC6CCED
5AC1E7160DC1763930C72A1B1BA2BEDAF966A864BFF4127F
0A713623451415FAF7F815787CC6CCED
5EB36F34E40C38F421E11C3856A4BD42
76513596409440B16E74452FFFAE862ED887B45CE950AF3D
5EB36F34E40C38F421E11C3856A4BD42
9C185253DEC240A4672180AFCC0A63B3
19A35C8907B4AFFCF26C177C216CC68ABFA634F3255ACC8E
9C185253DEC240A4672180AFCC0A63B3
B4DBA3FB23AAED3B42F3CBE9EFF05D4F
9990B22FF69842C346B7B48702C62BB1FD55FF1ACAAA91C1
B4DBA3FB23AAED3B42F3CBE9EFF05D4F
09387B106668B8DF1D8A2C57DDF290E9
79346480FA8BBB354F8FCF9764AE936EE0DFD34D17580128
09387B106668B8DF1D8A2C57DDF290E9
95E4073097A93DC4C74BEEE2B2D470D4
FFF02C49E013AE4FDA6BC8A7F307AEAA27943DAFA58C71FC
95E4073097A93DC4C74BEEE2B2D470D4
D714093DD3E2219AF5665F41F5A11BC5
77AF74C8C32A6B550D7FC19A20E58F30D2F262EE502D6A39
D714093DD3E2219AF5665F41F5A11BC5
8D9F6DE3110AEF56DD9E03C258416EE2
E14AFEAC4DD7F1CA80E0AC7931EF60660F6C612C086C04DB
8D9F6DE3110AEF56DD9E03C258416EE2
3A372A2C050DA35D08802C203AF398A0
/trunk/test_vectors/twofish_ecb_vt_testvalues_128bits.txt
0,0 → 1,256
80000000000000000000000000000000
73B9FF14CF2589901FF52A0D6F4B7EDE
40000000000000000000000000000000
F5A9150BAB6D6AEBD6B4F97D9E93B28B
20000000000000000000000000000000
C30F8B221FD6D3996F973CDCDC6E305C
10000000000000000000000000000000
D6A531FE826CB0454F2D567A20018CB7
08000000000000000000000000000000
B62324BE427332A6089C7BE40D40292E
04000000000000000000000000000000
929B4789E9D6940C9A158880CA21C0E2
02000000000000000000000000000000
C14830DB50BA7221B27DC033B0D8D331
01000000000000000000000000000000
743342B02EBE647AE47092D435FA60F6
00800000000000000000000000000000
4F02AF45C09373D879CD01506A4E7D14
00400000000000000000000000000000
92BC9085AB0BA8FFEC2EA6D360864817
00200000000000000000000000000000
670A4ED16EA1BDE23E16CB52DBD31CB0
00100000000000000000000000000000
A52335AA9F42886084E21400DE48B62F
00080000000000000000000000000000
A5A240EBFED79F38F31497EA4C9CFCDA
00040000000000000000000000000000
46A64A07123E1212FE9E2F30EDFD80FF
00020000000000000000000000000000
20C9F20A8045AEDEE9D6E1CDA948339A
00010000000000000000000000000000
DF1606EEF4FEE3F4FC9EC26E2AB388AB
00008000000000000000000000000000
6758972B3171F0EA46304542776337FC
00004000000000000000000000000000
EC9B591DB8476C26C3CFDA618C1DBBD8
00002000000000000000000000000000
651551E741359E0A10BB4EE6A1C07C02
00001000000000000000000000000000
88BC2BF1F8A55562B95F8547C9A19E56
00000800000000000000000000000000
1A6CCCBD8D40AA14810ED615A6A6E24D
00000400000000000000000000000000
7B68DA568ABA5AE69D93C915E37DEE91
00000200000000000000000000000000
EC3922A728DA9E4C212D910E5C4AE632
00000100000000000000000000000000
5BAC94C97A4069400875A5ABC07BCB17
00000080000000000000000000000000
F3B4662918864BA94C1CF79C73B1F259
00000040000000000000000000000000
6FBF5A9A93EFA6640AFB80D9A2D22CF7
00000020000000000000000000000000
74139BD645DED7690F606490CCA44DD2
00000010000000000000000000000000
B20F456519D353AF91C012793576F9B8
00000008000000000000000000000000
C0AD52D4B4F67A9333A5E4B1B1176EEC
00000004000000000000000000000000
797224710FD09F9830B0F160AE9051E8
00000002000000000000000000000000
73669B64C292F4461FAA3A3D091D08DA
00000001000000000000000000000000
EFE0E893CE04008935CB7D43A7DC9ADD
00000000800000000000000000000000
3B0A2D3B236324221F81BFCAE45217D8
00000000400000000000000000000000
CE6F569FC89127B1AE19466FA36DD6E4
00000000200000000000000000000000
6037FE38896C05745C58C28CDF7FF386
00000000100000000000000000000000
92F5817D0BE37241F9292F6FF918A8E5
00000000080000000000000000000000
20C9A2A684563495C255A5751C1AC01E
00000000040000000000000000000000
AC6B6DB6D069B6895F2283435D33BD43
00000000020000000000000000000000
F9354B12C2366F1CE10F9A0550281267
00000000010000000000000000000000
684FDA9FCF3B3B5648A452CDA07CF002
00000000008000000000000000000000
9BE294C97C2A963006A2BD4541DC7DB5
00000000004000000000000000000000
A984F6F70E93FE65C8798C01D4E5D30C
00000000002000000000000000000000
E06A6CE2D74DB3D78E8F5D991C322B87
00000000001000000000000000000000
646771D16BAEDAC3F8E9D00C212518A2
00000000000800000000000000000000
9D2D410DC6F3BEC913D64BDBDEF3285E
00000000000400000000000000000000
6850AFECD8064E77F4F6944BDF5B324D
00000000000200000000000000000000
2E341142550F73F4C8E9DCCC5931A158
00000000000100000000000000000000
0CA58E149C2120A8EBF9A7885A89ACBC
00000000000080000000000000000000
41EACB7F6B5F9E3E3D299CA416EA2C59
00000000000040000000000000000000
C4D45503484DBC83CB52D3DB4AD0A7CC
00000000000020000000000000000000
CC52B159C2BCF87EE5F4926C6E7B7744
00000000000010000000000000000000
7E8A4023B8890A2DBF0D54E330FDF2A2
00000000000008000000000000000000
B05E771660493DCE3A275B0252D343A7
00000000000004000000000000000000
83D0034D231E179207F6A97FB1457FEB
00000000000002000000000000000000
7132BF130E8732C41F68107F49153FF2
00000000000001000000000000000000
B93021593B9EA2588F16E87D3C5DE0EC
00000000000000800000000000000000
26031449FBD6C84201B0BFB53B2C23CA
00000000000000400000000000000000
AFC8E9D2B9BFED9CE0B898F28607DF4C
00000000000000200000000000000000
C5094DE7E36CAEBE1B76EC3AC2C875F5
00000000000000100000000000000000
7DF8910A2D256FFB5D56FD1358F131FE
00000000000000080000000000000000
D93F84C1519D6627465E984675AA800B
00000000000000040000000000000000
5F1861F1523CDA0C95644B0C4F2EE6D1
00000000000000020000000000000000
FC5C4893AD148E4134EAEB3B1B190E29
00000000000000010000000000000000
80D1463F9E9416A143B2FF69DE629510
00000000000000008000000000000000
F16305404AE6266C619DC8ACA2D492E1
00000000000000004000000000000000
3B2554E422F9CEBB8271D7A48C94E03F
00000000000000002000000000000000
18B039EECB68A05CBF8C65EE85BDC4BC
00000000000000001000000000000000
BB26ABB17AD5482B1DCC4018E7DB0950
00000000000000000800000000000000
7E7AC0FD5B98157CEAD4BBAB643BE4CA
00000000000000000400000000000000
BD8A3B64849E54CC2D8379DCA9E42FDD
00000000000000000200000000000000
58C388DFB41FF3E14394C73FD8AAC56A
00000000000000000100000000000000
944B295E23C5B2542DED57A155D33EF8
00000000000000000080000000000000
067B4DD07DCA1292CFF0D80D75BDACA5
00000000000000000040000000000000
7D7344373196C5B30676F270BFC90B07
00000000000000000020000000000000
988C5164A82254B29326C98812A716CE
00000000000000000010000000000000
8FFD48787C28542E0450FAD4CBAD34D0
00000000000000000008000000000000
C50E7CD771628964E708425160FFB02C
00000000000000000004000000000000
B293B07F92D68C18FEC1466996B78020
00000000000000000002000000000000
DE21B2A6C8D7B90A7714DB3EF5209A6B
00000000000000000001000000000000
4700E22C08FE953CABAC7E78A3F747A7
00000000000000000000800000000000
504C1D7FAE3AB9A62323F21BF9A80A67
00000000000000000000400000000000
064BA0E8ADDD8E9DF4496E6931AD25F4
00000000000000000000200000000000
51D0B15C08FF32F1DCE7B28320875566
00000000000000000000100000000000
1A20EA3DB071121460244EDE27DA7A39
00000000000000000000080000000000
0035A5F7557B1B009327109D0C62F25C
00000000000000000000040000000000
803939C10EE11BB254A7768FAD053DA4
00000000000000000000020000000000
35D493255A870959C12F26170E6A1B64
00000000000000000000010000000000
DE8381198215D45B1BE787E4E8438500
00000000000000000000008000000000
B22E9707E738F723CD9B99386CE0162E
00000000000000000000004000000000
24C65ADDE5C3CD24B75C343782E87F6E
00000000000000000000002000000000
0050FF2C1A3C2AA68207D333F9956A72
00000000000000000000001000000000
162F7B8D35C1A98305BA0FE2A91FF27A
00000000000000000000000800000000
223D6117FE4864C2B3C513EAC2A5266A
00000000000000000000000400000000
3DBF645715ED7AD1964E2DCDE2F8806A
00000000000000000000000200000000
3DBB85509557BB00FE0F2013A90A5753
00000000000000000000000100000000
F2D75E45A62D1758C7A542BC805AC482
00000000000000000000000080000000
77628153A62DFD455B1C0E5B6CE9688C
00000000000000000000000040000000
8AE9DF2D94F6E85C86459132130E1BF5
00000000000000000000000020000000
BB610990F42303F4ECCD795E16780A13
00000000000000000000000010000000
A38330C5C0B464FFD6983972CF9541CC
00000000000000000000000008000000
EFD11CA98FEBB6F1ECBEBBCB8BD5E35B
00000000000000000000000004000000
3BC6740BF141DD33D65FDEAA10BF1655
00000000000000000000000002000000
FCF7BE4B89B54547C0BEF84EB85734F6
00000000000000000000000001000000
CBF5EF38DDEBCA39F2F6BEB2F3042D96
00000000000000000000000000800000
1119C20F08D4EA77A13C331678D4D71F
00000000000000000000000000400000
5C8241DA3FB0DC7328271B9FF72C91BA
00000000000000000000000000200000
337FCEE0AD0BDCA24AF5411B69D39B37
00000000000000000000000000100000
F6C56A841A31D58A90F5693F87380A3F
00000000000000000000000000080000
DD8C11B46F768B7CB2EAEE7E3448DD37
00000000000000000000000000040000
B8EE7182E563888E4F99335CF0372598
00000000000000000000000000020000
FCA9BAD58DD9C77B0BC0E616E7DE7F2D
00000000000000000000000000010000
798DA99BEFFBF99B23A3C15A31F60CB1
00000000000000000000000000008000
015CD86F000C87948BF3591C3DE4391F
00000000000000000000000000004000
B40B9945EEF7BC52E0B244ED71FAD3D3
00000000000000000000000000002000
D9BBB27B7D8AB20241E60F04108F1E12
00000000000000000000000000001000
6EC3F259B3FA960505CDE9D20F9EB905
00000000000000000000000000000800
01C1772AD104A988B2978447B91199F0
00000000000000000000000000000400
F8D5E997A8DD1B5BBE79C9F36B94C73C
00000000000000000000000000000200
4040058B08B27B6A585F18BFDBAE3E29
00000000000000000000000000000100
55547D09ACAF0C915B24E15ABAB0C827
00000000000000000000000000000080
FD7A0B33D397DA035D146DD56C869960
00000000000000000000000000000040
80C38900313E9350219EAE9AA7DA5E1B
00000000000000000000000000000020
F50D8495C3DCBFF4DFED0736F92475BB
00000000000000000000000000000010
58A06DC5AD2D7C0550771D6E9D59D58B
00000000000000000000000000000008
EEE324733E6409500FC9F9D6DCA185E0
00000000000000000000000000000004
F97C415886D05C12598F2C95F6B3EB16
00000000000000000000000000000002
F0FC7D86D814589A09D8EC136F95A124
00000000000000000000000000000001
CA737FF1FD0FE5B8E41E90358A5F2CB1
/trunk/COPYING
0,0 → 1,339
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
 
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
 
Preamble
 
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
 
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
 
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
 
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
 
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
 
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
 
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
 
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
 
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
 
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
 
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
 
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
 
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
 
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
 
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
 
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
 
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
 
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
 
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
 
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
 
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
 
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
 
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
 
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
 
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
 
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
 
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
 
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
 
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
 
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
 
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
 
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
 
NO WARRANTY
 
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
 
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
 
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
 
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
 
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
 
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
Also add information on how to contact you by electronic and paper mail.
 
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
 
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
 
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
 
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
 
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
 
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
 
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
/trunk/vhdl/twofish_cbc_encryption_monte_carlo_testbench_128bits.vhd
0,0 → 1,413
-- Twofish_cbc_encryption_monte_carlo_testbench_128bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the Encryption Monte Carlo KAT of the twofish cipher with 128 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity cbc_encryption_monte_carlo_testbench128 is
end cbc_encryption_monte_carlo_testbench128;
 
architecture cbc_encryption128_monte_carlo_testbench_arch of cbc_encryption_monte_carlo_testbench128 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched128
port (
odd_in_tk128,
even_in_tk128 : in std_logic_vector(7 downto 0);
in_key_tk128 : in std_logic_vector(127 downto 0);
out_key_up_tk128,
out_key_down_tk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched128
port (
in_key_twk128 : in std_logic_vector(127 downto 0);
out_K0_twk128,
out_K1_twk128,
out_K2_twk128,
out_K3_twk128,
out_K4_twk128,
out_K5_twk128,
out_K6_twk128,
out_K7_twk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_encryption_round128
port (
in1_ter128,
in2_ter128,
in3_ter128,
in4_ter128,
in_Sfirst_ter128,
in_Ssecond_ter128,
in_key_up_ter128,
in_key_down_ter128 : in std_logic_vector(31 downto 0);
out1_ter128,
out2_ter128,
out3_ter128,
out4_ter128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S128
port (
in_key_ts128 : in std_logic_vector(127 downto 0);
out_Sfirst_ts128,
out_Ssecond_ts128 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_cbc_encryption_monte_carlo_testvalues_128bits.txt";
FILE output_file : text is out "twofish_cbc_encryption_monte_carlo_128bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 0 to 9999) return string is
variable our_text : string (1 to 4) := (others => ' ');
variable thousands,
hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := ((int_number mod 1000) - (int_number mod 100)) / 100;
thousands := (int_number - (int_number mod 1000)) / 1000;
our_text(1) := digit_to_char(thousands);
our_text(2) := digit_to_char(hundreds);
our_text(3) := digit_to_char(tens);
our_text(4) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
twofish_key,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal key_up,
key_down,
Sfirst,
Ssecond,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched128
port map (
in_key_twk128 => twofish_key,
out_K0_twk128 => K0,
out_K1_twk128 => K1,
out_K2_twk128 => K2,
out_K3_twk128 => K3,
out_K4_twk128 => K4,
out_K5_twk128 => K5,
out_K6_twk128 => K6,
out_K7_twk128 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K0 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K1 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K2 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K3 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched128
port map (
odd_in_tk128 => odd_number,
even_in_tk128 => even_number,
in_key_tk128 => twofish_key,
out_key_up_tk128 => key_up,
out_key_down_tk128 => key_down
);
 
producing_the_Skeys: twofish_S128
port map (
in_key_ts128 => twofish_key,
out_Sfirst_ts128 => Sfirst,
out_Ssecond_ts128 => Ssecond
);
 
the_encryption_circuit: twofish_encryption_round128
port map (
in1_ter128 => to_round(127 downto 96),
in2_ter128 => to_round(95 downto 64),
in3_ter128 => to_round(63 downto 32),
in4_ter128 => to_round(31 downto 0),
in_Sfirst_ter128 => Sfirst,
in_Ssecond_ter128 => Ssecond,
in_key_up_ter128 => key_up,
in_key_down_ter128 => key_down,
out1_ter128 => to_encr_reg128(127 downto 96),
out2_ter128 => to_encr_reg128(95 downto 64),
out3_ter128 => to_encr_reg128(63 downto 32),
out4_ter128 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K4 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K5 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K6 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K7 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
cbc_emc_proc: process
 
variable key_f, -- key input from file
pt_f, -- plaintext from file
ct_f,
iv_f : line; -- ciphertext from file
variable key_v, -- key vector input
pt_v , -- plaintext vector
ct_v,
iv_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter_10000 : integer range 0 to 9999 := 0; -- counter for the 10.000 repeats in the 400 next ones
variable counter_400 : integer range 0 to 399 := 0; -- counter for the 400 repeats
variable round : integer range 0 to 16 := 0; -- holds the rounds
variable PT, CT, CV, CTj_1 : std_logic_vector(127 downto 0) := (others => '0');
 
begin
 
while not endfile(input_file) loop
 
readline(input_file, key_f);
readline(input_file, iv_f);
readline(input_file, pt_f);
readline(input_file,ct_f);
hread(key_f,key_v);
hread(iv_f, iv_v);
hread(pt_f,pt_v);
hread(ct_f,ct_v);
 
twofish_key <= key_v;
PT := pt_v;
CV := iv_v;
 
for counter_10000 in 0 to 9999 loop
 
input_data <= PT xor CV;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
 
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00001000"; -- 8
odd_number <= "00001001"; -- 9
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector(((round*2)+8), 8);
odd_number <= conv_std_logic_vector(((round*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
 
CTj_1 := CT;
CT := output_data;
 
if ( counter_10000 = 0 ) then
PT := CV;
else
PT := CTj_1;
end if; -- counter_10000 = 0
CV := CT;
 
assert false report "I=" & to_text(counter_400) & " R=" & to_text(counter_10000) severity note;
 
end loop; -- counter_10000
 
hwrite(key_f, key_v);
hwrite(iv_f, iv_v);
hwrite(pt_f, pt_v);
hwrite(ct_f,output_data);
writeline(output_file,key_f);
writeline(output_file, iv_f);
writeline(output_file,pt_f);
writeline(output_file,ct_f);
 
assert (ct_v = output_data) report "file entry and encryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Encryption I=" & to_text(counter_400) &" OK" severity note;
 
counter_400 := counter_400 + 1;
 
end loop;
assert false report "***** CBC Encryption Monte Carlo Test with 128 bits key size ended succesfully! :) *****" severity failure;
end process cbc_emc_proc;
end cbc_encryption128_monte_carlo_testbench_arch;
 
/trunk/vhdl/twofish_cbc_encryption_monte_carlo_testbench_192bits.vhd
0,0 → 1,421
-- Twofish_cbc_encryption_monte_carlo_testbench_192bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the Encryption Monte Carlo KAT of the twofish cipher with 192 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity cbc_encryption_monte_carlo_testbench192 is
end cbc_encryption_monte_carlo_testbench192;
 
architecture cbc_encryption192_monte_carlo_testbench_arch of cbc_encryption_monte_carlo_testbench192 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched192
port (
odd_in_tk192,
even_in_tk192 : in std_logic_vector(7 downto 0);
in_key_tk192 : in std_logic_vector(191 downto 0);
out_key_up_tk192,
out_key_down_tk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched192
port (
in_key_twk192 : in std_logic_vector(191 downto 0);
out_K0_twk192,
out_K1_twk192,
out_K2_twk192,
out_K3_twk192,
out_K4_twk192,
out_K5_twk192,
out_K6_twk192,
out_K7_twk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_encryption_round192
port (
in1_ter192,
in2_ter192,
in3_ter192,
in4_ter192,
in_Sfirst_ter192,
in_Ssecond_ter192,
in_Sthird_ter192,
in_key_up_ter192,
in_key_down_ter192 : in std_logic_vector(31 downto 0);
out1_ter192,
out2_ter192,
out3_ter192,
out4_ter192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S192
port (
in_key_ts192 : in std_logic_vector(191 downto 0);
out_Sfirst_ts192,
out_Ssecond_ts192,
out_Sthird_ts192 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_cbc_encryption_monte_carlo_testvalues_192bits.txt";
FILE output_file : text is out "twofish_cbc_encryption_monte_carlo_192bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 0 to 9999) return string is
variable our_text : string (1 to 4) := (others => ' ');
variable thousands,
hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := ((int_number mod 1000) - (int_number mod 100)) / 100;
thousands := (int_number - (int_number mod 1000)) / 1000;
our_text(1) := digit_to_char(thousands);
our_text(2) := digit_to_char(hundreds);
our_text(3) := digit_to_char(tens);
our_text(4) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal twofish_key : std_logic_vector(191 downto 0);
 
signal key_up,
key_down,
Sfirst,
Ssecond,
Sthird,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched192
port map (
in_key_twk192 => twofish_key,
out_K0_twk192 => K0,
out_K1_twk192 => K1,
out_K2_twk192 => K2,
out_K3_twk192 => K3,
out_K4_twk192 => K4,
out_K5_twk192 => K5,
out_K6_twk192 => K6,
out_K7_twk192 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K0 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K1 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K2 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K3 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched192
port map (
odd_in_tk192 => odd_number,
even_in_tk192 => even_number,
in_key_tk192 => twofish_key,
out_key_up_tk192 => key_up,
out_key_down_tk192 => key_down
);
 
producing_the_Skeys: twofish_S192
port map (
in_key_ts192 => twofish_key,
out_Sfirst_ts192 => Sfirst,
out_Ssecond_ts192 => Ssecond,
out_Sthird_ts192 => Sthird
);
 
the_encryption_circuit: twofish_encryption_round192
port map (
in1_ter192 => to_round(127 downto 96),
in2_ter192 => to_round(95 downto 64),
in3_ter192 => to_round(63 downto 32),
in4_ter192 => to_round(31 downto 0),
in_Sfirst_ter192 => Sfirst,
in_Ssecond_ter192 => Ssecond,
in_Sthird_ter192 => Sthird,
in_key_up_ter192 => key_up,
in_key_down_ter192 => key_down,
out1_ter192 => to_encr_reg128(127 downto 96),
out2_ter192 => to_encr_reg128(95 downto 64),
out3_ter192 => to_encr_reg128(63 downto 32),
out4_ter192 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K4 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K5 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K6 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K7 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
cbc_emc_proc: process
 
variable key_f, -- key input from file
pt_f, -- plaintext from file
ct_f,
iv_f : line; -- ciphertext from file
variable key_v : std_logic_vector(191 downto 0); -- key vector input
variable pt_v , -- plaintext vector
ct_v,
iv_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter_10000 : integer range 0 to 9999 := 0; -- counter for the 10.000 repeats in the 400 next ones
variable counter_400 : integer range 0 to 399 := 0; -- counter for the 400 repeats
variable round : integer range 0 to 16 := 0; -- holds the rounds
variable PT, CT, CV, CTj_1 : std_logic_vector(127 downto 0) := (others => '0');
 
begin
 
 
 
while not endfile(input_file) loop
 
readline(input_file, key_f);
readline(input_file, iv_f);
readline(input_file, pt_f);
readline(input_file,ct_f);
hread(key_f,key_v);
hread(iv_f, iv_v);
hread(pt_f,pt_v);
hread(ct_f,ct_v);
 
twofish_key <= key_v;
PT := pt_v;
CV := iv_v;
 
for counter_10000 in 0 to 9999 loop
 
input_data <= PT xor CV;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
 
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00001000"; -- 8
odd_number <= "00001001"; -- 9
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector(((round*2)+8), 8);
odd_number <= conv_std_logic_vector(((round*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
 
CTj_1 := CT;
CT := output_data;
 
if ( counter_10000 = 0 ) then
PT := CV;
else
PT := CTj_1;
end if; -- counter_10000 = 0
CV := CT;
 
assert false report "I=" & to_text(counter_400) & " R=" & to_text(counter_10000) severity note;
 
end loop; -- counter_10000
 
hwrite(key_f, key_v);
hwrite(iv_f, iv_v);
hwrite(pt_f, pt_v);
hwrite(ct_f,output_data);
writeline(output_file,key_f);
writeline(output_file, iv_f);
writeline(output_file,pt_f);
writeline(output_file,ct_f);
 
assert (ct_v = output_data) report "file entry and encryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Encryption I=" & to_text(counter_400) &" OK" severity note;
 
counter_400 := counter_400 + 1;
 
end loop;
assert false report "***** CBC Encryption Monte Carlo Test with 192 bits key size ended succesfully! :) *****" severity failure;
end process cbc_emc_proc;
end cbc_encryption192_monte_carlo_testbench_arch;
 
/trunk/vhdl/twofish_ecb_encryption_monte_carlo_testbench_128bits.vhd
0,0 → 1,396
-- Twofish_ecb_encryption_monte_carlo_testbench_128bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the Encryption Monte Carlo KAT of the twofish cipher with 128 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity ecb_encryption_monte_carlo_testbench128 is
end ecb_encryption_monte_carlo_testbench128;
 
architecture ecb_encryption128_monte_carlo_testbench_arch of ecb_encryption_monte_carlo_testbench128 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched128
port (
odd_in_tk128,
even_in_tk128 : in std_logic_vector(7 downto 0);
in_key_tk128 : in std_logic_vector(127 downto 0);
out_key_up_tk128,
out_key_down_tk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched128
port (
in_key_twk128 : in std_logic_vector(127 downto 0);
out_K0_twk128,
out_K1_twk128,
out_K2_twk128,
out_K3_twk128,
out_K4_twk128,
out_K5_twk128,
out_K6_twk128,
out_K7_twk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_encryption_round128
port (
in1_ter128,
in2_ter128,
in3_ter128,
in4_ter128,
in_Sfirst_ter128,
in_Ssecond_ter128,
in_key_up_ter128,
in_key_down_ter128 : in std_logic_vector(31 downto 0);
out1_ter128,
out2_ter128,
out3_ter128,
out4_ter128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S128
port (
in_key_ts128 : in std_logic_vector(127 downto 0);
out_Sfirst_ts128,
out_Ssecond_ts128 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_ecb_encryption_monte_carlo_testvalues_128bits.txt";
FILE output_file : text is out "twofish_ecb_encryption_monte_carlo_128bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 0 to 9999) return string is
variable our_text : string (1 to 4) := (others => ' ');
variable thousands,
hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := ((int_number mod 1000) - (int_number mod 100)) / 100;
thousands := (int_number - (int_number mod 1000)) / 1000;
our_text(1) := digit_to_char(thousands);
our_text(2) := digit_to_char(hundreds);
our_text(3) := digit_to_char(tens);
our_text(4) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
twofish_key,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal key_up,
key_down,
Sfirst,
Ssecond,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched128
port map (
in_key_twk128 => twofish_key,
out_K0_twk128 => K0,
out_K1_twk128 => K1,
out_K2_twk128 => K2,
out_K3_twk128 => K3,
out_K4_twk128 => K4,
out_K5_twk128 => K5,
out_K6_twk128 => K6,
out_K7_twk128 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K0 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K1 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K2 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K3 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched128
port map (
odd_in_tk128 => odd_number,
even_in_tk128 => even_number,
in_key_tk128 => twofish_key,
out_key_up_tk128 => key_up,
out_key_down_tk128 => key_down
);
 
producing_the_Skeys: twofish_S128
port map (
in_key_ts128 => twofish_key,
out_Sfirst_ts128 => Sfirst,
out_Ssecond_ts128 => Ssecond
);
 
the_encryption_circuit: twofish_encryption_round128
port map (
in1_ter128 => to_round(127 downto 96),
in2_ter128 => to_round(95 downto 64),
in3_ter128 => to_round(63 downto 32),
in4_ter128 => to_round(31 downto 0),
in_Sfirst_ter128 => Sfirst,
in_Ssecond_ter128 => Ssecond,
in_key_up_ter128 => key_up,
in_key_down_ter128 => key_down,
out1_ter128 => to_encr_reg128(127 downto 96),
out2_ter128 => to_encr_reg128(95 downto 64),
out3_ter128 => to_encr_reg128(63 downto 32),
out4_ter128 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K4 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K5 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K6 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K7 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
ecb_emc_proc: process
 
variable key_f, -- key input from file
pt_f, -- plaintext from file
ct_f : line; -- ciphertext from file
variable key_v, -- key vector input
pt_v , -- plaintext vector
ct_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter_10000 : integer range 0 to 9999 := 0; -- counter for the 10.000 repeats in the 400 next ones
variable counter_400 : integer range 0 to 399 := 0; -- counter for the 400 repeats
variable round : integer range 0 to 16 := 0; -- holds the rounds
variable intermediate_encryption_result : std_logic_vector(127 downto 0); -- holds the intermediate encryption result
 
begin
 
 
 
while not endfile(input_file) loop
 
readline(input_file, key_f);
readline(input_file, pt_f);
readline(input_file,ct_f);
hread(key_f,key_v);
hread(pt_f,pt_v);
hread(ct_f,ct_v);
 
twofish_key <= key_v;
intermediate_encryption_result := pt_v;
 
for counter_10000 in 0 to 9999 loop
input_data <= intermediate_encryption_result;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
 
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00001000"; -- 8
odd_number <= "00001001"; -- 9
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector(((round*2)+8), 8);
odd_number <= conv_std_logic_vector(((round*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
 
intermediate_encryption_result := output_data;
 
assert false report "I=" & to_text(counter_400) & " R=" & to_text(counter_10000) severity note;
 
end loop; -- counter_10000
 
hwrite(key_f, key_v);
hwrite(pt_f, pt_v);
hwrite(ct_f,output_data);
writeline(output_file,key_f);
writeline(output_file,pt_f);
writeline(output_file,ct_f);
 
assert (ct_v = output_data) report "file entry and encryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Encryption I=" & to_text(counter_400) &" OK" severity note;
counter_400 := counter_400 + 1;
end loop;
assert false report "***** ECB Encryption Monte Carlo Test with 128 bits key size ended succesfully! :) *****" severity failure;
end process ecb_emc_proc;
end ecb_encryption128_monte_carlo_testbench_arch;
 
/trunk/vhdl/twofish_ecb_encryption_monte_carlo_testbench_192bits.vhd
0,0 → 1,402
-- Twofish_ecb_encryption_monte_carlo_testbench_192bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the Encryption Monte Carlo KAT of the twofish cipher with 192 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity ecb_encryption_monte_carlo_testbench192 is
end ecb_encryption_monte_carlo_testbench192;
 
architecture ecb_encryption192_monte_carlo_testbench_arch of ecb_encryption_monte_carlo_testbench192 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched192
port (
odd_in_tk192,
even_in_tk192 : in std_logic_vector(7 downto 0);
in_key_tk192 : in std_logic_vector(191 downto 0);
out_key_up_tk192,
out_key_down_tk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched192
port (
in_key_twk192 : in std_logic_vector(191 downto 0);
out_K0_twk192,
out_K1_twk192,
out_K2_twk192,
out_K3_twk192,
out_K4_twk192,
out_K5_twk192,
out_K6_twk192,
out_K7_twk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_encryption_round192
port (
in1_ter192,
in2_ter192,
in3_ter192,
in4_ter192,
in_Sfirst_ter192,
in_Ssecond_ter192,
in_Sthird_ter192,
in_key_up_ter192,
in_key_down_ter192 : in std_logic_vector(31 downto 0);
out1_ter192,
out2_ter192,
out3_ter192,
out4_ter192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S192
port (
in_key_ts192 : in std_logic_vector(191 downto 0);
out_Sfirst_ts192,
out_Ssecond_ts192,
out_Sthird_ts192 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_ecb_encryption_monte_carlo_testvalues_192bits.txt";
FILE output_file : text is out "twofish_ecb_encryption_monte_carlo_192bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 0 to 9999) return string is
variable our_text : string (1 to 4) := (others => ' ');
variable thousands,
hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := ((int_number mod 1000) - (int_number mod 100)) / 100;
thousands := (int_number - (int_number mod 1000)) / 1000;
our_text(1) := digit_to_char(thousands);
our_text(2) := digit_to_char(hundreds);
our_text(3) := digit_to_char(tens);
our_text(4) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal twofish_key : std_logic_vector(191 downto 0);
 
signal key_up,
key_down,
Sfirst,
Ssecond,
Sthird,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched192
port map (
in_key_twk192 => twofish_key,
out_K0_twk192 => K0,
out_K1_twk192 => K1,
out_K2_twk192 => K2,
out_K3_twk192 => K3,
out_K4_twk192 => K4,
out_K5_twk192 => K5,
out_K6_twk192 => K6,
out_K7_twk192 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K0 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K1 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K2 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K3 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched192
port map (
odd_in_tk192 => odd_number,
even_in_tk192 => even_number,
in_key_tk192 => twofish_key,
out_key_up_tk192 => key_up,
out_key_down_tk192 => key_down
);
 
producing_the_Skeys: twofish_S192
port map (
in_key_ts192 => twofish_key,
out_Sfirst_ts192 => Sfirst,
out_Ssecond_ts192 => Ssecond,
out_Sthird_ts192 => Sthird
);
 
the_encryption_circuit: twofish_encryption_round192
port map (
in1_ter192 => to_round(127 downto 96),
in2_ter192 => to_round(95 downto 64),
in3_ter192 => to_round(63 downto 32),
in4_ter192 => to_round(31 downto 0),
in_Sfirst_ter192 => Sfirst,
in_Ssecond_ter192 => Ssecond,
in_Sthird_ter192 => Sthird,
in_key_up_ter192 => key_up,
in_key_down_ter192 => key_down,
out1_ter192 => to_encr_reg128(127 downto 96),
out2_ter192 => to_encr_reg128(95 downto 64),
out3_ter192 => to_encr_reg128(63 downto 32),
out4_ter192 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K4 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K5 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K6 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K7 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
ecb_emc_proc: process
 
variable key_f, -- key input from file
pt_f, -- plaintext from file
ct_f : line; -- ciphertext from file
variable key_v : std_logic_vector(191 downto 0); -- key vector input
variable pt_v , -- plaintext vector
ct_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter_10000 : integer range 0 to 9999 := 0; -- counter for the 10.000 repeats in the 400 next ones
variable counter_400 : integer range 0 to 399 := 0; -- counter for the 400 repeats
variable round : integer range 0 to 16 := 0; -- holds the rounds
variable intermediate_encryption_result : std_logic_vector(127 downto 0); -- holds the intermediate encryption result
 
begin
 
 
 
while not endfile(input_file) loop
 
readline(input_file, key_f);
readline(input_file, pt_f);
readline(input_file,ct_f);
hread(key_f,key_v);
hread(pt_f,pt_v);
hread(ct_f,ct_v);
 
twofish_key <= key_v;
intermediate_encryption_result := pt_v;
 
for counter_10000 in 0 to 9999 loop
input_data <= intermediate_encryption_result;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
 
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00001000"; -- 8
odd_number <= "00001001"; -- 9
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector(((round*2)+8), 8);
odd_number <= conv_std_logic_vector(((round*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
 
intermediate_encryption_result := output_data;
 
assert false report "I=" & to_text(counter_400) & " R=" & to_text(counter_10000) severity note;
 
end loop; -- counter_10000
 
hwrite(key_f, key_v);
hwrite(pt_f, pt_v);
hwrite(ct_f,output_data);
writeline(output_file,key_f);
writeline(output_file,pt_f);
writeline(output_file,ct_f);
 
assert (ct_v = output_data) report "file entry and encryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Encryption I=" & to_text(counter_400) &" OK" severity note;
counter_400 := counter_400 + 1;
end loop;
assert false report "***** ECB Encryption Monte Carlo Test with 192 bits key size ended succesfully! :) *****" severity failure;
end process ecb_emc_proc;
end ecb_encryption192_monte_carlo_testbench_arch;
 
/trunk/vhdl/twofish_ecb_vk_testbench_128bits.vhd
0,0 → 1,370
-- Twofish_ecb_vk_testbench_128bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the VARIABLE KEY KAT of the twofish cipher with 128 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity vk_testbench128 is
end vk_testbench128;
 
architecture vk_encryption128_testbench_arch of vk_testbench128 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched128
port (
odd_in_tk128,
even_in_tk128 : in std_logic_vector(7 downto 0);
in_key_tk128 : in std_logic_vector(127 downto 0);
out_key_up_tk128,
out_key_down_tk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched128
port (
in_key_twk128 : in std_logic_vector(127 downto 0);
out_K0_twk128,
out_K1_twk128,
out_K2_twk128,
out_K3_twk128,
out_K4_twk128,
out_K5_twk128,
out_K6_twk128,
out_K7_twk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_encryption_round128
port (
in1_ter128,
in2_ter128,
in3_ter128,
in4_ter128,
in_Sfirst_ter128,
in_Ssecond_ter128,
in_key_up_ter128,
in_key_down_ter128 : in std_logic_vector(31 downto 0);
out1_ter128,
out2_ter128,
out3_ter128,
out4_ter128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S128
port (
in_key_ts128 : in std_logic_vector(127 downto 0);
out_Sfirst_ts128,
out_Ssecond_ts128 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_ecb_vk_testvalues_128bits.txt";
FILE output_file : text is out "twofish_ecb_vk_128bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 1 to 129) return string is
variable our_text : string (1 to 3) := (others => ' ');
variable hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := (int_number - (int_number mod 100)) / 100;
our_text(1) := digit_to_char(hundreds);
our_text(2) := digit_to_char(tens);
our_text(3) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
twofish_key,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal key_up,
key_down,
Sfirst,
Ssecond,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched128
port map (
in_key_twk128 => twofish_key,
out_K0_twk128 => K0,
out_K1_twk128 => K1,
out_K2_twk128 => K2,
out_K3_twk128 => K3,
out_K4_twk128 => K4,
out_K5_twk128 => K5,
out_K6_twk128 => K6,
out_K7_twk128 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K0 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K1 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K2 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K3 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched128
port map (
odd_in_tk128 => odd_number,
even_in_tk128 => even_number,
in_key_tk128 => twofish_key,
out_key_up_tk128 => key_up,
out_key_down_tk128 => key_down
);
 
producing_the_Skeys: twofish_S128
port map (
in_key_ts128 => twofish_key,
out_Sfirst_ts128 => Sfirst,
out_Ssecond_ts128 => Ssecond
);
 
the_encryption_circuit: twofish_encryption_round128
port map (
in1_ter128 => to_round(127 downto 96),
in2_ter128 => to_round(95 downto 64),
in3_ter128 => to_round(63 downto 32),
in4_ter128 => to_round(31 downto 0),
in_Sfirst_ter128 => Sfirst,
in_Ssecond_ter128 => Ssecond,
in_key_up_ter128 => key_up,
in_key_down_ter128 => key_down,
out1_ter128 => to_encr_reg128(127 downto 96),
out2_ter128 => to_encr_reg128(95 downto 64),
out3_ter128 => to_encr_reg128(63 downto 32),
out4_ter128 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K4 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K5 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K6 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K7 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
vk_proc: process
 
variable key_f, -- key input from file
ct_f : line; -- ciphertext from file
variable key_v, -- key vector input
ct_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter : integer range 1 to 129 := 1; -- counts the encryptions
variable round : integer range 1 to 16 := 1; -- holds the rounds of encryption
 
begin
 
-- plaintext stays fixed to zero
input_data <= (others => '0');
 
while not endfile(input_file) loop
readline(input_file, key_f);
readline(input_file,ct_f);
hread(key_f,key_v);
hread(ct_f,ct_v);
twofish_key <= key_v;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00001000"; -- 8
odd_number <= "00001001"; -- 9
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
 
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector(((round*2)+8), 8);
odd_number <= conv_std_logic_vector(((round*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
assert (ct_v = output_data) report "file entry and encryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Encryption I=" & to_text(counter) &" OK" severity note;
counter := counter+1;
hwrite(ct_f,output_data);
hwrite(key_f,key_v);
writeline(output_file,key_f);
writeline(output_file,ct_f);
end loop;
assert false report "***** Variable Key Known Answer Test with 128 bits key size ended succesfully! :) *****" severity failure;
end process vk_proc;
end vk_encryption128_testbench_arch;
 
/trunk/vhdl/twofish_ecb_tbl_testbench_128bits.vhd
0,0 → 1,373
-- Twofish_ecb_tbl_testbench_128bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the TABLES KAT of the twofish cipher with 128 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity tbl_testbench128 is
end tbl_testbench128;
 
architecture tbl_encryption128_testbench_arch of tbl_testbench128 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched128
port (
odd_in_tk128,
even_in_tk128 : in std_logic_vector(7 downto 0);
in_key_tk128 : in std_logic_vector(127 downto 0);
out_key_up_tk128,
out_key_down_tk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched128
port (
in_key_twk128 : in std_logic_vector(127 downto 0);
out_K0_twk128,
out_K1_twk128,
out_K2_twk128,
out_K3_twk128,
out_K4_twk128,
out_K5_twk128,
out_K6_twk128,
out_K7_twk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_encryption_round128
port (
in1_ter128,
in2_ter128,
in3_ter128,
in4_ter128,
in_Sfirst_ter128,
in_Ssecond_ter128,
in_key_up_ter128,
in_key_down_ter128 : in std_logic_vector(31 downto 0);
out1_ter128,
out2_ter128,
out3_ter128,
out4_ter128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S128
port (
in_key_ts128 : in std_logic_vector(127 downto 0);
out_Sfirst_ts128,
out_Ssecond_ts128 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_ecb_tbl_testvalues_128bits.txt";
FILE output_file : text is out "twofish_ecb_tbl_128bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 1 to 50) return string is
variable our_text : string (1 to 3) := (others => ' ');
variable hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := (int_number - (int_number mod 100)) / 100;
our_text(1) := digit_to_char(hundreds);
our_text(2) := digit_to_char(tens);
our_text(3) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
twofish_key,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal key_up,
key_down,
Sfirst,
Ssecond,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched128
port map (
in_key_twk128 => twofish_key,
out_K0_twk128 => K0,
out_K1_twk128 => K1,
out_K2_twk128 => K2,
out_K3_twk128 => K3,
out_K4_twk128 => K4,
out_K5_twk128 => K5,
out_K6_twk128 => K6,
out_K7_twk128 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K0 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K1 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K2 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K3 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched128
port map (
odd_in_tk128 => odd_number,
even_in_tk128 => even_number,
in_key_tk128 => twofish_key,
out_key_up_tk128 => key_up,
out_key_down_tk128 => key_down
);
 
producing_the_Skeys: twofish_S128
port map (
in_key_ts128 => twofish_key,
out_Sfirst_ts128 => Sfirst,
out_Ssecond_ts128 => Ssecond
);
 
the_encryption_circuit: twofish_encryption_round128
port map (
in1_ter128 => to_round(127 downto 96),
in2_ter128 => to_round(95 downto 64),
in3_ter128 => to_round(63 downto 32),
in4_ter128 => to_round(31 downto 0),
in_Sfirst_ter128 => Sfirst,
in_Ssecond_ter128 => Ssecond,
in_key_up_ter128 => key_up,
in_key_down_ter128 => key_down,
out1_ter128 => to_encr_reg128(127 downto 96),
out2_ter128 => to_encr_reg128(95 downto 64),
out3_ter128 => to_encr_reg128(63 downto 32),
out4_ter128 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K4 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K5 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K6 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K7 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
tbl_proc: process
 
variable key_f, -- key input from file
pt_f, -- plaintext from file
ct_f : line; -- ciphertext from file
variable key_v, -- key vector input
pt_v , -- plaintext vector
ct_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter : integer range 1 to 50 := 1;
variable round : integer range 0 to 16 := 0;
 
begin
while not endfile(input_file) loop
readline(input_file, key_f);
readline(input_file, pt_f);
readline(input_file,ct_f);
hread(key_f,key_v);
hread(pt_f,pt_v);
hread(ct_f,ct_v);
twofish_key <= key_v;
input_data <= pt_v;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00001000"; -- 8
odd_number <= "00001001"; -- 9
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
 
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector(((round*2)+8), 8);
odd_number <= conv_std_logic_vector(((round*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
assert (ct_v = output_data) report "file entry and encryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Encryption I=" & to_text(counter) &" OK" severity note;
counter := counter+1;
hwrite(pt_f,input_data);
hwrite(ct_f,output_data);
hwrite(key_f,key_v);
writeline(output_file,key_f);
writeline(output_file,pt_f);
writeline(output_file,ct_f);
end loop;
assert false report "***** Tables Known Answer Test with 128 bits key size ended succesfully! :) *****" severity failure;
end process tbl_proc;
end tbl_encryption128_testbench_arch;
 
/trunk/vhdl/twofish_ecb_vk_testbench_192bits.vhd
0,0 → 1,376
-- Twofish_ecb_vk_testbench_192bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the VARIABLE KEY KAT of the twofish cipher with 192 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity vk_testbench192 is
end vk_testbench192;
 
architecture vk_encryption192_testbench_arch of vk_testbench192 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched192
port (
odd_in_tk192,
even_in_tk192 : in std_logic_vector(7 downto 0);
in_key_tk192 : in std_logic_vector(191 downto 0);
out_key_up_tk192,
out_key_down_tk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched192
port (
in_key_twk192 : in std_logic_vector(191 downto 0);
out_K0_twk192,
out_K1_twk192,
out_K2_twk192,
out_K3_twk192,
out_K4_twk192,
out_K5_twk192,
out_K6_twk192,
out_K7_twk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_encryption_round192
port (
in1_ter192,
in2_ter192,
in3_ter192,
in4_ter192,
in_Sfirst_ter192,
in_Ssecond_ter192,
in_Sthird_ter192,
in_key_up_ter192,
in_key_down_ter192 : in std_logic_vector(31 downto 0);
out1_ter192,
out2_ter192,
out3_ter192,
out4_ter192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S192
port (
in_key_ts192 : in std_logic_vector(191 downto 0);
out_Sfirst_ts192,
out_Ssecond_ts192,
out_Sthird_ts192 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_ecb_vk_testvalues_192bits.txt";
FILE output_file : text is out "twofish_ecb_vk_192bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 1 to 193) return string is
variable our_text : string (1 to 3) := (others => ' ');
variable hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := (int_number - (int_number mod 100)) / 100;
our_text(1) := digit_to_char(hundreds);
our_text(2) := digit_to_char(tens);
our_text(3) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal twofish_key : std_logic_vector(191 downto 0);
 
signal key_up,
key_down,
Sfirst,
Ssecond,
Sthird,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched192
port map (
in_key_twk192 => twofish_key,
out_K0_twk192 => K0,
out_K1_twk192 => K1,
out_K2_twk192 => K2,
out_K3_twk192 => K3,
out_K4_twk192 => K4,
out_K5_twk192 => K5,
out_K6_twk192 => K6,
out_K7_twk192 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K0 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K1 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K2 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K3 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched192
port map (
odd_in_tk192 => odd_number,
even_in_tk192 => even_number,
in_key_tk192 => twofish_key,
out_key_up_tk192 => key_up,
out_key_down_tk192 => key_down
);
 
producing_the_Skeys: twofish_S192
port map (
in_key_ts192 => twofish_key,
out_Sfirst_ts192 => Sfirst,
out_Ssecond_ts192 => Ssecond,
out_Sthird_ts192 => Sthird
);
 
the_encryption_circuit: twofish_encryption_round192
port map (
in1_ter192 => to_round(127 downto 96),
in2_ter192 => to_round(95 downto 64),
in3_ter192 => to_round(63 downto 32),
in4_ter192 => to_round(31 downto 0),
in_Sfirst_ter192 => Sfirst,
in_Ssecond_ter192 => Ssecond,
in_Sthird_ter192 => Sthird,
in_key_up_ter192 => key_up,
in_key_down_ter192 => key_down,
out1_ter192 => to_encr_reg128(127 downto 96),
out2_ter192 => to_encr_reg128(95 downto 64),
out3_ter192 => to_encr_reg128(63 downto 32),
out4_ter192 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K4 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K5 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K6 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K7 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
vk_proc: process
 
variable key_f, -- key input from file
ct_f : line; -- ciphertext from file
variable key_v : std_logic_vector(191 downto 0); -- key vector input
variable ct_v : std_logic_vector(127 downto 0); -- ciphertext vector
variable counter : integer range 1 to 193 := 1; -- counts the encryptions
variable round : integer range 1 to 16 := 1; -- holds the rounds of encryption
 
begin
 
-- plaintext stays fixed to zero
input_data <= (others => '0');
 
while not endfile(input_file) loop
readline(input_file, key_f);
readline(input_file,ct_f);
hread(key_f,key_v);
hread(ct_f,ct_v);
twofish_key <= key_v;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00001000"; -- 8
odd_number <= "00001001"; -- 9
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
 
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector(((round*2)+8), 8);
odd_number <= conv_std_logic_vector(((round*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
assert (ct_v = output_data) report "file entry and encryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Encryption I=" & to_text(counter) &" OK" severity note;
counter := counter+1;
hwrite(ct_f,output_data);
hwrite(key_f,key_v);
writeline(output_file,key_f);
writeline(output_file,ct_f);
end loop;
assert false report "***** Variable Key Known Answer Test with 192 bits key size ended succesfully! :) *****" severity failure;
end process vk_proc;
end vk_encryption192_testbench_arch;
 
/trunk/vhdl/twofish_ecb_tbl_testbench_192bits.vhd
0,0 → 1,380
-- Twofish_ecb_tbl_testbench_192bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the TABLES KAT of the twofish cipher with 192 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity tbl_testbench192 is
end tbl_testbench192;
 
architecture tbl_encryption192_testbench_arch of tbl_testbench192 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched192
port (
odd_in_tk192,
even_in_tk192 : in std_logic_vector(7 downto 0);
in_key_tk192 : in std_logic_vector(191 downto 0);
out_key_up_tk192,
out_key_down_tk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched192
port (
in_key_twk192 : in std_logic_vector(191 downto 0);
out_K0_twk192,
out_K1_twk192,
out_K2_twk192,
out_K3_twk192,
out_K4_twk192,
out_K5_twk192,
out_K6_twk192,
out_K7_twk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_encryption_round192
port (
in1_ter192,
in2_ter192,
in3_ter192,
in4_ter192,
in_Sfirst_ter192,
in_Ssecond_ter192,
in_Sthird_ter192,
in_key_up_ter192,
in_key_down_ter192 : in std_logic_vector(31 downto 0);
out1_ter192,
out2_ter192,
out3_ter192,
out4_ter192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S192
port (
in_key_ts192 : in std_logic_vector(191 downto 0);
out_Sfirst_ts192,
out_Ssecond_ts192,
out_Sthird_ts192 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_ecb_tbl_testvalues_192bits.txt";
FILE output_file : text is out "twofish_ecb_tbl_192bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 1 to 50) return string is
variable our_text : string (1 to 3) := (others => ' ');
variable hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := (int_number - (int_number mod 100)) / 100;
our_text(1) := digit_to_char(hundreds);
our_text(2) := digit_to_char(tens);
our_text(3) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal twofish_key : std_logic_vector(191 downto 0);
 
signal key_up,
key_down,
Sfirst,
Ssecond,
Sthird,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched192
port map (
in_key_twk192 => twofish_key,
out_K0_twk192 => K0,
out_K1_twk192 => K1,
out_K2_twk192 => K2,
out_K3_twk192 => K3,
out_K4_twk192 => K4,
out_K5_twk192 => K5,
out_K6_twk192 => K6,
out_K7_twk192 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K0 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K1 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K2 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K3 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched192
port map (
odd_in_tk192 => odd_number,
even_in_tk192 => even_number,
in_key_tk192 => twofish_key,
out_key_up_tk192 => key_up,
out_key_down_tk192 => key_down
);
 
producing_the_Skeys: twofish_S192
port map (
in_key_ts192 => twofish_key,
out_Sfirst_ts192 => Sfirst,
out_Ssecond_ts192 => Ssecond,
out_Sthird_ts192 => Sthird
);
 
the_encryption_circuit: twofish_encryption_round192
port map (
in1_ter192 => to_round(127 downto 96),
in2_ter192 => to_round(95 downto 64),
in3_ter192 => to_round(63 downto 32),
in4_ter192 => to_round(31 downto 0),
in_Sfirst_ter192 => Sfirst,
in_Ssecond_ter192 => Ssecond,
in_Sthird_ter192 => Sthird,
in_key_up_ter192 => key_up,
in_key_down_ter192 => key_down,
out1_ter192 => to_encr_reg128(127 downto 96),
out2_ter192 => to_encr_reg128(95 downto 64),
out3_ter192 => to_encr_reg128(63 downto 32),
out4_ter192 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K4 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K5 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K6 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K7 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
tbl_proc: process
 
variable key_f, -- key input from file
pt_f, -- plaintext from file
ct_f : line; -- ciphertext from file
variable pt_v , -- plaintext vector
ct_v : std_logic_vector(127 downto 0); -- ciphertext vector
variable key_v : std_logic_vector(191 downto 0); -- key vector input
 
variable counter : integer range 1 to 50 := 1;
variable round : integer range 0 to 16 := 0;
 
begin
while not endfile(input_file) loop
readline(input_file, key_f);
readline(input_file, pt_f);
readline(input_file,ct_f);
hread(key_f,key_v);
hread(pt_f,pt_v);
hread(ct_f,ct_v);
twofish_key <= key_v;
input_data <= pt_v;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00001000"; -- 8
odd_number <= "00001001"; -- 9
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
 
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector(((round*2)+8), 8);
odd_number <= conv_std_logic_vector(((round*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
assert (ct_v = output_data) report "file entry and encryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Encryption I=" & to_text(counter) &" OK" severity note;
counter := counter+1;
hwrite(pt_f,input_data);
hwrite(ct_f,output_data);
hwrite(key_f,key_v);
writeline(output_file,key_f);
writeline(output_file,pt_f);
writeline(output_file,ct_f);
end loop;
assert false report "***** Tables Known Answer Test with 192 bits key size ended succesfully! :) *****" severity failure;
end process tbl_proc;
end tbl_encryption192_testbench_arch;
 
/trunk/vhdl/twofish_ecb_vt_testbench_128bits.vhd
0,0 → 1,370
-- Twofish_ecb_vt_testbench_128bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the VARIABLE TEXT KAT of the twofish cipher with 128 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity vt_testbench128 is
end vt_testbench128;
 
architecture vt_encryption128_testbench_arch of vt_testbench128 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched128
port (
odd_in_tk128,
even_in_tk128 : in std_logic_vector(7 downto 0);
in_key_tk128 : in std_logic_vector(127 downto 0);
out_key_up_tk128,
out_key_down_tk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched128
port (
in_key_twk128 : in std_logic_vector(127 downto 0);
out_K0_twk128,
out_K1_twk128,
out_K2_twk128,
out_K3_twk128,
out_K4_twk128,
out_K5_twk128,
out_K6_twk128,
out_K7_twk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_encryption_round128
port (
in1_ter128,
in2_ter128,
in3_ter128,
in4_ter128,
in_Sfirst_ter128,
in_Ssecond_ter128,
in_key_up_ter128,
in_key_down_ter128 : in std_logic_vector(31 downto 0);
out1_ter128,
out2_ter128,
out3_ter128,
out4_ter128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S128
port (
in_key_ts128 : in std_logic_vector(127 downto 0);
out_Sfirst_ts128,
out_Ssecond_ts128 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_ecb_vt_testvalues_128bits.txt";
FILE output_file : text is out "twofish_ecb_vt_128bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 1 to 129) return string is
variable our_text : string (1 to 3) := (others => ' ');
variable hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := (int_number - (int_number mod 100)) / 100;
our_text(1) := digit_to_char(hundreds);
our_text(2) := digit_to_char(tens);
our_text(3) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
twofish_key,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal key_up,
key_down,
Sfirst,
Ssecond,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched128
port map (
in_key_twk128 => twofish_key,
out_K0_twk128 => K0,
out_K1_twk128 => K1,
out_K2_twk128 => K2,
out_K3_twk128 => K3,
out_K4_twk128 => K4,
out_K5_twk128 => K5,
out_K6_twk128 => K6,
out_K7_twk128 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K0 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K1 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K2 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K3 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched128
port map (
odd_in_tk128 => odd_number,
even_in_tk128 => even_number,
in_key_tk128 => twofish_key,
out_key_up_tk128 => key_up,
out_key_down_tk128 => key_down
);
 
producing_the_Skeys: twofish_S128
port map (
in_key_ts128 => twofish_key,
out_Sfirst_ts128 => Sfirst,
out_Ssecond_ts128 => Ssecond
);
 
the_encryption_circuit: twofish_encryption_round128
port map (
in1_ter128 => to_round(127 downto 96),
in2_ter128 => to_round(95 downto 64),
in3_ter128 => to_round(63 downto 32),
in4_ter128 => to_round(31 downto 0),
in_Sfirst_ter128 => Sfirst,
in_Ssecond_ter128 => Ssecond,
in_key_up_ter128 => key_up,
in_key_down_ter128 => key_down,
out1_ter128 => to_encr_reg128(127 downto 96),
out2_ter128 => to_encr_reg128(95 downto 64),
out3_ter128 => to_encr_reg128(63 downto 32),
out4_ter128 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K4 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K5 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K6 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K7 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
vt_proc: process
 
variable pt_f, -- plaintext input from file
ct_f : line; -- ciphertext from file
variable pt_v, -- plaintext vector input
ct_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter : integer range 1 to 129 := 1; -- counts the encryptions
variable round : integer range 1 to 16 := 1; -- holds the rounds of encryption
 
begin
 
-- key stays fixed to zero
twofish_key <= (others => '0');
 
while not endfile(input_file) loop
readline(input_file, pt_f);
readline(input_file,ct_f);
hread(pt_f,pt_v);
hread(ct_f,ct_v);
input_data <= pt_v;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00001000"; -- 8
odd_number <= "00001001"; -- 9
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
 
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector(((round*2)+8), 8);
odd_number <= conv_std_logic_vector(((round*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
assert (ct_v = output_data) report "file entry and encryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Encryption I=" & to_text(counter) &" OK" severity note;
counter := counter+1;
hwrite(ct_f,output_data);
hwrite(pt_f,pt_v);
writeline(output_file,pt_f);
writeline(output_file,ct_f);
end loop;
assert false report "***** Variable Text Known Answer Test with 128 bits key size ended succesfully! :) *****" severity failure;
end process vt_proc;
end vt_encryption128_testbench_arch;
 
/trunk/vhdl/twofish_ecb_vt_testbench_192bits.vhd
0,0 → 1,376
-- Twofish_ecb_vt_testbench_192bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the VARIABLE TEXT KAT of the twofish cipher with 192 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity vt_testbench192 is
end vt_testbench192;
 
architecture vt_encryption192_testbench_arch of vt_testbench192 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched192
port (
odd_in_tk192,
even_in_tk192 : in std_logic_vector(7 downto 0);
in_key_tk192 : in std_logic_vector(191 downto 0);
out_key_up_tk192,
out_key_down_tk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched192
port (
in_key_twk192 : in std_logic_vector(191 downto 0);
out_K0_twk192,
out_K1_twk192,
out_K2_twk192,
out_K3_twk192,
out_K4_twk192,
out_K5_twk192,
out_K6_twk192,
out_K7_twk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_encryption_round192
port (
in1_ter192,
in2_ter192,
in3_ter192,
in4_ter192,
in_Sfirst_ter192,
in_Ssecond_ter192,
in_Sthird_ter192,
in_key_up_ter192,
in_key_down_ter192 : in std_logic_vector(31 downto 0);
out1_ter192,
out2_ter192,
out3_ter192,
out4_ter192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S192
port (
in_key_ts192 : in std_logic_vector(191 downto 0);
out_Sfirst_ts192,
out_Ssecond_ts192,
out_Sthird_ts192 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_ecb_vt_testvalues_192bits.txt";
FILE output_file : text is out "twofish_ecb_vt_192bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 1 to 129) return string is
variable our_text : string (1 to 3) := (others => ' ');
variable hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := (int_number - (int_number mod 100)) / 100;
our_text(1) := digit_to_char(hundreds);
our_text(2) := digit_to_char(tens);
our_text(3) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal twofish_key : std_logic_vector(191 downto 0);
 
signal key_up,
key_down,
Sfirst,
Ssecond,
Sthird,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched192
port map (
in_key_twk192 => twofish_key,
out_K0_twk192 => K0,
out_K1_twk192 => K1,
out_K2_twk192 => K2,
out_K3_twk192 => K3,
out_K4_twk192 => K4,
out_K5_twk192 => K5,
out_K6_twk192 => K6,
out_K7_twk192 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K0 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K1 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K2 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K3 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched192
port map (
odd_in_tk192 => odd_number,
even_in_tk192 => even_number,
in_key_tk192 => twofish_key,
out_key_up_tk192 => key_up,
out_key_down_tk192 => key_down
);
 
producing_the_Skeys: twofish_S192
port map (
in_key_ts192 => twofish_key,
out_Sfirst_ts192 => Sfirst,
out_Ssecond_ts192 => Ssecond,
out_Sthird_ts192 => Sthird
);
 
the_encryption_circuit: twofish_encryption_round192
port map (
in1_ter192 => to_round(127 downto 96),
in2_ter192 => to_round(95 downto 64),
in3_ter192 => to_round(63 downto 32),
in4_ter192 => to_round(31 downto 0),
in_Sfirst_ter192 => Sfirst,
in_Ssecond_ter192 => Ssecond,
in_Sthird_ter192 => Sthird,
in_key_up_ter192 => key_up,
in_key_down_ter192 => key_down,
out1_ter192 => to_encr_reg128(127 downto 96),
out2_ter192 => to_encr_reg128(95 downto 64),
out3_ter192 => to_encr_reg128(63 downto 32),
out4_ter192 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K4 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K5 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K6 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K7 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
vt_proc: process
 
variable pt_f, -- plaintext input from file
ct_f : line; -- ciphertext from file
variable pt_v, -- plaintext vector input
ct_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter : integer range 1 to 129 := 1; -- counts the encryptions
variable round : integer range 1 to 16 := 1; -- holds the rounds of encryption
 
begin
 
-- key stays fixed to zero
twofish_key <= (others => '0');
 
while not endfile(input_file) loop
readline(input_file, pt_f);
readline(input_file,ct_f);
hread(pt_f,pt_v);
hread(ct_f,ct_v);
input_data <= pt_v;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00001000"; -- 8
odd_number <= "00001001"; -- 9
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
 
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector(((round*2)+8), 8);
odd_number <= conv_std_logic_vector(((round*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
assert (ct_v = output_data) report "file entry and encryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Encryption I=" & to_text(counter) &" OK" severity note;
counter := counter+1;
hwrite(ct_f,output_data);
hwrite(pt_f,pt_v);
writeline(output_file,pt_f);
writeline(output_file,ct_f);
end loop;
assert false report "***** Variable Text Known Answer Test with 192 bits key size ended succesfully! :) *****" severity failure;
end process vt_proc;
end vt_encryption192_testbench_arch;
 
/trunk/vhdl/twofish.vhd
0,0 → 1,5527
-- Twofish.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
 
-- description : this file includes all the components necessary to perform symmetric encryption
-- with the twofish 128 bit block cipher. Within there are four main parts of the file.
-- the first part is the twofish crypto primitives which are independent of the key
-- input length, the second part is the 128 bit key input components, the third part
-- is the 192 bit key components and finaly the 256 bit key input components
--
 
 
-- ====================================================== --
-- ====================================================== --
-- --
-- first part: key input independent component primitives --
-- --
-- ====================================================== --
-- ====================================================== --
 
--
-- q0
--
 
library ieee;
Use ieee.std_logic_1164.all;
 
entity q0 is
port (
in_q0 : in std_logic_vector(7 downto 0);
out_q0 : out std_logic_vector(7 downto 0)
);
end q0;
 
architecture q0_arch of q0 is
 
-- declaring internal signals
signal a0,b0,
a1,b1,
a2,b2,
a3,b3,
a4,b4 : std_logic_vector(3 downto 0);
signal b0_ror4,
a0_times_8,
b2_ror4,
a2_times_8 : std_logic_vector(3 downto 0);
 
-- beginning of the architecture description
begin
-- little endian
b0 <= in_q0(3 downto 0);
a0 <= in_q0(7 downto 4);
a1 <= a0 XOR b0;
-- signal b0 is ror4'ed by 1 bit
b0_ror4(2 downto 0) <= b0(3 downto 1);
b0_ror4(3) <= b0(0);
-- 8*a0 = 2^3*a0= a0 << 3
a0_times_8(2 downto 0) <= (others => '0');
a0_times_8(3) <= a0(0);
b1 <= a0 XOR b0_ror4 XOR a0_times_8;
 
--
-- t0 table
--
with a1 select
a2 <= "1000" when "0000", -- 8
"0001" when "0001", -- 1
"0111" when "0010", -- 7
"1101" when "0011", -- D
"0110" when "0100", -- 6
"1111" when "0101", -- F
"0011" when "0110", -- 3
"0010" when "0111", -- 2
"0000" when "1000", -- 0
"1011" when "1001", -- B
"0101" when "1010", -- 5
"1001" when "1011", -- 9
"1110" when "1100", -- E
"1100" when "1101", -- C
"1010" when "1110", -- A
"0100" when others; -- 4
 
--
-- t1 table
--
with b1 select
b2 <= "1110" when "0000", -- E
"1100" when "0001", -- C
"1011" when "0010", -- B
"1000" when "0011", -- 8
"0001" when "0100", -- 1
"0010" when "0101", -- 2
"0011" when "0110", -- 3
"0101" when "0111", -- 5
"1111" when "1000", -- F
"0100" when "1001", -- 4
"1010" when "1010", -- A
"0110" when "1011", -- 6
"0111" when "1100", -- 7
"0000" when "1101", -- 0
"1001" when "1110", -- 9
"1101" when others; -- D
 
a3 <= a2 XOR b2;
-- signal b2 is ror4'ed by 1 bit
b2_ror4(2 downto 0) <= b2(3 downto 1);
b2_ror4(3) <= b2(0);
-- 8*a2 = 2^3*a2=a2<<3
a2_times_8(2 downto 0) <= (others => '0');
a2_times_8(3) <= a2(0);
b3 <= a2 XOR b2_ror4 XOR a2_times_8;
 
 
--
-- t0 table
--
with a3 select
a4 <= "1011" when "0000", -- B
"1010" when "0001", -- A
"0101" when "0010", -- 5
"1110" when "0011", -- E
"0110" when "0100", -- 6
"1101" when "0101", -- D
"1001" when "0110", -- 9
"0000" when "0111", -- 0
"1100" when "1000", -- C
"1000" when "1001", -- 8
"1111" when "1010", -- F
"0011" when "1011", -- 3
"0010" when "1100", -- 2
"0100" when "1101", -- 4
"0111" when "1110", -- 7
"0001" when others; -- 1
 
--
-- t1 table
--
with b3 select
b4 <= "1101" when "0000", -- D
"0111" when "0001", -- 7
"1111" when "0010", -- F
"0100" when "0011", -- 4
"0001" when "0100", -- 1
"0010" when "0101", -- 2
"0110" when "0110", -- 6
"1110" when "0111", -- E
"1001" when "1000", -- 9
"1011" when "1001", -- B
"0011" when "1010", -- 3
"0000" when "1011", -- 0
"1000" when "1100", -- 8
"0101" when "1101", -- 5
"1100" when "1110", -- C
"1010" when others; -- A
-- the output of q0
out_q0 <= b4 & a4;
 
end q0_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- q1
--
 
library ieee;
Use ieee.std_logic_1164.all;
 
entity q1 is
port (
in_q1 : in std_logic_vector(7 downto 0);
out_q1 : out std_logic_vector(7 downto 0)
);
end q1;
 
-- architecture description
architecture q1_arch of q1 is
 
-- declaring the internal signals
signal a0,b0,
a1,b1,
a2,b2,
a3,b3,
a4,b4 : std_logic_vector(3 downto 0);
signal b0_ror4,
a0_times_8,
b2_ror4,
a2_times_8 : std_logic_vector(3 downto 0);
 
-- begin the architecture description
begin
-- little endian
b0 <= in_q1(3 downto 0);
a0 <= in_q1(7 downto 4);
a1 <= a0 XOR b0;
-- signal b0 is ror4'ed by 1 bit
b0_ror4(2 downto 0) <= b0(3 downto 1);
b0_ror4(3) <= b0(0);
-- 8*a0 = 2^3*a0=a0<<3
a0_times_8(2 downto 0) <= (others => '0');
a0_times_8(3) <= a0(0);
b1 <= a0 XOR b0_ror4 XOR a0_times_8;
 
--
-- t0 table
--
with a1 select
a2 <= "0010" when "0000", -- 2
"1000" when "0001", -- 8
"1011" when "0010", -- b
"1101" when "0011", -- d
"1111" when "0100", -- f
"0111" when "0101", -- 7
"0110" when "0110", -- 6
"1110" when "0111", -- e
"0011" when "1000", -- 3
"0001" when "1001", -- 1
"1001" when "1010", -- 9
"0100" when "1011", -- 4
"0000" when "1100", -- 0
"1010" when "1101", -- a
"1100" when "1110", -- c
"0101" when others; -- 5
 
--
-- t1 table
--
with b1 select
b2 <= "0001" when "0000", -- 1
"1110" when "0001", -- e
"0010" when "0010", -- 2
"1011" when "0011", -- b
"0100" when "0100", -- 4
"1100" when "0101", -- c
"0011" when "0110", -- 3
"0111" when "0111", -- 7
"0110" when "1000", -- 6
"1101" when "1001", -- d
"1010" when "1010", -- a
"0101" when "1011", -- 5
"1111" when "1100", -- f
"1001" when "1101", -- 9
"0000" when "1110", -- 0
"1000" when others; -- 8
 
a3 <= a2 XOR b2;
-- signal b2 is ror4'ed by 1 bit
b2_ror4(2 downto 0) <= b2(3 downto 1);
b2_ror4(3) <= b2(0);
-- 8*a2 = 2^3*a2=a2<<3
a2_times_8(2 downto 0) <= (others => '0');
a2_times_8(3) <= a2(0);
b3 <= a2 XOR b2_ror4 XOR a2_times_8;
 
--
-- t0 table
--
with a3 select
a4 <= "0100" when "0000", -- 4
"1100" when "0001", -- c
"0111" when "0010", -- 7
"0101" when "0011", -- 5
"0001" when "0100", -- 1
"0110" when "0101", -- 6
"1001" when "0110", -- 9
"1010" when "0111", -- a
"0000" when "1000", -- 0
"1110" when "1001", -- e
"1101" when "1010", -- d
"1000" when "1011", -- 8
"0010" when "1100", -- 2
"1011" when "1101", -- b
"0011" when "1110", -- 3
"1111" when others; -- f
 
--
-- t1 table
--
with b3 select
b4 <= "1011" when "0000", -- b
"1001" when "0001", -- 9
"0101" when "0010", -- 5
"0001" when "0011", -- 1
"1100" when "0100", -- c
"0011" when "0101", -- 3
"1101" when "0110", -- d
"1110" when "0111", -- e
"0110" when "1000", -- 6
"0100" when "1001", -- 4
"0111" when "1010", -- 7
"1111" when "1011", -- f
"0010" when "1100", -- 2
"0000" when "1101", -- 0
"1000" when "1110", -- 8
"1010" when others; -- a
-- output of q1
out_q1 <= b4 & a4;
 
end q1_arch;
 
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- ef multiplier
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul_ef is
port (
in_ef : in std_logic_vector(7 downto 0);
out_ef : out std_logic_vector(7 downto 0)
);
end mul_ef;
 
 
architecture mul_ef_arch of mul_ef is
 
begin
out_ef(0) <= in_ef(2) XOR in_ef(1) XOR in_ef(0);
out_ef(1) <= in_ef(3) XOR in_ef(2) XOR in_ef(1) XOR in_ef(0);
out_ef(2) <= in_ef(4) XOR in_ef(3) XOR in_ef(2) XOR in_ef(1) XOR in_ef(0);
out_ef(3) <= in_ef(5) XOR in_ef(4) XOR in_ef(3) XOR in_ef(0);
out_ef(4) <= in_ef(6) XOR in_ef(5) XOR in_ef(4) XOR in_ef(1);
out_ef(5) <= in_ef(7) XOR in_ef(6) XOR in_ef(5) XOR in_ef(1) XOR in_ef(0);
out_ef(6) <= in_ef(7) XOR in_ef(6) XOR in_ef(0);
out_ef(7) <= in_ef(7) XOR in_ef(1) XOR in_ef(0);
end mul_ef_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
 
--
-- 5b multiplier
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul_5b is
port (
in_5b : in std_logic_vector(7 downto 0);
out_5b : out std_logic_vector(7 downto 0)
);
end mul_5b;
 
architecture mul_5b_arch of mul_5b is
begin
out_5b(0) <= in_5b(2) XOR in_5b(0);
out_5b(1) <= in_5b(3) XOR in_5b(1) XOR in_5b(0);
out_5b(2) <= in_5b(4) XOR in_5b(2) XOR in_5b(1);
out_5b(3) <= in_5b(5) XOR in_5b(3) XOR in_5b(0);
out_5b(4) <= in_5b(6) XOR in_5b(4) XOR in_5b(1) XOR in_5b(0);
out_5b(5) <= in_5b(7) XOR in_5b(5) XOR in_5b(1);
out_5b(6) <= in_5b(6) XOR in_5b(0);
out_5b(7) <= in_5b(7) XOR in_5b(1);
end mul_5b_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- mds
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mds is
port (
y0,
y1,
y2,
y3 : in std_logic_vector(7 downto 0);
z0,
z1,
z2,
z3 : out std_logic_vector(7 downto 0)
);
end mds;
 
 
-- architecture description of mds component
architecture mds_arch of mds is
 
-- we declare the multiplier by ef
component mul_ef
port (
in_ef : in std_logic_vector(7 downto 0);
out_ef : out std_logic_vector(7 downto 0)
);
end component;
 
-- we declare the multiplier by 5b
component mul_5b
port (
in_5b : in std_logic_vector(7 downto 0);
out_5b : out std_logic_vector(7 downto 0)
);
end component;
 
-- we declare the multiplier's outputs
signal y0_ef, y0_5b,
y1_ef, y1_5b,
y2_ef, y2_5b,
y3_ef, y3_5b : std_logic_vector(7 downto 0);
 
begin
 
-- we perform the signal multiplication
y0_times_ef: mul_ef
port map (
in_ef => y0,
out_ef => y0_ef
);
 
y0_times_5b: mul_5b
port map (
in_5b => y0,
out_5b => y0_5b
);
 
y1_times_ef: mul_ef
port map (
in_ef => y1,
out_ef => y1_ef
);
 
y1_times_5b: mul_5b
port map (
in_5b => y1,
out_5b => y1_5b
);
 
y2_times_ef: mul_ef
port map (
in_ef => y2,
out_ef => y2_ef
);
 
y2_times_5b: mul_5b
port map (
in_5b => y2,
out_5b => y2_5b
);
 
y3_times_ef: mul_ef
port map (
in_ef => y3,
out_ef => y3_ef
);
 
y3_times_5b: mul_5b
port map (
in_5b => y3,
out_5b => y3_5b
);
 
-- we perform the addition of the partial results in order to receive
-- the table output
 
-- z0 = y0*01 + y1*ef + y2*5b + y3*5b , opoy + bazoyme XOR
z0 <= y0 XOR y1_ef XOR y2_5b XOR y3_5b;
-- z1 = y0*5b + y1*ef + y2*ef + y3*01
z1 <= y0_5b XOR y1_ef XOR y2_ef XOR y3;
 
-- z2 = y0*ef + y1*5b + y2*01 +y3*ef
z2 <= y0_ef XOR y1_5b XOR y2 XOR y3_ef;
 
-- z3 = y0*ef + y1*01 + y2*ef + y3*5b
z3 <= y0_ef XOR y1 XOR y2_ef XOR y3_5b;
 
end mds_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- 1 bit adder
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity adder is
port (
in1_adder,
in2_adder,
in_carry_adder : in std_logic;
out_adder,
out_carry_adder : out std_logic
);
end adder;
 
architecture adder_arch of adder is
begin
 
out_adder <= in_carry_adder XOR in1_adder XOR in2_adder;
out_carry_adder <= (in_carry_adder AND (in1_adder XOR in2_adder)) OR (in1_adder AND in2_adder);
end adder_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- pht
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity pht is
port (
up_in_pht,
down_in_pht : in std_logic_vector(31 downto 0);
up_out_pht,
down_out_pht : out std_logic_vector(31 downto 0)
);
end pht;
 
 
-- architecture description
architecture pht_arch of pht is
 
-- we declare internal signals
signal intermediate_carry1,
intermediate_carry2,
to_upper_out : std_logic_vector(31 downto 0);
signal zero : std_logic;
component adder
port (
in1_adder,
in2_adder,
in_carry_adder : in std_logic;
out_adder,
out_carry_adder : out std_logic
);
end component;
begin
-- initializing zero signal
zero <= '0';
-- instantiating the upper adder of 32 bits
up_adder: for i in 0 to 31 generate
adder_one: if (i=0) generate
the_adder: adder
port map (
in1_adder => up_in_pht(0),
in2_adder => down_in_pht(0),
in_carry_adder => zero,
out_adder => to_upper_out(0),
out_carry_adder => intermediate_carry1(0)
);
end generate adder_one;
rest_adders: if (i>0) generate
next_adder: adder
port map (
in1_adder => up_in_pht(i),
in2_adder => down_in_pht(i),
in_carry_adder => intermediate_carry1(i-1),
out_adder => to_upper_out(i),
out_carry_adder => intermediate_carry1(i)
);
end generate rest_adders;
end generate up_adder;
intermediate_carry1(31) <= '0';
-- receiving the upper pht output
up_out_pht <= to_upper_out;
-- instantiating the lower adder of 32 bits
down_adder: for i in 0 to 31 generate
adder_one_1: if (i=0) generate
the_adder_1: adder
port map (
in1_adder => down_in_pht(0),
in2_adder => to_upper_out(0),
in_carry_adder => zero,
out_adder => down_out_pht(0),
out_carry_adder => intermediate_carry2(0)
);
end generate adder_one_1;
rest_adders_1: if (i>0) generate
next_adder_1: adder
port map (
in1_adder => down_in_pht(i),
in2_adder => to_upper_out(i),
in_carry_adder => intermediate_carry2(i-1),
out_adder => down_out_pht(i),
out_carry_adder => intermediate_carry2(i)
);
end generate rest_adders_1;
end generate down_adder;
intermediate_carry2(31) <= '0';
end pht_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 01
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul01 is
port (
in_mul01 : in std_logic_vector(7 downto 0);
out_mul01 : out std_logic_vector(7 downto 0)
);
end mul01;
architecture mul01_arch of mul01 is
begin
out_mul01 <= in_mul01;
end mul01_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by a4
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mula4 is
port (
in_mula4 : in std_logic_vector(7 downto 0);
out_mula4 : out std_logic_vector(7 downto 0)
);
end mula4;
 
architecture mula4_arch of mula4 is
begin
out_mula4(0) <= in_mula4(7) xor in_mula4(1);
out_mula4(1) <= in_mula4(2);
out_mula4(2) <= in_mula4(7) xor in_mula4(3) xor in_mula4(1) xor in_mula4(0);
out_mula4(3) <= in_mula4(7) xor in_mula4(4) xor in_mula4(2);
out_mula4(4) <= in_mula4(5) xor in_mula4(3);
out_mula4(5) <= in_mula4(6) xor in_mula4(4) xor in_mula4(0);
out_mula4(6) <= in_mula4(5);
out_mula4(7) <= in_mula4(6) xor in_mula4(0);
end mula4_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 55
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul55 is
port (
in_mul55 : in std_logic_vector(7 downto 0);
out_mul55 : out std_logic_vector(7 downto 0)
);
end mul55;
 
architecture mul55_arch of mul55 is
begin
out_mul55(0) <= in_mul55(7) xor in_mul55(6) xor in_mul55(2) xor in_mul55(0);
out_mul55(1) <= in_mul55(7) xor in_mul55(3) xor in_mul55(1);
out_mul55(2) <= in_mul55(7) xor in_mul55(6) xor in_mul55(4) xor in_mul55(0);
out_mul55(3) <= in_mul55(6) xor in_mul55(5) xor in_mul55(2) xor in_mul55(1);
out_mul55(4) <= in_mul55(7) xor in_mul55(6) xor in_mul55(3) xor in_mul55(2) xor in_mul55(0);
out_mul55(5) <= in_mul55(7) xor in_mul55(4) xor in_mul55(3) xor in_mul55(1);
out_mul55(6) <= in_mul55(7) xor in_mul55(6) xor in_mul55(5) xor in_mul55(4) xor in_mul55(0);
out_mul55(7) <= in_mul55(7) xor in_mul55(6) xor in_mul55(5) xor in_mul55(1);
end mul55_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 87
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul87 is
port (
in_mul87 : in std_logic_vector(7 downto 0);
out_mul87 : out std_logic_vector(7 downto 0)
);
end mul87;
 
architecture mul87_arch of mul87 is
begin
out_mul87(0) <= in_mul87(7) xor in_mul87(5) xor in_mul87(3) xor in_mul87(1) xor in_mul87(0);
out_mul87(1) <= in_mul87(6) xor in_mul87(4) xor in_mul87(2) xor in_mul87(1) xor in_mul87(0);
out_mul87(2) <= in_mul87(2) xor in_mul87(0);
out_mul87(3) <= in_mul87(7) xor in_mul87(5);
out_mul87(4) <= in_mul87(6);
out_mul87(5) <= in_mul87(7);
out_mul87(6) <= in_mul87(7) xor in_mul87(5) xor in_mul87(3) xor in_mul87(1);
out_mul87(7) <= in_mul87(6) xor in_mul87(4) xor in_mul87(2) xor in_mul87(0);
end mul87_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 5a
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul5a is
port (
in_mul5a : in std_logic_vector(7 downto 0);
out_mul5a : out std_logic_vector(7 downto 0)
);
end mul5a;
 
architecture mul5a_arch of mul5a is
begin
out_mul5a(0) <= in_mul5a(7) xor in_mul5a(5) xor in_mul5a(2);
out_mul5a(1) <= in_mul5a(6) xor in_mul5a(3) xor in_mul5a(0);
out_mul5a(2) <= in_mul5a(5) xor in_mul5a(4) xor in_mul5a(2) xor in_mul5a(1);
out_mul5a(3) <= in_mul5a(7) xor in_mul5a(6) xor in_mul5a(3) xor in_mul5a(0);
out_mul5a(4) <= in_mul5a(7) xor in_mul5a(4) xor in_mul5a(1) xor in_mul5a(0);
out_mul5a(5) <= in_mul5a(5) xor in_mul5a(2) xor in_mul5a(1);
out_mul5a(6) <= in_mul5a(7) xor in_mul5a(6) xor in_mul5a(5) xor in_mul5a(3) xor in_mul5a(0);
out_mul5a(7) <= in_mul5a(7) xor in_mul5a(6) xor in_mul5a(4) xor in_mul5a(1);
end mul5a_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 58
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul58 is
port (
in_mul58 : in std_logic_vector(7 downto 0);
out_mul58 : out std_logic_vector(7 downto 0)
);
end mul58;
 
architecture mul58_arch of mul58 is
begin
out_mul58(0) <= in_mul58(5) xor in_mul58(2);
out_mul58(1) <= in_mul58(6) xor in_mul58(3);
out_mul58(2) <= in_mul58(7) xor in_mul58(5) xor in_mul58(4) xor in_mul58(2);
out_mul58(3) <= in_mul58(6) xor in_mul58(3) xor in_mul58(2) xor in_mul58(0);
out_mul58(4) <= in_mul58(7) xor in_mul58(4) xor in_mul58(3) xor in_mul58(1) xor in_mul58(0);
out_mul58(5) <= in_mul58(5) xor in_mul58(4) xor in_mul58(2) xor in_mul58(1);
out_mul58(6) <= in_mul58(6) xor in_mul58(3) xor in_mul58(0);
out_mul58(7) <= in_mul58(7) xor in_mul58(4) xor in_mul58(1);
end mul58_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by db
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity muldb is
port (
in_muldb : in std_logic_vector(7 downto 0);
out_muldb : out std_logic_vector(7 downto 0)
);
end muldb;
 
architecture muldb_arch of muldb is
begin
out_muldb(0) <= in_muldb(7) xor in_muldb(6) xor in_muldb(3) xor in_muldb(2) xor in_muldb(1) xor in_muldb(0);
out_muldb(1) <= in_muldb(7) xor in_muldb(4) xor in_muldb(3) xor in_muldb(2) xor in_muldb(1) xor in_muldb(0);
out_muldb(2) <= in_muldb(7) xor in_muldb(6) xor in_muldb(5) xor in_muldb(4);
out_muldb(3) <= in_muldb(5) xor in_muldb(3) xor in_muldb(2) xor in_muldb(1) xor in_muldb(0);
out_muldb(4) <= in_muldb(6) xor in_muldb(4) xor in_muldb(3) xor in_muldb(2) xor in_muldb(1) xor in_muldb(0);
out_muldb(5) <= in_muldb(7) xor in_muldb(5) xor in_muldb(4) xor in_muldb(3) xor in_muldb(2) xor in_muldb(1);
out_muldb(6) <= in_muldb(7) xor in_muldb(5) xor in_muldb(4) xor in_muldb(1) xor in_muldb(0);
out_muldb(7) <= in_muldb(6) xor in_muldb(5) xor in_muldb(2) xor in_muldb(1) xor in_muldb(0);
end muldb_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 9e
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul9e is
port (
in_mul9e : in std_logic_vector(7 downto 0);
out_mul9e : out std_logic_vector(7 downto 0)
);
end mul9e;
 
architecture mul9e_arch of mul9e is
begin
out_mul9e(0) <= in_mul9e(6) xor in_mul9e(4) xor in_mul9e(3) xor in_mul9e(1);
out_mul9e(1) <= in_mul9e(7) xor in_mul9e(5) xor in_mul9e(4) xor in_mul9e(2) xor in_mul9e(0);
out_mul9e(2) <= in_mul9e(5) xor in_mul9e(4) xor in_mul9e(0);
out_mul9e(3) <= in_mul9e(5) xor in_mul9e(4) xor in_mul9e(3) xor in_mul9e(0);
out_mul9e(4) <= in_mul9e(6) xor in_mul9e(5) xor in_mul9e(4) xor in_mul9e(1) xor in_mul9e(0);
out_mul9e(5) <= in_mul9e(7) xor in_mul9e(6) xor in_mul9e(5) xor in_mul9e(2) xor in_mul9e(1);
out_mul9e(6) <= in_mul9e(7) xor in_mul9e(4) xor in_mul9e(2) xor in_mul9e(1);
out_mul9e(7) <= in_mul9e(5) xor in_mul9e(3) xor in_mul9e(2) xor in_mul9e(0);
end mul9e_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 56
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul56 is
port (
in_mul56 : in std_logic_vector(7 downto 0);
out_mul56 : out std_logic_vector(7 downto 0)
);
end mul56;
 
architecture mul56_arch of mul56 is
begin
out_mul56(0) <= in_mul56(6) xor in_mul56(2);
out_mul56(1) <= in_mul56(7) xor in_mul56(3) xor in_mul56(0);
out_mul56(2) <= in_mul56(6) xor in_mul56(4) xor in_mul56(2) xor in_mul56(1) xor in_mul56(0);
out_mul56(3) <= in_mul56(7) xor in_mul56(6) xor in_mul56(5) xor in_mul56(3) xor in_mul56(1);
out_mul56(4) <= in_mul56(7) xor in_mul56(6) xor in_mul56(4) xor in_mul56(2) xor in_mul56(0);
out_mul56(5) <= in_mul56(7) xor in_mul56(5) xor in_mul56(3) xor in_mul56(1);
out_mul56(6) <= in_mul56(4) xor in_mul56(0);
out_mul56(7) <= in_mul56(5) xor in_mul56(1);
end mul56_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 82
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul82 is
port (
in_mul82 : in std_logic_vector(7 downto 0);
out_mul82 : out std_logic_vector(7 downto 0)
);
end mul82;
 
architecture mul82_arch of mul82 is
begin
out_mul82(0) <= in_mul82(7) xor in_mul82(6) xor in_mul82(5) xor in_mul82(3) xor in_mul82(1);
out_mul82(1) <= in_mul82(7) xor in_mul82(6) xor in_mul82(4) xor in_mul82(2) xor in_mul82(0);
out_mul82(2) <= in_mul82(6);
out_mul82(3) <= in_mul82(6) xor in_mul82(5) xor in_mul82(3) xor in_mul82(1);
out_mul82(4) <= in_mul82(7) xor in_mul82(6) xor in_mul82(4) xor in_mul82(2);
out_mul82(5) <= in_mul82(7) xor in_mul82(5) xor in_mul82(3);
out_mul82(6) <= in_mul82(7) xor in_mul82(5) xor in_mul82(4) xor in_mul82(3) xor in_mul82(1);
out_mul82(7) <= in_mul82(6) xor in_mul82(5) xor in_mul82(4) xor in_mul82(2) xor in_mul82(0);
end mul82_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by f3
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mulf3 is
port (
in_mulf3 : in std_logic_vector(7 downto 0);
out_mulf3 : out std_logic_vector(7 downto 0)
);
end mulf3;
 
architecture mulf3_arch of mulf3 is
begin
out_mulf3(0) <= in_mulf3(7) xor in_mulf3(6) xor in_mulf3(2) xor in_mulf3(1) xor in_mulf3(0);
out_mulf3(1) <= in_mulf3(7) xor in_mulf3(3) xor in_mulf3(2) xor in_mulf3(1) xor in_mulf3(0);
out_mulf3(2) <= in_mulf3(7) xor in_mulf3(6) xor in_mulf3(4) xor in_mulf3(3);
out_mulf3(3) <= in_mulf3(6) xor in_mulf3(5) xor in_mulf3(4) xor in_mulf3(2) xor in_mulf3(1);
out_mulf3(4) <= in_mulf3(7) xor in_mulf3(6) xor in_mulf3(5) xor in_mulf3(3) xor in_mulf3(2) xor in_mulf3(0);
out_mulf3(5) <= in_mulf3(7) xor in_mulf3(6) xor in_mulf3(4) xor in_mulf3(3) xor in_mulf3(1) xor in_mulf3(0);
out_mulf3(6) <= in_mulf3(6) xor in_mulf3(5) xor in_mulf3(4) xor in_mulf3(0);
out_mulf3(7) <= in_mulf3(7) xor in_mulf3(6) xor in_mulf3(5) xor in_mulf3(1) xor in_mulf3(0);
end mulf3_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 1e
--
 
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul1e is
port (
in_mul1e : in std_logic_vector(7 downto 0);
out_mul1e : out std_logic_vector(7 downto 0)
);
end mul1e;
 
architecture mul1e_arch of mul1e is
begin
out_mul1e(0) <= in_mul1e(5) xor in_mul1e(4);
out_mul1e(1) <= in_mul1e(6) xor in_mul1e(5) xor in_mul1e(0);
out_mul1e(2) <= in_mul1e(7) xor in_mul1e(6) xor in_mul1e(5) xor in_mul1e(4) xor in_mul1e(1) xor in_mul1e(0);
out_mul1e(3) <= in_mul1e(7) xor in_mul1e(6) xor in_mul1e(4) xor in_mul1e(2) xor in_mul1e(1) xor in_mul1e(0);
out_mul1e(4) <= in_mul1e(7) xor in_mul1e(5) xor in_mul1e(3) xor in_mul1e(2) xor in_mul1e(1) xor in_mul1e(0);
out_mul1e(5) <= in_mul1e(6) xor in_mul1e(4) xor in_mul1e(3) xor in_mul1e(2) xor in_mul1e(1);
out_mul1e(6) <= in_mul1e(7) xor in_mul1e(3) xor in_mul1e(2);
out_mul1e(7) <= in_mul1e(4) xor in_mul1e(3);
end mul1e_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by c6
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mulc6 is
port (
in_mulc6 : in std_logic_vector(7 downto 0);
out_mulc6 : out std_logic_vector(7 downto 0)
);
end mulc6;
 
architecture mulc6_arch of mulc6 is
begin
out_mulc6(0) <= in_mulc6(6) xor in_mulc6(5) xor in_mulc6(4) xor in_mulc6(3) xor in_mulc6(2) xor in_mulc6(1);
out_mulc6(1) <= in_mulc6(7) xor in_mulc6(6) xor in_mulc6(5) xor in_mulc6(4) xor in_mulc6(3) xor in_mulc6(2) xor in_mulc6(0);
out_mulc6(2) <= in_mulc6(7) xor in_mulc6(2) xor in_mulc6(0);
out_mulc6(3) <= in_mulc6(6) xor in_mulc6(5) xor in_mulc6(4) xor in_mulc6(2);
out_mulc6(4) <= in_mulc6(7) xor in_mulc6(6) xor in_mulc6(5) xor in_mulc6(3);
out_mulc6(5) <= in_mulc6(7) xor in_mulc6(6) xor in_mulc6(4);
out_mulc6(6) <= in_mulc6(7) xor in_mulc6(6) xor in_mulc6(4) xor in_mulc6(3) xor in_mulc6(2) xor in_mulc6(1) xor in_mulc6(0);
out_mulc6(7) <= in_mulc6(7) xor in_mulc6(5) xor in_mulc6(4) xor in_mulc6(3) xor in_mulc6(2) xor in_mulc6(1) xor in_mulc6(0);
end mulc6_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 68
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul68 is
port (
in_mul68 : in std_logic_vector(7 downto 0);
out_mul68 : out std_logic_vector(7 downto 0)
);
end mul68;
 
 
architecture mul68_arch of mul68 is
begin
out_mul68(0) <= in_mul68(7) xor in_mul68(6) xor in_mul68(4) xor in_mul68(3) xor in_mul68(2);
out_mul68(1) <= in_mul68(7) xor in_mul68(5) xor in_mul68(4) xor in_mul68(3);
out_mul68(2) <= in_mul68(7) xor in_mul68(5) xor in_mul68(3) xor in_mul68(2);
out_mul68(3) <= in_mul68(7) xor in_mul68(2) xor in_mul68(0);
out_mul68(4) <= in_mul68(3) xor in_mul68(1);
out_mul68(5) <= in_mul68(4) xor in_mul68(2) xor in_mul68(0);
out_mul68(6) <= in_mul68(7) xor in_mul68(6) xor in_mul68(5) xor in_mul68(4) xor in_mul68(2) xor in_mul68(1) xor in_mul68(0);
out_mul68(7) <= in_mul68(7) xor in_mul68(6) xor in_mul68(5) xor in_mul68(3) xor in_mul68(2) xor in_mul68(1);
end mul68_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by e5
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mule5 is
port (
in_mule5 : in std_logic_vector(7 downto 0);
out_mule5 : out std_logic_vector(7 downto 0)
);
end mule5;
 
 
architecture mule5_arch of mule5 is
begin
out_mule5(0) <= in_mule5(6) xor in_mule5(4) xor in_mule5(2) xor in_mule5(1) xor in_mule5(0);
out_mule5(1) <= in_mule5(7) xor in_mule5(5) xor in_mule5(3) xor in_mule5(2) xor in_mule5(1);
out_mule5(2) <= in_mule5(3) xor in_mule5(1) xor in_mule5(0);
out_mule5(3) <= in_mule5(6);
out_mule5(4) <= in_mule5(7);
out_mule5(5) <= in_mule5(0);
out_mule5(6) <= in_mule5(6) xor in_mule5(4) xor in_mule5(2) xor in_mule5(0);
out_mule5(7) <= in_mule5(7) xor in_mule5(5) xor in_mule5(3) xor in_mule5(1) xor in_mule5(0);
end mule5_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 02
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul02 is
port (
in_mul02 : in std_logic_vector(7 downto 0);
out_mul02 : out std_logic_vector(7 downto 0)
);
end mul02;
 
 
architecture mul02_arch of mul02 is
begin
out_mul02(0) <= in_mul02(7);
out_mul02(1) <= in_mul02(0);
out_mul02(2) <= in_mul02(7) xor in_mul02(1);
out_mul02(3) <= in_mul02(7) xor in_mul02(2);
out_mul02(4) <= in_mul02(3);
out_mul02(5) <= in_mul02(4);
out_mul02(6) <= in_mul02(7) xor in_mul02(5);
out_mul02(7) <= in_mul02(6);
end mul02_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by a1
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mula1 is
port (
in_mula1 : in std_logic_vector(7 downto 0);
out_mula1 : out std_logic_vector(7 downto 0)
);
end mula1;
 
architecture mula1_arch of mula1 is
begin
out_mula1(0) <= in_mula1(7) xor in_mula1(6) xor in_mula1(1) xor in_mula1(0);
out_mula1(1) <= in_mula1(7) xor in_mula1(2) xor in_mula1(1);
out_mula1(2) <= in_mula1(7) xor in_mula1(6) xor in_mula1(3) xor in_mula1(2) xor in_mula1(1);
out_mula1(3) <= in_mula1(6) xor in_mula1(4) xor in_mula1(3) xor in_mula1(2) xor in_mula1(1);
out_mula1(4) <= in_mula1(7) xor in_mula1(5) xor in_mula1(4) xor in_mula1(3) xor in_mula1(2);
out_mula1(5) <= in_mula1(6) xor in_mula1(5) xor in_mula1(4) xor in_mula1(3) xor in_mula1(0);
out_mula1(6) <= in_mula1(5) xor in_mula1(4);
out_mula1(7) <= in_mula1(6) xor in_mula1(5) xor in_mula1(0);
end mula1_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by fc
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mulfc is
port (
in_mulfc : in std_logic_vector(7 downto 0);
out_mulfc : out std_logic_vector(7 downto 0)
);
end mulfc;
 
 
architecture mulfc_arch of mulfc is
begin
out_mulfc(0) <= in_mulfc(7) xor in_mulfc(5) xor in_mulfc(2) xor in_mulfc(1);
out_mulfc(1) <= in_mulfc(6) xor in_mulfc(3) xor in_mulfc(2);
out_mulfc(2) <= in_mulfc(5) xor in_mulfc(4) xor in_mulfc(3) xor in_mulfc(2) xor in_mulfc(1) xor in_mulfc(0);
out_mulfc(3) <= in_mulfc(7) xor in_mulfc(6) xor in_mulfc(4) xor in_mulfc(3) xor in_mulfc(0);
out_mulfc(4) <= in_mulfc(7) xor in_mulfc(5) xor in_mulfc(4) xor in_mulfc(1) xor in_mulfc(0);
out_mulfc(5) <= in_mulfc(6) xor in_mulfc(5) xor in_mulfc(2) xor in_mulfc(1) xor in_mulfc(0);
out_mulfc(6) <= in_mulfc(6) xor in_mulfc(5) xor in_mulfc(3) xor in_mulfc(0);
out_mulfc(7) <= in_mulfc(7) xor in_mulfc(6) xor in_mulfc(4) xor in_mulfc(1) xor in_mulfc(0);
end mulfc_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by c1
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mulc1 is
port (
in_mulc1 : in std_logic_vector(7 downto 0);
out_mulc1 : out std_logic_vector(7 downto 0)
);
end mulc1;
 
 
architecture mulc1_arch of mulc1 is
begin
out_mulc1(0) <= in_mulc1(7) xor in_mulc1(5) xor in_mulc1(4) xor in_mulc1(3) xor in_mulc1(2) xor in_mulc1(1) xor in_mulc1(0);
out_mulc1(1) <= in_mulc1(6) xor in_mulc1(5) xor in_mulc1(4) xor in_mulc1(3) xor in_mulc1(2) xor in_mulc1(1);
out_mulc1(2) <= in_mulc1(6) xor in_mulc1(1);
out_mulc1(3) <= in_mulc1(5) xor in_mulc1(4) xor in_mulc1(3) xor in_mulc1(1);
out_mulc1(4) <= in_mulc1(6) xor in_mulc1(5) xor in_mulc1(4) xor in_mulc1(2);
out_mulc1(5) <= in_mulc1(7) xor in_mulc1(6) xor in_mulc1(5) xor in_mulc1(3);
out_mulc1(6) <= in_mulc1(6) xor in_mulc1(5) xor in_mulc1(3) xor in_mulc1(2) xor in_mulc1(1) xor in_mulc1(0);
out_mulc1(7) <= in_mulc1(7) xor in_mulc1(6) xor in_mulc1(4) xor in_mulc1(3) xor in_mulc1(2) xor in_mulc1(1) xor in_mulc1(0);
end mulc1_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 47
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul47 is
port (
in_mul47 : in std_logic_vector(7 downto 0);
out_mul47 : out std_logic_vector(7 downto 0)
);
end mul47;
 
architecture mul47_arch of mul47 is
begin
out_mul47(0) <= in_mul47(4) xor in_mul47(2) xor in_mul47(0);
out_mul47(1) <= in_mul47(5) xor in_mul47(3) xor in_mul47(1) xor in_mul47(0);
out_mul47(2) <= in_mul47(6) xor in_mul47(1) xor in_mul47(0);
out_mul47(3) <= in_mul47(7) xor in_mul47(4) xor in_mul47(1);
out_mul47(4) <= in_mul47(5) xor in_mul47(2);
out_mul47(5) <= in_mul47(6) xor in_mul47(3);
out_mul47(6) <= in_mul47(7) xor in_mul47(2) xor in_mul47(0);
out_mul47(7) <= in_mul47(3) xor in_mul47(1);
end mul47_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by ae
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mulae is
port (
in_mulae : in std_logic_vector(7 downto 0);
out_mulae : out std_logic_vector(7 downto 0)
);
end mulae;
 
architecture mulae_arch of mulae is
begin
out_mulae(0) <= in_mulae(7) xor in_mulae(5) xor in_mulae(1);
out_mulae(1) <= in_mulae(6) xor in_mulae(2) xor in_mulae(0);
out_mulae(2) <= in_mulae(5) xor in_mulae(3) xor in_mulae(0);
out_mulae(3) <= in_mulae(7) xor in_mulae(6) xor in_mulae(5) xor in_mulae(4) xor in_mulae(0);
out_mulae(4) <= in_mulae(7) xor in_mulae(6) xor in_mulae(5) xor in_mulae(1);
out_mulae(5) <= in_mulae(7) xor in_mulae(6) xor in_mulae(2) xor in_mulae(0);
out_mulae(6) <= in_mulae(5) xor in_mulae(3);
out_mulae(7) <= in_mulae(6) xor in_mulae(4) xor in_mulae(0);
end mulae_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 3d
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul3d is
port (
in_mul3d : in std_logic_vector(7 downto 0);
out_mul3d : out std_logic_vector(7 downto 0)
);
end mul3d;
 
architecture mul3d_arch of mul3d is
begin
out_mul3d(0) <= in_mul3d(4) xor in_mul3d(3) xor in_mul3d(0);
out_mul3d(1) <= in_mul3d(5) xor in_mul3d(4) xor in_mul3d(1);
out_mul3d(2) <= in_mul3d(6) xor in_mul3d(5) xor in_mul3d(4) xor in_mul3d(3) xor in_mul3d(2) xor in_mul3d(0);
out_mul3d(3) <= in_mul3d(7) xor in_mul3d(6) xor in_mul3d(5) xor in_mul3d(1) xor in_mul3d(0);
out_mul3d(4) <= in_mul3d(7) xor in_mul3d(6) xor in_mul3d(2) xor in_mul3d(1) xor in_mul3d(0);
out_mul3d(5) <= in_mul3d(7) xor in_mul3d(3) xor in_mul3d(2) xor in_mul3d(1) xor in_mul3d(0);
out_mul3d(6) <= in_mul3d(2) xor in_mul3d(1);
out_mul3d(7) <= in_mul3d(3) xor in_mul3d(2);
end mul3d_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 19
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul19 is
port (
in_mul19 : in std_logic_vector(7 downto 0);
out_mul19 : out std_logic_vector(7 downto 0)
);
end mul19;
 
architecture mul19_arch of mul19 is
begin
out_mul19(0) <= in_mul19(7) xor in_mul19(6) xor in_mul19(5) xor in_mul19(4) xor in_mul19(0);
out_mul19(1) <= in_mul19(7) xor in_mul19(6) xor in_mul19(5) xor in_mul19(1);
out_mul19(2) <= in_mul19(5) xor in_mul19(4) xor in_mul19(2);
out_mul19(3) <= in_mul19(7) xor in_mul19(4) xor in_mul19(3) xor in_mul19(0);
out_mul19(4) <= in_mul19(5) xor in_mul19(4) xor in_mul19(1) xor in_mul19(0);
out_mul19(5) <= in_mul19(6) xor in_mul19(5) xor in_mul19(2) xor in_mul19(1);
out_mul19(6) <= in_mul19(5) xor in_mul19(4) xor in_mul19(3) xor in_mul19(2);
out_mul19(7) <= in_mul19(6) xor in_mul19(5) xor in_mul19(4) xor in_mul19(3);
end mul19_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- multiplier by 03
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mul03 is
port (
in_mul03 : in std_logic_vector(7 downto 0);
out_mul03 : out std_logic_vector(7 downto 0)
);
end mul03;
 
architecture mul03_arch of mul03 is
begin
out_mul03(0) <= in_mul03(7) xor in_mul03(0);
out_mul03(1) <= in_mul03(1) xor in_mul03(0);
out_mul03(2) <= in_mul03(7) xor in_mul03(2) xor in_mul03(1);
out_mul03(3) <= in_mul03(7) xor in_mul03(3) xor in_mul03(2);
out_mul03(4) <= in_mul03(4) xor in_mul03(3);
out_mul03(5) <= in_mul03(5) xor in_mul03(4);
out_mul03(6) <= in_mul03(7) xor in_mul03(6) xor in_mul03(5);
out_mul03(7) <= in_mul03(7) xor in_mul03(6);
end mul03_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- twofish data input is the component
-- that transforms the data input to the
-- first round to the wanted form as is
-- described in the twofish prototype
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_data_input is
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end twofish_data_input;
 
architecture twofish_data_input_arch of twofish_data_input is
-- we declare internal signals
signal byte0, byte1, byte2, byte3,
byte4, byte5, byte6,
byte7, byte8, byte9,
byte10, byte11, byte12,
byte13, byte14, byte15 : std_logic_vector(7 downto 0);
signal P0, P1, P2, P3 : std_logic_vector(31 downto 0);
 
begin
-- we assign the input signal to the respective
-- bytes as is described in the prototype
byte15 <= in_tdi(7 downto 0);
byte14 <= in_tdi(15 downto 8);
byte13 <= in_tdi(23 downto 16);
byte12 <= in_tdi(31 downto 24);
byte11 <= in_tdi(39 downto 32);
byte10 <= in_tdi(47 downto 40);
byte9 <= in_tdi(55 downto 48);
byte8 <= in_tdi(63 downto 56);
byte7 <= in_tdi(71 downto 64);
byte6 <= in_tdi(79 downto 72);
byte5 <= in_tdi(87 downto 80);
byte4 <= in_tdi(95 downto 88);
byte3 <= in_tdi(103 downto 96);
byte2 <= in_tdi(111 downto 104);
byte1 <= in_tdi(119 downto 112);
byte0 <= in_tdi(127 downto 120);
 
-- we rearrange the bytes and send them to exit
P0 <= byte3 & byte2 & byte1 & byte0;
P1 <= byte7 & byte6 & byte5 & byte4;
P2 <= byte11 & byte10 & byte9 & byte8;
P3 <= byte15 & byte14 & byte13 & byte12;
 
out_tdi <= P0 & P1 & P2 & P3;
 
end twofish_data_input_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
 
--
-- twofish data output is the component
-- that transforms the data output from the
-- 16th round to the wanted form as is
-- described in the twofish prototype
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_data_output is
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end twofish_data_output;
 
architecture twofish_data_output_arch of twofish_data_output is
-- we declare internal signals
signal byte0, byte1, byte2, byte3,
byte4, byte5, byte6,
byte7, byte8, byte9,
byte10, byte11, byte12,
byte13, byte14, byte15 : std_logic_vector(7 downto 0);
signal C0, C1, C2, C3 : std_logic_vector(31 downto 0);
 
begin
-- we assign the input signal to the respective
-- bytes as is described in the prototype
byte15 <= in_tdo(7 downto 0);
byte14 <= in_tdo(15 downto 8);
byte13 <= in_tdo(23 downto 16);
byte12 <= in_tdo(31 downto 24);
byte11 <= in_tdo(39 downto 32);
byte10 <= in_tdo(47 downto 40);
byte9 <= in_tdo(55 downto 48);
byte8 <= in_tdo(63 downto 56);
byte7 <= in_tdo(71 downto 64);
byte6 <= in_tdo(79 downto 72);
byte5 <= in_tdo(87 downto 80);
byte4 <= in_tdo(95 downto 88);
byte3 <= in_tdo(103 downto 96);
byte2 <= in_tdo(111 downto 104);
byte1 <= in_tdo(119 downto 112);
byte0 <= in_tdo(127 downto 120);
 
-- we rearrange the bytes and send them to exit
C0 <= byte3 & byte2 & byte1 & byte0;
C1 <= byte7 & byte6 & byte5 & byte4;
C2 <= byte11 & byte10 & byte9 & byte8;
C3 <= byte15 & byte14 & byte13 & byte12;
 
out_tdo <= C0 & C1 & C2 & C3;
 
end twofish_data_output_arch;
 
-- =======-======================================= --
-- =============================================== --
-- --
-- second part: 128 key input dependent components --
-- --
-- =============================================== --
-- =============================================== --
 
 
--
-- reed solomon for 128bits key
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity reed_solomon128 is
port (
in_rs128 : in std_logic_vector(127 downto 0);
out_Sfirst_rs128,
out_Ssecond_rs128 : out std_logic_vector(31 downto 0)
);
end reed_solomon128;
 
architecture rs_128_arch of reed_solomon128 is
 
-- declaring all components necessary for reed solomon
-- 01
component mul01
port (
in_mul01 : in std_logic_vector(7 downto 0);
out_mul01 : out std_logic_vector(7 downto 0)
);
end component;
 
-- a4
component mula4
port (
in_mula4 : in std_logic_vector(7 downto 0);
out_mula4 : out std_logic_vector(7 downto 0)
);
end component;
 
-- 55
component mul55
port (
in_mul55 : in std_logic_vector(7 downto 0);
out_mul55 : out std_logic_vector(7 downto 0)
);
end component;
 
-- 87
component mul87
port (
in_mul87 : in std_logic_vector(7 downto 0);
out_mul87 : out std_logic_vector(7 downto 0)
);
end component;
 
-- 5a
component mul5a
port (
in_mul5a : in std_logic_vector(7 downto 0);
out_mul5a : out std_logic_vector(7 downto 0)
);
end component;
 
-- 58
component mul58
port (
in_mul58 : in std_logic_vector(7 downto 0);
out_mul58 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- db
component muldb
port (
in_muldb : in std_logic_vector(7 downto 0);
out_muldb : out std_logic_vector(7 downto 0)
);
end component;
 
-- 9e
component mul9e
port (
in_mul9e : in std_logic_vector(7 downto 0);
out_mul9e : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 56
component mul56
port (
in_mul56 : in std_logic_vector(7 downto 0);
out_mul56 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 82
component mul82
port (
in_mul82 : in std_logic_vector(7 downto 0);
out_mul82 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- f3
component mulf3
port (
in_mulf3 : in std_logic_vector(7 downto 0);
out_mulf3 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 1e
component mul1e
port (
in_mul1e : in std_logic_vector(7 downto 0);
out_mul1e : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- c6
component mulc6
port (
in_mulc6 : in std_logic_vector(7 downto 0);
out_mulc6 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 68
component mul68
port (
in_mul68 : in std_logic_vector(7 downto 0);
out_mul68 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- e5
component mule5
port (
in_mule5 : in std_logic_vector(7 downto 0);
out_mule5 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 02
component mul02
port (
in_mul02 : in std_logic_vector(7 downto 0);
out_mul02 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- a1
component mula1
port (
in_mula1 : in std_logic_vector(7 downto 0);
out_mula1 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- fc
component mulfc
port (
in_mulfc : in std_logic_vector(7 downto 0);
out_mulfc : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- c1
component mulc1
port (
in_mulc1 : in std_logic_vector(7 downto 0);
out_mulc1 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 47
component mul47
port (
in_mul47 : in std_logic_vector(7 downto 0);
out_mul47 : out std_logic_vector(7 downto 0)
);
end component;
 
 
 
-- ae
component mulae
port (
in_mulae : in std_logic_vector(7 downto 0);
out_mulae : out std_logic_vector(7 downto 0)
);
end component;
 
 
 
-- 3d
component mul3d
port (
in_mul3d : in std_logic_vector(7 downto 0);
out_mul3d : out std_logic_vector(7 downto 0)
);
end component;
 
 
 
-- 19
component mul19
port (
in_mul19 : in std_logic_vector(7 downto 0);
out_mul19 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 03
component mul03
port (
in_mul03 : in std_logic_vector(7 downto 0);
out_mul03 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- declaring internal signals
signal m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15 : std_logic_vector(7 downto 0);
signal s00,s01,s02,s03,s10,s11,s12,s13 : std_logic_vector(7 downto 0);
signal m0_01,m1_a4,m2_55,m3_87,m4_5a,m5_58,m6_db,m7_9e,
m0_a4,m1_56,m2_82,m3_f3,m4_1e,m5_c6,m6_68,m7_e5,
m0_02,m1_a1,m2_fc,m3_c1,m4_47,m5_ae,m6_3d,m7_19,
m0_a4_1,m1_55,m2_87,m3_5a,m4_58,m5_db,m6_9e,m7_03 : std_logic_vector(7 downto 0);
signal m8_01,m9_a4,m10_55,m11_87,m12_5a,m13_58,m14_db,m15_9e,
m8_a4,m9_56,m10_82,m11_f3,m12_1e,m13_c6,m14_68,m15_e5,
m8_02,m9_a1,m10_fc,m11_c1,m12_47,m13_ae,m14_3d,m15_19,
m8_a4_1,m9_55,m10_87,m11_5a,m12_58,m13_db,m14_9e,m15_03 : std_logic_vector(7 downto 0);
 
-- begin architecture description
begin
 
-- first, we separate the input to the respective m
-- for s1,j j=0..3
m0 <= in_rs128(7 downto 0);
m1 <= in_rs128(15 downto 8);
m2 <= in_rs128(23 downto 16);
m3 <= in_rs128(31 downto 24);
m4 <= in_rs128(39 downto 32);
m5 <= in_rs128(47 downto 40);
m6 <= in_rs128(55 downto 48);
m7 <= in_rs128(63 downto 56);
 
-- for s0,j j=0..3
m8 <= in_rs128(71 downto 64);
m9 <= in_rs128(79 downto 72);
m10 <= in_rs128(87 downto 80);
m11 <= in_rs128(95 downto 88);
m12 <= in_rs128(103 downto 96);
m13 <= in_rs128(111 downto 104);
m14 <= in_rs128(119 downto 112);
m15 <= in_rs128(127 downto 120);
 
 
-- after separating signals, we drive them to multipliers
-- the first line of m0..7 forms s00
m0_with_01: mul01
port map (
in_mul01 => m0,
out_mul01 => m0_01
);
 
m1_with_a4: mula4
port map (
in_mula4 => m1,
out_mula4 => m1_a4
);
 
m2_with_55: mul55
port map (
in_mul55 => m2,
out_mul55 => m2_55
);
 
m3_with_87: mul87
port map (
in_mul87 => m3,
out_mul87 => m3_87
);
 
m4_with_5a: mul5a
port map (
in_mul5a => m4,
out_mul5a => m4_5a
);
 
m5_with_58: mul58
port map (
in_mul58 => m5,
out_mul58 => m5_58
);
 
m6_with_db: muldb
port map (
in_muldb => m6,
out_muldb => m6_db
);
 
m7_with_9e: mul9e
port map (
in_mul9e => m7,
out_mul9e => m7_9e
);
 
-- the second row creates s01
m0_with_a4: mula4
port map (
in_mula4 => m0,
out_mula4 => m0_a4
);
 
m1_with_56: mul56
port map (
in_mul56 => m1,
out_mul56 => m1_56
);
 
m2_with_82: mul82
port map (
in_mul82 => m2,
out_mul82 => m2_82
);
m3_with_f3: mulf3
port map (
in_mulf3 => m3,
out_mulf3 => m3_f3
);
 
m4_with_1e: mul1e
port map (
in_mul1e => m4,
out_mul1e => m4_1e
);
 
m5_with_c6: mulc6
port map (
in_mulc6 => m5,
out_mulc6 => m5_c6
);
 
m6_with_68: mul68
port map (
in_mul68 => m6,
out_mul68 => m6_68
);
 
m7_with_e5: mule5
port map (
in_mule5 => m7,
out_mule5 => m7_e5
);
 
-- the third row creates s02
m0_with_02: mul02
port map (
in_mul02 => m0,
out_mul02 => m0_02
);
 
m1_with_a1: mula1
port map (
in_mula1 => m1,
out_mula1 => m1_a1
);
 
m2_with_fc: mulfc
port map (
in_mulfc => m2,
out_mulfc => m2_fc
);
 
m3_with_c1: mulc1
port map (
in_mulc1 => m3,
out_mulc1 => m3_c1
);
 
m4_with_47: mul47
port map (
in_mul47 => m4,
out_mul47 => m4_47
);
 
m5_with_ae: mulae
port map (
in_mulae => m5,
out_mulae => m5_ae
);
 
m6_with_3d: mul3d
port map (
in_mul3d => m6,
out_mul3d => m6_3d
);
 
m7_with_19: mul19
port map (
in_mul19 => m7,
out_mul19 => m7_19
);
 
-- the fourth row creates s03
m0_with_a4_1: mula4
port map (
in_mula4 => m0,
out_mula4 => m0_a4_1
);
 
m1_with_55: mul55
port map (
in_mul55 => m1,
out_mul55 => m1_55
);
 
m2_with_87: mul87
port map (
in_mul87 => m2,
out_mul87 => m2_87
);
 
m3_with_5a: mul5a
port map (
in_mul5a => m3,
out_mul5a => m3_5a
);
 
m4_with_58: mul58
port map (
in_mul58 => m4,
out_mul58 => m4_58
);
 
m5_with_db: muldb
port map (
in_muldb => m5,
out_muldb => m5_db
);
 
m6_with_9e: mul9e
port map (
in_mul9e => m6,
out_mul9e => m6_9e
);
 
m7_with_03: mul03
port map (
in_mul03 => m7,
out_mul03 => m7_03
);
 
 
-- we create the s1,j j=0..3
-- the first row of m0..7 creates the s10
m8_with_01: mul01
port map (
in_mul01 => m8,
out_mul01 => m8_01
);
 
m9_with_a4: mula4
port map (
in_mula4 => m9,
out_mula4 => m9_a4
);
 
m10_with_55: mul55
port map (
in_mul55 => m10,
out_mul55 => m10_55
);
 
m11_with_87: mul87
port map (
in_mul87 => m11,
out_mul87 => m11_87
);
 
m12_with_5a: mul5a
port map (
in_mul5a => m12,
out_mul5a => m12_5a
);
 
m13_with_58: mul58
port map (
in_mul58 => m13,
out_mul58 => m13_58
);
 
m14_with_db: muldb
port map (
in_muldb => m14,
out_muldb => m14_db
);
 
m15_with_9e: mul9e
port map (
in_mul9e => m15,
out_mul9e => m15_9e
);
 
-- the second row creates s11
m8_with_a4: mula4
port map (
in_mula4 => m8,
out_mula4 => m8_a4
);
 
m9_with_56: mul56
port map (
in_mul56 => m9,
out_mul56 => m9_56
);
 
m10_with_82: mul82
port map (
in_mul82 => m10,
out_mul82 => m10_82
);
m11_with_f3: mulf3
port map (
in_mulf3 => m11,
out_mulf3 => m11_f3
);
 
m12_with_1e: mul1e
port map (
in_mul1e => m12,
out_mul1e => m12_1e
);
 
m13_with_c6: mulc6
port map (
in_mulc6 => m13,
out_mulc6 => m13_c6
);
 
m14_with_68: mul68
port map (
in_mul68 => m14,
out_mul68 => m14_68
);
 
m15_with_e5: mule5
port map (
in_mule5 => m15,
out_mule5 => m15_e5
);
 
-- the third row creates s12
m8_with_02: mul02
port map (
in_mul02 => m8,
out_mul02 => m8_02
);
 
m9_with_a1: mula1
port map (
in_mula1 => m9,
out_mula1 => m9_a1
);
 
m10_with_fc: mulfc
port map (
in_mulfc => m10,
out_mulfc => m10_fc
);
 
m11_with_c1: mulc1
port map (
in_mulc1 => m11,
out_mulc1 => m11_c1
);
 
m12_with_47: mul47
port map (
in_mul47 => m12,
out_mul47 => m12_47
);
 
m13_with_ae: mulae
port map (
in_mulae => m13,
out_mulae => m13_ae
);
 
m14_with_3d: mul3d
port map (
in_mul3d => m14,
out_mul3d => m14_3d
);
 
m15_with_19: mul19
port map (
in_mul19 => m15,
out_mul19 => m15_19
);
 
-- the fourth row creates s13
m8_with_a4_1: mula4
port map (
in_mula4 => m8,
out_mula4 => m8_a4_1
);
 
m9_with_55: mul55
port map (
in_mul55 => m9,
out_mul55 => m9_55
);
 
m10_with_87: mul87
port map (
in_mul87 => m10,
out_mul87 => m10_87
);
 
m11_with_5a: mul5a
port map (
in_mul5a => m11,
out_mul5a => m11_5a
);
 
m12_with_58: mul58
port map (
in_mul58 => m12,
out_mul58 => m12_58
);
 
m13_with_db: muldb
port map (
in_muldb => m13,
out_muldb => m13_db
);
 
m14_with_9e: mul9e
port map (
in_mul9e => m14,
out_mul9e => m14_9e
);
 
m15_with_03: mul03
port map (
in_mul03 => m15,
out_mul03 => m15_03
);
 
 
-- after getting the results from multipliers
-- we combine them in order to get the additions
s00 <= m0_01 XOR m1_a4 XOR m2_55 XOR m3_87 XOR m4_5a XOR m5_58 XOR m6_db XOR m7_9e;
s01 <= m0_a4 XOR m1_56 XOR m2_82 XOR m3_f3 XOR m4_1e XOR m5_c6 XOR m6_68 XOR m7_e5;
s02 <= m0_02 XOR m1_a1 XOR m2_fc XOR m3_c1 XOR m4_47 XOR m5_ae XOR m6_3d XOR m7_19;
s03 <= m0_a4_1 XOR m1_55 XOR m2_87 XOR m3_5a XOR m4_58 XOR m5_db XOR m6_9e XOR m7_03;
 
-- after creating s0,j j=0...3 we form the S0
-- little endian
out_Sfirst_rs128 <= s03 & s02 & s01 & s00;
 
s10 <= m8_01 XOR m9_a4 XOR m10_55 XOR m11_87 XOR m12_5a XOR m13_58 XOR m14_db XOR m15_9e;
s11 <= m8_a4 XOR m9_56 XOR m10_82 XOR m11_f3 XOR m12_1e XOR m13_c6 XOR m14_68 XOR m15_e5;
s12 <= m8_02 XOR m9_a1 XOR m10_fc XOR m11_c1 XOR m12_47 XOR m13_ae XOR m14_3d XOR m15_19;
s13 <= m8_a4_1 XOR m9_55 XOR m10_87 XOR m11_5a XOR m12_58 XOR m13_db XOR m14_9e XOR m15_03;
 
-- after creating s1,j j=0...3 we form the S1
-- little endian
out_Ssecond_rs128 <= s13 & s12 & s11 & s10;
 
end rs_128_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- h function for 128 bits key
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity h_128 is
port (
in_h128 : in std_logic_vector(7 downto 0);
Mfirst_h128,
Msecond_h128 : in std_logic_vector(31 downto 0);
out_h128 : out std_logic_vector(31 downto 0)
);
end h_128;
 
architecture h128_arch of h_128 is
 
-- we declare internal signals
signal from_first_row,
to_second_row,
from_second_row,
to_third_row,
to_mds : std_logic_vector(31 downto 0);
-- we declare all components needed
component q0
port (
in_q0 : in std_logic_vector(7 downto 0);
out_q0 : out std_logic_vector(7 downto 0)
);
end component;
component q1
port (
in_q1 : in std_logic_vector(7 downto 0);
out_q1 : out std_logic_vector(7 downto 0)
);
end component;
 
component mds
port (
y0,
y1,
y2,
y3 : in std_logic_vector(7 downto 0);
z0,
z1,
z2,
z3 : out std_logic_vector(7 downto 0)
);
end component;
 
-- begin architecture description
begin
 
-- first row of q
first_q0_1: q0
port map (
in_q0 => in_h128,
out_q0 => from_first_row(7 downto 0)
);
first_q1_1: q1
port map (
in_q1 => in_h128,
out_q1 => from_first_row(15 downto 8)
);
first_q0_2: q0
port map (
in_q0 => in_h128,
out_q0 => from_first_row(23 downto 16)
);
first_q1_2: q1
port map (
in_q1 => in_h128,
out_q1 => from_first_row(31 downto 24)
);
 
-- we perform the XOR of the results of the first row
-- with first M of h (Mfist_h128)
to_second_row <= from_first_row XOR Mfirst_h128;
 
-- second row of q
second_q0_1: q0
port map (
in_q0 => to_second_row(7 downto 0),
out_q0 => from_second_row(7 downto 0)
);
second_q0_2: q0
port map (
in_q0 => to_second_row(15 downto 8),
out_q0 => from_second_row(15 downto 8)
);
second_q1_1: q1
port map (
in_q1 => to_second_row(23 downto 16),
out_q1 => from_second_row(23 downto 16)
);
second_q1_2: q1
port map (
in_q1 => to_second_row(31 downto 24),
out_q1 => from_second_row(31 downto 24)
);
-- we perform the second XOR
to_third_row <= from_second_row XOR Msecond_h128;
-- the third row of q
third_q1_1: q1
port map (
in_q1 => to_third_row(7 downto 0),
out_q1 => to_mds(7 downto 0)
);
third_q0_1: q0
port map (
in_q0 => to_third_row(15 downto 8),
out_q0 => to_mds(15 downto 8)
);
third_q1_2: q1
port map (
in_q1 => to_third_row(23 downto 16),
out_q1 => to_mds(23 downto 16)
);
third_q0_2: q0
port map (
in_q0 => to_third_row(31 downto 24),
out_q0 => to_mds(31 downto 24)
);
-- mds table
mds_table: mds
port map (
y0 => to_mds(7 downto 0),
y1 => to_mds(15 downto 8),
y2 => to_mds(23 downto 16),
y3 => to_mds(31 downto 24),
z0 => out_h128(7 downto 0),
z1 => out_h128(15 downto 8),
z2 => out_h128(23 downto 16),
z3 => out_h128(31 downto 24)
);
 
end h128_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
 
--
-- g function for 128 bits key
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity g_128 is
port (
in_g128,
in_S0_g128,
in_S1_g128 : in std_logic_vector(31 downto 0);
out_g128 : out std_logic_vector(31 downto 0)
);
end g_128;
 
architecture g128_arch of g_128 is
 
-- we declare the internal signals
signal from_first_row,
to_second_row,
from_second_row,
to_third_row,
to_mds : std_logic_vector(31 downto 0);
 
component q0
port (
in_q0 : in std_logic_vector(7 downto 0);
out_q0 : out std_logic_vector(7 downto 0)
);
end component;
component q1
port (
in_q1 : in std_logic_vector(7 downto 0);
out_q1 : out std_logic_vector(7 downto 0)
);
end component;
 
component mds
port (
y0,
y1,
y2,
y3 : in std_logic_vector(7 downto 0);
z0,
z1,
z2,
z3 : out std_logic_vector(7 downto 0)
);
end component;
 
-- begin architecture description
begin
 
-- first row of q
first_q0_1: q0
port map (
in_q0 => in_g128(7 downto 0),
out_q0 => from_first_row(7 downto 0)
);
first_q1_1: q1
port map (
in_q1 => in_g128(15 downto 8),
out_q1 => from_first_row(15 downto 8)
);
first_q0_2: q0
port map (
in_q0 => in_g128(23 downto 16),
out_q0 => from_first_row(23 downto 16)
);
first_q1_2: q1
port map (
in_q1 => in_g128(31 downto 24),
out_q1 => from_first_row(31 downto 24)
);
 
-- we XOR the result of the first row
-- with the S0
to_second_row <= from_first_row XOR in_S0_g128;
 
-- second row of q
second_q0_1: q0
port map (
in_q0 => to_second_row(7 downto 0),
out_q0 => from_second_row(7 downto 0)
);
second_q0_2: q0
port map (
in_q0 => to_second_row(15 downto 8),
out_q0 => from_second_row(15 downto 8)
);
second_q1_1: q1
port map (
in_q1 => to_second_row(23 downto 16),
out_q1 => from_second_row(23 downto 16)
);
second_q1_2: q1
port map (
in_q1 => to_second_row(31 downto 24),
out_q1 => from_second_row(31 downto 24)
);
-- we perform the XOR
to_third_row <= from_second_row XOR in_S1_g128;
-- third row of q
third_q1_1: q1
port map (
in_q1 => to_third_row(7 downto 0),
out_q1 => to_mds(7 downto 0)
);
third_q0_1: q0
port map (
in_q0 => to_third_row(15 downto 8),
out_q0 => to_mds(15 downto 8)
);
third_q1_2: q1
port map (
in_q1 => to_third_row(23 downto 16),
out_q1 => to_mds(23 downto 16)
);
third_q0_2: q0
port map (
in_q0 => to_third_row(31 downto 24),
out_q0 => to_mds(31 downto 24)
);
-- mds table
mds_table: mds
port map (
y0 => to_mds(7 downto 0),
y1 => to_mds(15 downto 8),
y2 => to_mds(23 downto 16),
y3 => to_mds(31 downto 24),
z0 => out_g128(7 downto 0),
z1 => out_g128(15 downto 8),
z2 => out_g128(23 downto 16),
z3 => out_g128(31 downto 24)
);
 
end g128_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
 
--
-- f function with 128 bits key
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity f_128 is
port (
up_in_f128,
low_in_f128,
S0_in_f128,
S1_in_f128,
up_key_f128,
low_key_f128 : in std_logic_vector(31 downto 0);
up_out_f128,
low_out_f128 : out std_logic_vector(31 downto 0)
);
end f_128;
 
architecture f128_arch of f_128 is
 
-- we declare the internal signals
signal from_shift_8,
to_up_pht,
to_low_pht,
to_up_key,
to_low_key,
intermediate_carry1,
intermediate_carry2 : std_logic_vector(31 downto 0);
signal zero : std_logic;
component g_128
port (
in_g128,
in_S0_g128,
in_S1_g128 : in std_logic_vector(31 downto 0);
out_g128 : out std_logic_vector(31 downto 0)
);
end component;
component pht
port (
up_in_pht,
down_in_pht : in std_logic_vector(31 downto 0);
up_out_pht,
down_out_pht : out std_logic_vector(31 downto 0)
);
end component;
 
component adder
port (
in1_adder,
in2_adder,
in_carry_adder : in std_logic;
out_adder,
out_carry_adder : out std_logic
);
end component;
 
-- begin architecture description
begin
 
-- we initialize zero
zero <= '0';
-- upper g_128
upper_g128: g_128
port map (
in_g128 => up_in_f128,
in_S0_g128 => S0_in_f128,
in_S1_g128 => S1_in_f128,
out_g128 => to_up_pht
);
-- left rotation by 8
from_shift_8(31 downto 8) <= low_in_f128(23 downto 0);
from_shift_8(7 downto 0) <= low_in_f128(31 downto 24);
-- lower g128
lower_g128: g_128
port map (
in_g128 => from_shift_8,
in_S0_g128 => S0_in_f128,
in_S1_g128 => S1_in_f128,
out_g128 => to_low_pht
);
-- pht
pht_transform: pht
port map (
up_in_pht => to_up_pht,
down_in_pht => to_low_pht,
up_out_pht => to_up_key,
down_out_pht => to_low_key
);
-- upper adder of 32 bits
up_adder: for i in 0 to 31 generate
first: if (i=0) generate
the_adder: adder
port map (
in1_adder => to_up_key(0),
in2_adder => up_key_f128(0),
in_carry_adder => zero,
out_adder => up_out_f128(0),
out_carry_adder => intermediate_carry1(0)
);
end generate first;
the_rest: if (i>0) generate
the_adders: adder
port map (
in1_adder => to_up_key(i),
in2_adder => up_key_f128(i),
in_carry_adder => intermediate_carry1(i-1),
out_adder => up_out_f128(i),
out_carry_adder => intermediate_carry1(i)
);
end generate the_rest;
end generate up_adder;
 
-- lower adder of 32 bits
low_adder: for i in 0 to 31 generate
first1: if (i=0) generate
the_adder1:adder
port map (
in1_adder => to_low_key(0),
in2_adder => low_key_f128(0),
in_carry_adder => zero,
out_adder => low_out_f128(0),
out_carry_adder => intermediate_carry2(0)
);
end generate first1;
the_rest1: if (i>0) generate
the_adders1: adder
port map (
in1_adder => to_low_key(i),
in2_adder => low_key_f128(i),
in_carry_adder => intermediate_carry2(i-1),
out_adder => low_out_f128(i),
out_carry_adder => intermediate_carry2(i)
);
end generate the_rest1;
end generate low_adder;
 
end f128_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- twofish key scheduler for 128 bits key input
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_keysched128 is
port (
odd_in_tk128,
even_in_tk128 : in std_logic_vector(7 downto 0);
in_key_tk128 : in std_logic_vector(127 downto 0);
out_key_up_tk128,
out_key_down_tk128 : out std_logic_vector(31 downto 0)
);
end twofish_keysched128;
architecture twofish_keysched128_arch of twofish_keysched128 is
 
-- we declare internal signals
signal to_up_pht,
to_shift_8,
from_shift_8,
to_shift_9,
M0, M1, M2, M3 : std_logic_vector(31 downto 0);
 
signal byte0, byte1, byte2, byte3,
byte4, byte5, byte6, byte7,
byte8, byte9, byte10, byte11,
byte12, byte13, byte14, byte15 : std_logic_vector(7 downto 0);
-- we declare the components to be used
component pht
port (
up_in_pht,
down_in_pht : in std_logic_vector(31 downto 0);
up_out_pht,
down_out_pht : out std_logic_vector(31 downto 0)
);
end component;
 
component h_128
port (
in_h128 : in std_logic_vector(7 downto 0);
Mfirst_h128,
Msecond_h128 : in std_logic_vector(31 downto 0);
out_h128 : out std_logic_vector(31 downto 0)
);
end component;
 
-- begin architecture description
begin
 
-- we assign the input signal to the respective
-- bytes as is described in the prototype
byte15 <= in_key_tk128(7 downto 0);
byte14 <= in_key_tk128(15 downto 8);
byte13 <= in_key_tk128(23 downto 16);
byte12 <= in_key_tk128(31 downto 24);
byte11 <= in_key_tk128(39 downto 32);
byte10 <= in_key_tk128(47 downto 40);
byte9 <= in_key_tk128(55 downto 48);
byte8 <= in_key_tk128(63 downto 56);
byte7 <= in_key_tk128(71 downto 64);
byte6 <= in_key_tk128(79 downto 72);
byte5 <= in_key_tk128(87 downto 80);
byte4 <= in_key_tk128(95 downto 88);
byte3 <= in_key_tk128(103 downto 96);
byte2 <= in_key_tk128(111 downto 104);
byte1 <= in_key_tk128(119 downto 112);
byte0 <= in_key_tk128(127 downto 120);
 
-- we form the M{0..3}
M0 <= byte3 & byte2 & byte1 & byte0;
M1 <= byte7 & byte6 & byte5 & byte4;
M2 <= byte11 & byte10 & byte9 & byte8;
M3 <= byte15 & byte14 & byte13 & byte12;
 
-- upper h
upper_h: h_128
port map (
in_h128 => even_in_tk128,
Mfirst_h128 => M2,
Msecond_h128 => M0,
out_h128 => to_up_pht
);
-- lower h
lower_h: h_128
port map (
in_h128 => odd_in_tk128,
Mfirst_h128 => M3,
Msecond_h128 => M1,
out_h128 => to_shift_8
);
-- left rotate by 8
from_shift_8(31 downto 8) <= to_shift_8(23 downto 0);
from_shift_8(7 downto 0) <= to_shift_8(31 downto 24);
-- pht transformation
pht_transform: pht
port map (
up_in_pht => to_up_pht,
down_in_pht => from_shift_8,
up_out_pht => out_key_up_tk128,
down_out_pht => to_shift_9
);
-- left rotate by 9
out_key_down_tk128(31 downto 9) <= to_shift_9(22 downto 0);
out_key_down_tk128(8 downto 0) <= to_shift_9(31 downto 23);
 
end twofish_keysched128_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- twofish S key component for 128 bits key
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_S128 is
port (
in_key_ts128 : in std_logic_vector(127 downto 0);
out_Sfirst_ts128,
out_Ssecond_ts128 : out std_logic_vector(31 downto 0)
);
end twofish_S128;
architecture twofish_S128_arch of twofish_S128 is
-- we declare the components to be used
component reed_solomon128
port (
in_rs128 : in std_logic_vector(127 downto 0);
out_Sfirst_rs128,
out_Ssecond_rs128 : out std_logic_vector(31 downto 0)
);
end component;
signal twofish_key : std_logic_vector(127 downto 0);
signal byte15, byte14, byte13, byte12, byte11, byte10,
byte9, byte8, byte7, byte6, byte5, byte4,
byte3, byte2, byte1, byte0 : std_logic_vector(7 downto 0);
 
-- begin architecture description
begin
 
-- splitting the input
byte15 <= in_key_ts128(7 downto 0);
byte14 <= in_key_ts128(15 downto 8);
byte13 <= in_key_ts128(23 downto 16);
byte12 <= in_key_ts128(31 downto 24);
byte11 <= in_key_ts128(39 downto 32);
byte10 <= in_key_ts128(47 downto 40);
byte9 <= in_key_ts128(55 downto 48);
byte8 <= in_key_ts128(63 downto 56);
byte7 <= in_key_ts128(71 downto 64);
byte6 <= in_key_ts128(79 downto 72);
byte5 <= in_key_ts128(87 downto 80);
byte4 <= in_key_ts128(95 downto 88);
byte3 <= in_key_ts128(103 downto 96);
byte2 <= in_key_ts128(111 downto 104);
byte1 <= in_key_ts128(119 downto 112);
byte0 <= in_key_ts128(127 downto 120);
 
-- forming the key
twofish_key <= byte15 & byte14 & byte13 & byte12 & byte11 & byte10 & byte9 & byte8 & byte7 &
byte6 & byte5 & byte4 & byte3 & byte2 & byte1 & byte0;
 
 
-- the keys S0,1
produce_S0_S1: reed_solomon128
port map (
in_rs128 => twofish_key,
out_Sfirst_rs128 => out_Sfirst_ts128,
out_Ssecond_rs128 => out_Ssecond_ts128
);
 
 
end twofish_S128_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- twofish whitening key scheduler for 128 bits key input
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_whit_keysched128 is
port (
in_key_twk128 : in std_logic_vector(127 downto 0);
out_K0_twk128,
out_K1_twk128,
out_K2_twk128,
out_K3_twk128,
out_K4_twk128,
out_K5_twk128,
out_K6_twk128,
out_K7_twk128 : out std_logic_vector(31 downto 0)
);
end twofish_whit_keysched128;
architecture twofish_whit_keysched128_arch of twofish_whit_keysched128 is
 
-- we declare internal signals
signal to_up_pht_1,
to_shift_8_1,
from_shift_8_1,
to_shift_9_1,
to_up_pht_2,
to_shift_8_2,
from_shift_8_2,
to_shift_9_2,
to_up_pht_3,
to_shift_8_3,
from_shift_8_3,
to_shift_9_3,
to_up_pht_4,
to_shift_8_4,
from_shift_8_4,
to_shift_9_4,
M0, M1, M2, M3 : std_logic_vector(31 downto 0);
 
signal byte0, byte1, byte2, byte3,
byte4, byte5, byte6, byte7,
byte8, byte9, byte10, byte11,
byte12, byte13, byte14, byte15 : std_logic_vector(7 downto 0);
 
signal zero, one, two, three, four, five, six, seven : std_logic_vector(7 downto 0);
-- we declare the components to be used
component pht
port (
up_in_pht,
down_in_pht : in std_logic_vector(31 downto 0);
up_out_pht,
down_out_pht : out std_logic_vector(31 downto 0)
);
end component;
 
component h_128
port (
in_h128 : in std_logic_vector(7 downto 0);
Mfirst_h128,
Msecond_h128 : in std_logic_vector(31 downto 0);
out_h128 : out std_logic_vector(31 downto 0)
);
end component;
 
-- begin architecture description
begin
 
-- we produce the first eight numbers
zero <= "00000000";
one <= "00000001";
two <= "00000010";
three <= "00000011";
four <= "00000100";
five <= "00000101";
six <= "00000110";
seven <= "00000111";
 
-- we assign the input signal to the respective
-- bytes as is described in the prototype
byte15 <= in_key_twk128(7 downto 0);
byte14 <= in_key_twk128(15 downto 8);
byte13 <= in_key_twk128(23 downto 16);
byte12 <= in_key_twk128(31 downto 24);
byte11 <= in_key_twk128(39 downto 32);
byte10 <= in_key_twk128(47 downto 40);
byte9 <= in_key_twk128(55 downto 48);
byte8 <= in_key_twk128(63 downto 56);
byte7 <= in_key_twk128(71 downto 64);
byte6 <= in_key_twk128(79 downto 72);
byte5 <= in_key_twk128(87 downto 80);
byte4 <= in_key_twk128(95 downto 88);
byte3 <= in_key_twk128(103 downto 96);
byte2 <= in_key_twk128(111 downto 104);
byte1 <= in_key_twk128(119 downto 112);
byte0 <= in_key_twk128(127 downto 120);
 
-- we form the M{0..3}
M0 <= byte3 & byte2 & byte1 & byte0;
M1 <= byte7 & byte6 & byte5 & byte4;
M2 <= byte11 & byte10 & byte9 & byte8;
M3 <= byte15 & byte14 & byte13 & byte12;
 
-- we produce the keys for the whitening steps
-- keys K0,1
-- upper h
upper_h1: h_128
port map (
in_h128 => zero,
Mfirst_h128 => M2,
Msecond_h128 => M0,
out_h128 => to_up_pht_1
);
-- lower h
lower_h1: h_128
port map (
in_h128 => one,
Mfirst_h128 => M3,
Msecond_h128 => M1,
out_h128 => to_shift_8_1
);
-- left rotate by 8
from_shift_8_1(31 downto 8) <= to_shift_8_1(23 downto 0);
from_shift_8_1(7 downto 0) <= to_shift_8_1(31 downto 24);
-- pht transformation
pht_transform1: pht
port map (
up_in_pht => to_up_pht_1,
down_in_pht => from_shift_8_1,
up_out_pht => out_K0_twk128,
down_out_pht => to_shift_9_1
);
-- left rotate by 9
out_K1_twk128(31 downto 9) <= to_shift_9_1(22 downto 0);
out_K1_twk128(8 downto 0) <= to_shift_9_1(31 downto 23);
 
-- keys K2,3
-- upper h
upper_h2: h_128
port map (
in_h128 => two,
Mfirst_h128 => M2,
Msecond_h128 => M0,
out_h128 => to_up_pht_2
);
-- lower h
lower_h2: h_128
port map (
in_h128 => three,
Mfirst_h128 => M3,
Msecond_h128 => M1,
out_h128 => to_shift_8_2
);
-- left rotate by 8
from_shift_8_2(31 downto 8) <= to_shift_8_2(23 downto 0);
from_shift_8_2(7 downto 0) <= to_shift_8_2(31 downto 24);
-- pht transformation
pht_transform2: pht
port map (
up_in_pht => to_up_pht_2,
down_in_pht => from_shift_8_2,
up_out_pht => out_K2_twk128,
down_out_pht => to_shift_9_2
);
-- left rotate by 9
out_K3_twk128(31 downto 9) <= to_shift_9_2(22 downto 0);
out_K3_twk128(8 downto 0) <= to_shift_9_2(31 downto 23);
 
-- keys K4,5
-- upper h
upper_h3: h_128
port map (
in_h128 => four,
Mfirst_h128 => M2,
Msecond_h128 => M0,
out_h128 => to_up_pht_3
);
-- lower h
lower_h3: h_128
port map (
in_h128 => five,
Mfirst_h128 => M3,
Msecond_h128 => M1,
out_h128 => to_shift_8_3
);
-- left rotate by 8
from_shift_8_3(31 downto 8) <= to_shift_8_3(23 downto 0);
from_shift_8_3(7 downto 0) <= to_shift_8_3(31 downto 24);
-- pht transformation
pht_transform3: pht
port map (
up_in_pht => to_up_pht_3,
down_in_pht => from_shift_8_3,
up_out_pht => out_K4_twk128,
down_out_pht => to_shift_9_3
);
-- left rotate by 9
out_K5_twk128(31 downto 9) <= to_shift_9_3(22 downto 0);
out_K5_twk128(8 downto 0) <= to_shift_9_3(31 downto 23);
 
-- keys K6,7
-- upper h
upper_h4: h_128
port map (
in_h128 => six,
Mfirst_h128 => M2,
Msecond_h128 => M0,
out_h128 => to_up_pht_4
);
-- lower h
lower_h4: h_128
port map (
in_h128 => seven,
Mfirst_h128 => M3,
Msecond_h128 => M1,
out_h128 => to_shift_8_4
);
-- left rotate by 8
from_shift_8_4(31 downto 8) <= to_shift_8_4(23 downto 0);
from_shift_8_4(7 downto 0) <= to_shift_8_4(31 downto 24);
-- pht transformation
pht_transform4: pht
port map (
up_in_pht => to_up_pht_4,
down_in_pht => from_shift_8_4,
up_out_pht => out_K6_twk128,
down_out_pht => to_shift_9_4
);
-- left rotate by 9
out_K7_twk128(31 downto 9) <= to_shift_9_4(22 downto 0);
out_K7_twk128(8 downto 0) <= to_shift_9_4(31 downto 23);
 
end twofish_whit_keysched128_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- twofish encryption round with 128 bit key input
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_encryption_round128 is
port (
in1_ter128,
in2_ter128,
in3_ter128,
in4_ter128,
in_Sfirst_ter128,
in_Ssecond_ter128,
in_key_up_ter128,
in_key_down_ter128 : in std_logic_vector(31 downto 0);
out1_ter128,
out2_ter128,
out3_ter128,
out4_ter128 : out std_logic_vector(31 downto 0)
);
end twofish_encryption_round128;
 
architecture twofish_encryption_round128_arch of twofish_encryption_round128 is
-- we declare internal signals
signal to_left_shift,
from_right_shift,
to_xor_with3,
to_xor_with4 : std_logic_vector(31 downto 0);
component f_128
port (
up_in_f128,
low_in_f128,
S0_in_f128,
S1_in_f128,
up_key_f128,
low_key_f128 : in std_logic_vector(31 downto 0);
up_out_f128,
low_out_f128 : out std_logic_vector(31 downto 0)
);
end component;
 
-- begin architecture description
begin
 
-- we declare f_128
function_f: f_128
port map (
up_in_f128 => in1_ter128,
low_in_f128 => in2_ter128,
S0_in_f128 => in_Sfirst_ter128,
S1_in_f128 => in_Ssecond_ter128,
up_key_f128 => in_key_up_ter128,
low_key_f128 => in_key_down_ter128,
up_out_f128 => to_xor_with3,
low_out_f128 => to_xor_with4
);
-- we perform the exchange
-- in1_ter128 -> out3_ter128
-- in2_ter128 -> out4_ter128
-- in3_ter128 -> out1_ter128
-- in4_ter128 -> out2_ter128
-- we perform the left xor between the upper f function and
-- the third input (input 3)
to_left_shift <= to_xor_with3 XOR in3_ter128;
-- we perform the left side rotation to the right by 1 and
-- we perform the exchange too
out1_ter128(30 downto 0) <= to_left_shift(31 downto 1);
out1_ter128(31) <= to_left_shift(0);
-- we perform the right side rotation to the left by 1
from_right_shift(0) <= in4_ter128(31);
from_right_shift(31 downto 1) <= in4_ter128(30 downto 0);
-- we perform the right xor between the lower f function and
-- the fourth input (input 4)
out2_ter128 <= from_right_shift XOR to_xor_with4;
-- we perform the last exchanges
out3_ter128 <= in1_ter128;
out4_ter128 <= in2_ter128;
 
end twofish_encryption_round128_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- twofish decryption round with 128 bit key input
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_decryption_round128 is
port (
in1_tdr128,
in2_tdr128,
in3_tdr128,
in4_tdr128,
in_Sfirst_tdr128,
in_Ssecond_tdr128,
in_key_up_tdr128,
in_key_down_tdr128 : in std_logic_vector(31 downto 0);
out1_tdr128,
out2_tdr128,
out3_tdr128,
out4_tdr128 : out std_logic_vector(31 downto 0)
);
end twofish_decryption_round128;
 
architecture twofish_decryption_round128_arch of twofish_decryption_round128 is
 
signal to_xor_with3,
to_xor_with4,
to_xor_with_up_f,
from_xor_with_down_f : std_logic_vector(31 downto 0);
 
component f_128
port (
up_in_f128,
low_in_f128,
S0_in_f128,
S1_in_f128,
up_key_f128,
low_key_f128 : in std_logic_vector(31 downto 0);
up_out_f128,
low_out_f128 : out std_logic_vector(31 downto 0)
);
end component;
 
begin
 
-- we instantiate f function
function_f: f_128
port map (
up_in_f128 => in1_tdr128,
low_in_f128 => in2_tdr128,
S0_in_f128 => in_Sfirst_tdr128,
S1_in_f128 => in_Ssecond_tdr128,
up_key_f128 => in_key_up_tdr128,
low_key_f128 => in_key_down_tdr128,
up_out_f128 => to_xor_with3,
low_out_f128 => to_xor_with4
);
-- output 1: input3 with upper f
-- we first rotate the input3 by 1 bit leftwise
to_xor_with_up_f(0) <= in3_tdr128(31);
to_xor_with_up_f(31 downto 1) <= in3_tdr128(30 downto 0);
-- we perform the XOR with the upper output of f and the result
-- is ouput 1
out1_tdr128 <= to_xor_with_up_f XOR to_xor_with3;
-- output 2: input4 with lower f
-- we perform the XOR with the lower output of f
from_xor_with_down_f <= in4_tdr128 XOR to_xor_with4;
-- we perform the rotation by 1 bit rightwise and the result
-- is output2
out2_tdr128(31) <= from_xor_with_down_f(0);
out2_tdr128(30 downto 0) <= from_xor_with_down_f(31 downto 1);
-- we assign outputs 3 and 4
out3_tdr128 <= in1_tdr128;
out4_tdr128 <= in2_tdr128;
 
end twofish_decryption_round128_arch;
 
-- ============================================== --
-- ============================================== --
-- --
-- third part: 192 key input dependent components --
-- --
-- ============================================== --
-- ============================================== --
 
--
-- reed solomon for 192bits key
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity reed_solomon192 is
port (
in_rs192 : in std_logic_vector(191 downto 0);
out_Sfirst_rs192,
out_Ssecond_rs192,
out_Sthird_rs192 : out std_logic_vector(31 downto 0)
);
end reed_solomon192;
 
architecture rs_192_arch of reed_solomon192 is
 
-- declaring all components necessary for reed solomon
-- 01
component mul01
port (
in_mul01 : in std_logic_vector(7 downto 0);
out_mul01 : out std_logic_vector(7 downto 0)
);
end component;
 
-- a4
component mula4
port (
in_mula4 : in std_logic_vector(7 downto 0);
out_mula4 : out std_logic_vector(7 downto 0)
);
end component;
 
-- 55
component mul55
port (
in_mul55 : in std_logic_vector(7 downto 0);
out_mul55 : out std_logic_vector(7 downto 0)
);
end component;
 
-- 87
component mul87
port (
in_mul87 : in std_logic_vector(7 downto 0);
out_mul87 : out std_logic_vector(7 downto 0)
);
end component;
 
-- 5a
component mul5a
port (
in_mul5a : in std_logic_vector(7 downto 0);
out_mul5a : out std_logic_vector(7 downto 0)
);
end component;
 
-- 58
component mul58
port (
in_mul58 : in std_logic_vector(7 downto 0);
out_mul58 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- db
component muldb
port (
in_muldb : in std_logic_vector(7 downto 0);
out_muldb : out std_logic_vector(7 downto 0)
);
end component;
 
-- 9e
component mul9e
port (
in_mul9e : in std_logic_vector(7 downto 0);
out_mul9e : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 56
component mul56
port (
in_mul56 : in std_logic_vector(7 downto 0);
out_mul56 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 82
component mul82
port (
in_mul82 : in std_logic_vector(7 downto 0);
out_mul82 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- f3
component mulf3
port (
in_mulf3 : in std_logic_vector(7 downto 0);
out_mulf3 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 1e
component mul1e
port (
in_mul1e : in std_logic_vector(7 downto 0);
out_mul1e : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- c6
component mulc6
port (
in_mulc6 : in std_logic_vector(7 downto 0);
out_mulc6 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 68
component mul68
port (
in_mul68 : in std_logic_vector(7 downto 0);
out_mul68 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- e5
component mule5
port (
in_mule5 : in std_logic_vector(7 downto 0);
out_mule5 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 02
component mul02
port (
in_mul02 : in std_logic_vector(7 downto 0);
out_mul02 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- a1
component mula1
port (
in_mula1 : in std_logic_vector(7 downto 0);
out_mula1 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- fc
component mulfc
port (
in_mulfc : in std_logic_vector(7 downto 0);
out_mulfc : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- c1
component mulc1
port (
in_mulc1 : in std_logic_vector(7 downto 0);
out_mulc1 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 47
component mul47
port (
in_mul47 : in std_logic_vector(7 downto 0);
out_mul47 : out std_logic_vector(7 downto 0)
);
end component;
 
 
 
-- ae
component mulae
port (
in_mulae : in std_logic_vector(7 downto 0);
out_mulae : out std_logic_vector(7 downto 0)
);
end component;
 
 
 
-- 3d
component mul3d
port (
in_mul3d : in std_logic_vector(7 downto 0);
out_mul3d : out std_logic_vector(7 downto 0)
);
end component;
 
 
 
-- 19
component mul19
port (
in_mul19 : in std_logic_vector(7 downto 0);
out_mul19 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- 03
component mul03
port (
in_mul03 : in std_logic_vector(7 downto 0);
out_mul03 : out std_logic_vector(7 downto 0)
);
end component;
 
 
-- declaring internal signals
signal m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,
m16, m17, m18, m19, m20, m21, m22, m23 : std_logic_vector(7 downto 0);
signal s00,s01,s02,s03,s10,s11,s12,s13, s20, s21, s22, s23 : std_logic_vector(7 downto 0);
signal m0_01,m1_a4,m2_55,m3_87,m4_5a,m5_58,m6_db,m7_9e,
m0_a4,m1_56,m2_82,m3_f3,m4_1e,m5_c6,m6_68,m7_e5,
m0_02,m1_a1,m2_fc,m3_c1,m4_47,m5_ae,m6_3d,m7_19,
m0_a4_1,m1_55,m2_87,m3_5a,m4_58,m5_db,m6_9e,m7_03 : std_logic_vector(7 downto 0);
signal m8_01,m9_a4,m10_55,m11_87,m12_5a,m13_58,m14_db,m15_9e,
m8_a4,m9_56,m10_82,m11_f3,m12_1e,m13_c6,m14_68,m15_e5,
m8_02,m9_a1,m10_fc,m11_c1,m12_47,m13_ae,m14_3d,m15_19,
m8_a4_1,m9_55,m10_87,m11_5a,m12_58,m13_db,m14_9e,m15_03 : std_logic_vector(7 downto 0);
signal m16_01,m17_a4,m18_55,m19_87,m20_5a,m21_58,m22_db,m23_9e,
m16_a4,m17_56,m18_82,m19_f3,m20_1e,m21_c6,m22_68,m23_e5,
m16_02,m17_a1,m18_fc,m19_c1,m20_47,m21_ae,m22_3d,m23_19,
m16_a4_1,m17_55,m18_87,m19_5a,m20_58,m21_db,m22_9e,m23_03 : std_logic_vector(7 downto 0);
 
 
-- begin architecture description
begin
 
-- first, we separate the input to the respective m
-- for s0j j=0..3
m0 <= in_rs192(7 downto 0);
m1 <= in_rs192(15 downto 8);
m2 <= in_rs192(23 downto 16);
m3 <= in_rs192(31 downto 24);
m4 <= in_rs192(39 downto 32);
m5 <= in_rs192(47 downto 40);
m6 <= in_rs192(55 downto 48);
m7 <= in_rs192(63 downto 56);
 
-- for s1j j=0..3
m8 <= in_rs192(71 downto 64);
m9 <= in_rs192(79 downto 72);
m10 <= in_rs192(87 downto 80);
m11 <= in_rs192(95 downto 88);
m12 <= in_rs192(103 downto 96);
m13 <= in_rs192(111 downto 104);
m14 <= in_rs192(119 downto 112);
m15 <= in_rs192(127 downto 120);
 
-- for s2j j=0..3
m16 <= in_rs192(135 downto 128);
m17 <= in_rs192(143 downto 136);
m18 <= in_rs192(151 downto 144);
m19 <= in_rs192(159 downto 152);
m20 <= in_rs192(167 downto 160);
m21 <= in_rs192(175 downto 168);
m22 <= in_rs192(183 downto 176);
m23 <= in_rs192(191 downto 184);
 
 
-- after separating signals, we drive them to multipliers
-- the first line of m0..7 forms s00
m0_with_01: mul01
port map (
in_mul01 => m0,
out_mul01 => m0_01
);
 
m1_with_a4: mula4
port map (
in_mula4 => m1,
out_mula4 => m1_a4
);
 
m2_with_55: mul55
port map (
in_mul55 => m2,
out_mul55 => m2_55
);
 
m3_with_87: mul87
port map (
in_mul87 => m3,
out_mul87 => m3_87
);
 
m4_with_5a: mul5a
port map (
in_mul5a => m4,
out_mul5a => m4_5a
);
 
m5_with_58: mul58
port map (
in_mul58 => m5,
out_mul58 => m5_58
);
 
m6_with_db: muldb
port map (
in_muldb => m6,
out_muldb => m6_db
);
 
m7_with_9e: mul9e
port map (
in_mul9e => m7,
out_mul9e => m7_9e
);
 
-- the second row creates s01
m0_with_a4: mula4
port map (
in_mula4 => m0,
out_mula4 => m0_a4
);
 
m1_with_56: mul56
port map (
in_mul56 => m1,
out_mul56 => m1_56
);
 
m2_with_82: mul82
port map (
in_mul82 => m2,
out_mul82 => m2_82
);
m3_with_f3: mulf3
port map (
in_mulf3 => m3,
out_mulf3 => m3_f3
);
 
m4_with_1e: mul1e
port map (
in_mul1e => m4,
out_mul1e => m4_1e
);
 
m5_with_c6: mulc6
port map (
in_mulc6 => m5,
out_mulc6 => m5_c6
);
 
m6_with_68: mul68
port map (
in_mul68 => m6,
out_mul68 => m6_68
);
 
m7_with_e5: mule5
port map (
in_mule5 => m7,
out_mule5 => m7_e5
);
 
-- the third row creates s02
m0_with_02: mul02
port map (
in_mul02 => m0,
out_mul02 => m0_02
);
 
m1_with_a1: mula1
port map (
in_mula1 => m1,
out_mula1 => m1_a1
);
 
m2_with_fc: mulfc
port map (
in_mulfc => m2,
out_mulfc => m2_fc
);
 
m3_with_c1: mulc1
port map (
in_mulc1 => m3,
out_mulc1 => m3_c1
);
 
m4_with_47: mul47
port map (
in_mul47 => m4,
out_mul47 => m4_47
);
 
m5_with_ae: mulae
port map (
in_mulae => m5,
out_mulae => m5_ae
);
 
m6_with_3d: mul3d
port map (
in_mul3d => m6,
out_mul3d => m6_3d
);
 
m7_with_19: mul19
port map (
in_mul19 => m7,
out_mul19 => m7_19
);
 
-- the fourth row creates s03
m0_with_a4_1: mula4
port map (
in_mula4 => m0,
out_mula4 => m0_a4_1
);
 
m1_with_55: mul55
port map (
in_mul55 => m1,
out_mul55 => m1_55
);
 
m2_with_87: mul87
port map (
in_mul87 => m2,
out_mul87 => m2_87
);
 
m3_with_5a: mul5a
port map (
in_mul5a => m3,
out_mul5a => m3_5a
);
 
m4_with_58: mul58
port map (
in_mul58 => m4,
out_mul58 => m4_58
);
 
m5_with_db: muldb
port map (
in_muldb => m5,
out_muldb => m5_db
);
 
m6_with_9e: mul9e
port map (
in_mul9e => m6,
out_mul9e => m6_9e
);
 
m7_with_03: mul03
port map (
in_mul03 => m7,
out_mul03 => m7_03
);
 
 
-- we create the s1,j j=0..3
-- the first row of m8..15 creates the s10
m8_with_01: mul01
port map (
in_mul01 => m8,
out_mul01 => m8_01
);
 
m9_with_a4: mula4
port map (
in_mula4 => m9,
out_mula4 => m9_a4
);
 
m10_with_55: mul55
port map (
in_mul55 => m10,
out_mul55 => m10_55
);
 
m11_with_87: mul87
port map (
in_mul87 => m11,
out_mul87 => m11_87
);
 
m12_with_5a: mul5a
port map (
in_mul5a => m12,
out_mul5a => m12_5a
);
 
m13_with_58: mul58
port map (
in_mul58 => m13,
out_mul58 => m13_58
);
 
m14_with_db: muldb
port map (
in_muldb => m14,
out_muldb => m14_db
);
 
m15_with_9e: mul9e
port map (
in_mul9e => m15,
out_mul9e => m15_9e
);
 
-- the second row creates s11
m8_with_a4: mula4
port map (
in_mula4 => m8,
out_mula4 => m8_a4
);
 
m9_with_56: mul56
port map (
in_mul56 => m9,
out_mul56 => m9_56
);
 
m10_with_82: mul82
port map (
in_mul82 => m10,
out_mul82 => m10_82
);
m11_with_f3: mulf3
port map (
in_mulf3 => m11,
out_mulf3 => m11_f3
);
 
m12_with_1e: mul1e
port map (
in_mul1e => m12,
out_mul1e => m12_1e
);
 
m13_with_c6: mulc6
port map (
in_mulc6 => m13,
out_mulc6 => m13_c6
);
 
m14_with_68: mul68
port map (
in_mul68 => m14,
out_mul68 => m14_68
);
 
m15_with_e5: mule5
port map (
in_mule5 => m15,
out_mule5 => m15_e5
);
 
-- the third row creates s12
m8_with_02: mul02
port map (
in_mul02 => m8,
out_mul02 => m8_02
);
 
m9_with_a1: mula1
port map (
in_mula1 => m9,
out_mula1 => m9_a1
);
 
m10_with_fc: mulfc
port map (
in_mulfc => m10,
out_mulfc => m10_fc
);
 
m11_with_c1: mulc1
port map (
in_mulc1 => m11,
out_mulc1 => m11_c1
);
 
m12_with_47: mul47
port map (
in_mul47 => m12,
out_mul47 => m12_47
);
 
m13_with_ae: mulae
port map (
in_mulae => m13,
out_mulae => m13_ae
);
 
m14_with_3d: mul3d
port map (
in_mul3d => m14,
out_mul3d => m14_3d
);
 
m15_with_19: mul19
port map (
in_mul19 => m15,
out_mul19 => m15_19
);
 
-- the fourth row creates s13
m8_with_a4_1: mula4
port map (
in_mula4 => m8,
out_mula4 => m8_a4_1
);
 
m9_with_55: mul55
port map (
in_mul55 => m9,
out_mul55 => m9_55
);
 
m10_with_87: mul87
port map (
in_mul87 => m10,
out_mul87 => m10_87
);
 
m11_with_5a: mul5a
port map (
in_mul5a => m11,
out_mul5a => m11_5a
);
 
m12_with_58: mul58
port map (
in_mul58 => m12,
out_mul58 => m12_58
);
 
m13_with_db: muldb
port map (
in_muldb => m13,
out_muldb => m13_db
);
 
m14_with_9e: mul9e
port map (
in_mul9e => m14,
out_mul9e => m14_9e
);
 
m15_with_03: mul03
port map (
in_mul03 => m15,
out_mul03 => m15_03
);
 
-- we create the s2,j j=0..3
-- the first row of m16..23 creates the s20
m16_with_01: mul01
port map (
in_mul01 => m16,
out_mul01 => m16_01
);
 
m17_with_a4: mula4
port map (
in_mula4 => m17,
out_mula4 => m17_a4
);
 
m18_with_55: mul55
port map (
in_mul55 => m18,
out_mul55 => m18_55
);
 
m19_with_87: mul87
port map (
in_mul87 => m19,
out_mul87 => m19_87
);
 
m20_with_5a: mul5a
port map (
in_mul5a => m20,
out_mul5a => m20_5a
);
 
m21_with_58: mul58
port map (
in_mul58 => m21,
out_mul58 => m21_58
);
 
m22_with_db: muldb
port map (
in_muldb => m22,
out_muldb => m22_db
);
 
m23_with_9e: mul9e
port map (
in_mul9e => m23,
out_mul9e => m23_9e
);
 
-- the second row creates s21
m16_with_a4: mula4
port map (
in_mula4 => m16,
out_mula4 => m16_a4
);
 
m17_with_56: mul56
port map (
in_mul56 => m17,
out_mul56 => m17_56
);
 
m18_with_82: mul82
port map (
in_mul82 => m18,
out_mul82 => m18_82
);
m19_with_f3: mulf3
port map (
in_mulf3 => m19,
out_mulf3 => m19_f3
);
 
m20_with_1e: mul1e
port map (
in_mul1e => m20,
out_mul1e => m20_1e
);
 
m21_with_c6: mulc6
port map (
in_mulc6 => m21,
out_mulc6 => m21_c6
);
 
m22_with_68: mul68
port map (
in_mul68 => m22,
out_mul68 => m22_68
);
 
m23_with_e5: mule5
port map (
in_mule5 => m23,
out_mule5 => m23_e5
);
 
-- the third row creates s22
m16_with_02: mul02
port map (
in_mul02 => m16,
out_mul02 => m16_02
);
 
m17_with_a1: mula1
port map (
in_mula1 => m17,
out_mula1 => m17_a1
);
 
m18_with_fc: mulfc
port map (
in_mulfc => m18,
out_mulfc => m18_fc
);
 
m19_with_c1: mulc1
port map (
in_mulc1 => m19,
out_mulc1 => m19_c1
);
 
m20_with_47: mul47
port map (
in_mul47 => m20,
out_mul47 => m20_47
);
 
m21_with_ae: mulae
port map (
in_mulae => m21,
out_mulae => m21_ae
);
 
m22_with_3d: mul3d
port map (
in_mul3d => m22,
out_mul3d => m22_3d
);
 
m23_with_19: mul19
port map (
in_mul19 => m23,
out_mul19 => m23_19
);
 
-- the fourth row creates s23
m16_with_a4_1: mula4
port map (
in_mula4 => m16,
out_mula4 => m16_a4_1
);
 
m17_with_55: mul55
port map (
in_mul55 => m17,
out_mul55 => m17_55
);
 
m18_with_87: mul87
port map (
in_mul87 => m18,
out_mul87 => m18_87
);
 
m19_with_5a: mul5a
port map (
in_mul5a => m19,
out_mul5a => m19_5a
);
 
m20_with_58: mul58
port map (
in_mul58 => m20,
out_mul58 => m20_58
);
 
m21_with_db: muldb
port map (
in_muldb => m21,
out_muldb => m21_db
);
 
m22_with_9e: mul9e
port map (
in_mul9e => m22,
out_mul9e => m22_9e
);
 
m23_with_03: mul03
port map (
in_mul03 => m23,
out_mul03 => m23_03
);
 
-- after getting the results from multipliers
-- we combine them in order to get the additions
s00 <= m0_01 XOR m1_a4 XOR m2_55 XOR m3_87 XOR m4_5a XOR m5_58 XOR m6_db XOR m7_9e;
s01 <= m0_a4 XOR m1_56 XOR m2_82 XOR m3_f3 XOR m4_1e XOR m5_c6 XOR m6_68 XOR m7_e5;
s02 <= m0_02 XOR m1_a1 XOR m2_fc XOR m3_c1 XOR m4_47 XOR m5_ae XOR m6_3d XOR m7_19;
s03 <= m0_a4_1 XOR m1_55 XOR m2_87 XOR m3_5a XOR m4_58 XOR m5_db XOR m6_9e XOR m7_03;
 
-- after creating s0,j j=0...3 we form the S0
-- little endian
out_Sfirst_rs192 <= s03 & s02 & s01 & s00;
 
s10 <= m8_01 XOR m9_a4 XOR m10_55 XOR m11_87 XOR m12_5a XOR m13_58 XOR m14_db XOR m15_9e;
s11 <= m8_a4 XOR m9_56 XOR m10_82 XOR m11_f3 XOR m12_1e XOR m13_c6 XOR m14_68 XOR m15_e5;
s12 <= m8_02 XOR m9_a1 XOR m10_fc XOR m11_c1 XOR m12_47 XOR m13_ae XOR m14_3d XOR m15_19;
s13 <= m8_a4_1 XOR m9_55 XOR m10_87 XOR m11_5a XOR m12_58 XOR m13_db XOR m14_9e XOR m15_03;
 
-- after creating s1,j j=0...3 we form the S1
-- little endian
out_Ssecond_rs192 <= s13 & s12 & s11 & s10;
 
s20 <= m16_01 XOR m17_a4 XOR m18_55 XOR m19_87 XOR m20_5a XOR m21_58 XOR m22_db XOR m23_9e;
s21 <= m16_a4 XOR m17_56 XOR m18_82 XOR m19_f3 XOR m20_1e XOR m21_c6 XOR m22_68 XOR m23_e5;
s22 <= m16_02 XOR m17_a1 XOR m18_fc XOR m19_c1 XOR m20_47 XOR m21_ae XOR m22_3d XOR m23_19;
s23 <= m16_a4_1 XOR m17_55 XOR m18_87 XOR m19_5a XOR m20_58 XOR m21_db XOR m22_9e XOR m23_03;
 
-- after creating s2j j=0...3 we form the S2
-- little endian
out_Sthird_rs192 <= s23 & s22 & s21 & s20;
 
 
end rs_192_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- h function for 192 bits key
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity h_192 is
port (
in_h192 : in std_logic_vector(7 downto 0);
Mfirst_h192,
Msecond_h192,
Mthird_h192 : in std_logic_vector(31 downto 0);
out_h192 : out std_logic_vector(31 downto 0)
);
end h_192;
 
architecture h192_arch of h_192 is
 
-- we declare internal signals
signal from_first_row,
to_second_row,
from_second_row,
to_third_row,
from_third_row,
to_fourth_row,
to_mds : std_logic_vector(31 downto 0);
-- we declare all components needed
component q0
port (
in_q0 : in std_logic_vector(7 downto 0);
out_q0 : out std_logic_vector(7 downto 0)
);
end component;
component q1
port (
in_q1 : in std_logic_vector(7 downto 0);
out_q1 : out std_logic_vector(7 downto 0)
);
end component;
 
component mds
port (
y0,
y1,
y2,
y3 : in std_logic_vector(7 downto 0);
z0,
z1,
z2,
z3 : out std_logic_vector(7 downto 0)
);
end component;
 
-- begin architecture description
begin
 
-- first row of q
first_q1_1: q1
port map (
in_q1 => in_h192,
out_q1 => from_first_row(7 downto 0)
);
 
first_q1_2: q1
port map (
in_q1 => in_h192,
out_q1 => from_first_row(15 downto 8)
);
 
first_q0_1: q0
port map (
in_q0 => in_h192,
out_q0 => from_first_row(23 downto 16)
);
 
first_q0_2: q0
port map (
in_q0 => in_h192,
out_q0 => from_first_row(31 downto 24)
);
 
-- we perform the XOR of the results of the first row
-- with first M of h (Mfirst_h128)
to_second_row <= from_first_row XOR Mfirst_h192;
 
-- second row of q
second_q0_1: q0
port map (
in_q0 => to_second_row(7 downto 0),
out_q0 => from_second_row(7 downto 0)
);
second_q1_1: q1
port map (
in_q1 => to_second_row(15 downto 8),
out_q1 => from_second_row(15 downto 8)
);
second_q0_2: q0
port map (
in_q0 => to_second_row(23 downto 16),
out_q0 => from_second_row(23 downto 16)
);
second_q1_2: q1
port map (
in_q1 => to_second_row(31 downto 24),
out_q1 => from_second_row(31 downto 24)
);
 
-- we perform the XOR of the results of the second row
-- with second M of h (Msecond_h128)
to_third_row <= from_second_row XOR Msecond_h192;
 
-- third row of q
third_q0_1: q0
port map (
in_q0 => to_third_row(7 downto 0),
out_q0 => from_third_row(7 downto 0)
);
third_q0_2: q0
port map (
in_q0 => to_third_row(15 downto 8),
out_q0 => from_third_row(15 downto 8)
);
third_q1_1: q1
port map (
in_q1 => to_third_row(23 downto 16),
out_q1 => from_third_row(23 downto 16)
);
third_q1_2: q1
port map (
in_q1 => to_third_row(31 downto 24),
out_q1 => from_third_row(31 downto 24)
);
-- we perform the third XOR
to_fourth_row <= from_third_row XOR Mthird_h192;
-- the fourth row of q
fourth_q1_1: q1
port map (
in_q1 => to_fourth_row(7 downto 0),
out_q1 => to_mds(7 downto 0)
);
fourth_q0_1: q0
port map (
in_q0 => to_fourth_row(15 downto 8),
out_q0 => to_mds(15 downto 8)
);
fourth_q1_2: q1
port map (
in_q1 => to_fourth_row(23 downto 16),
out_q1 => to_mds(23 downto 16)
);
fourth_q0_2: q0
port map (
in_q0 => to_fourth_row(31 downto 24),
out_q0 => to_mds(31 downto 24)
);
-- mds table
mds_table: mds
port map (
y0 => to_mds(7 downto 0),
y1 => to_mds(15 downto 8),
y2 => to_mds(23 downto 16),
y3 => to_mds(31 downto 24),
z0 => out_h192(7 downto 0),
z1 => out_h192(15 downto 8),
z2 => out_h192(23 downto 16),
z3 => out_h192(31 downto 24)
);
 
end h192_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
 
--
-- g function for 192 bits key
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity g_192 is
port (
in_g192,
in_S0_g192,
in_S1_g192,
in_S2_g192 : in std_logic_vector(31 downto 0);
out_g192 : out std_logic_vector(31 downto 0)
);
end g_192;
 
architecture g192_arch of g_192 is
 
-- we declare the internal signals
signal from_first_row,
to_second_row,
from_second_row,
to_third_row,
from_third_row,
to_fourth_row,
to_mds : std_logic_vector(31 downto 0);
 
component q0
port (
in_q0 : in std_logic_vector(7 downto 0);
out_q0 : out std_logic_vector(7 downto 0)
);
end component;
component q1
port (
in_q1 : in std_logic_vector(7 downto 0);
out_q1 : out std_logic_vector(7 downto 0)
);
end component;
 
component mds
port (
y0,
y1,
y2,
y3 : in std_logic_vector(7 downto 0);
z0,
z1,
z2,
z3 : out std_logic_vector(7 downto 0)
);
end component;
 
-- begin architecture description
begin
 
-- first row of q
first_q1_1: q1
port map (
in_q1 => in_g192(7 downto 0),
out_q1 => from_first_row(7 downto 0)
);
first_q1_2: q1
port map (
in_q1 => in_g192(15 downto 8),
out_q1 => from_first_row(15 downto 8)
);
first_q0_1: q0
port map (
in_q0 => in_g192(23 downto 16),
out_q0 => from_first_row(23 downto 16)
);
first_q0_2: q0
port map (
in_q0 => in_g192(31 downto 24),
out_q0 => from_first_row(31 downto 24)
);
 
-- we XOR the result of the first row
-- with the S0
to_second_row <= from_first_row XOR in_S0_g192;
 
-- second row of q
second_q0_1: q0
port map (
in_q0 => to_second_row(7 downto 0),
out_q0 => from_second_row(7 downto 0)
);
second_q1_1: q1
port map (
in_q1 => to_second_row(15 downto 8),
out_q1 => from_second_row(15 downto 8)
);
second_q0_2: q0
port map (
in_q0 => to_second_row(23 downto 16),
out_q0 => from_second_row(23 downto 16)
);
second_q1_2: q1
port map (
in_q1 => to_second_row(31 downto 24),
out_q1 => from_second_row(31 downto 24)
);
-- we perform the XOR
to_third_row <= from_second_row XOR in_S1_g192;
-- third row of q
third_q0_1: q0
port map (
in_q0 => to_third_row(7 downto 0),
out_q0 => from_third_row(7 downto 0)
);
third_q0_2: q0
port map (
in_q0 => to_third_row(15 downto 8),
out_q0 => from_third_row(15 downto 8)
);
third_q1_1: q1
port map (
in_q1 => to_third_row(23 downto 16),
out_q1 => from_third_row(23 downto 16)
);
third_q1_2: q1
port map (
in_q1 => to_third_row(31 downto 24),
out_q1 => from_third_row(31 downto 24)
);
 
-- we perform the XOR
to_fourth_row <= from_third_row XOR in_S2_g192;
-- fourth row of q
fourth_q1_1: q1
port map (
in_q1=> to_fourth_row(7 downto 0),
out_q1 => to_mds(7 downto 0)
);
fourth_q0_1: q0
port map (
in_q0 => to_fourth_row(15 downto 8),
out_q0 => to_mds(15 downto 8)
);
fourth_q1_2: q1
port map (
in_q1 => to_fourth_row(23 downto 16),
out_q1 => to_mds(23 downto 16)
);
fourth_q0_2: q0
port map (
in_q0 => to_fourth_row(31 downto 24),
out_q0 => to_mds(31 downto 24)
);
-- mds table
mds_table: mds
port map (
y0 => to_mds(7 downto 0),
y1 => to_mds(15 downto 8),
y2 => to_mds(23 downto 16),
y3 => to_mds(31 downto 24),
z0 => out_g192(7 downto 0),
z1 => out_g192(15 downto 8),
z2 => out_g192(23 downto 16),
z3 => out_g192(31 downto 24)
);
 
end g192_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
 
--
-- f function with 192 bits key
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity f_192 is
port (
up_in_f192,
low_in_f192,
S0_in_f192,
S1_in_f192,
S2_in_f192,
up_key_f192,
low_key_f192 : in std_logic_vector(31 downto 0);
up_out_f192,
low_out_f192 : out std_logic_vector(31 downto 0)
);
end f_192;
 
architecture f192_arch of f_192 is
 
-- we declare the internal signals
signal from_shift_8,
to_up_pht,
to_low_pht,
to_up_key,
to_low_key,
intermediate_carry1,
intermediate_carry2 : std_logic_vector(31 downto 0);
signal zero : std_logic;
component g_192
port (
in_g192,
in_S0_g192,
in_S1_g192,
in_S2_g192 : in std_logic_vector(31 downto 0);
out_g192 : out std_logic_vector(31 downto 0)
);
end component;
component pht
port (
up_in_pht,
down_in_pht : in std_logic_vector(31 downto 0);
up_out_pht,
down_out_pht : out std_logic_vector(31 downto 0)
);
end component;
 
component adder
port (
in1_adder,
in2_adder,
in_carry_adder : in std_logic;
out_adder,
out_carry_adder : out std_logic
);
end component;
 
-- begin architecture description
begin
 
-- we initialize zero
zero <= '0';
-- upper g_192
upper_g192: g_192
port map (
in_g192 => up_in_f192,
in_S0_g192 => S0_in_f192,
in_S1_g192 => S1_in_f192,
in_S2_g192 => S2_in_f192,
out_g192 => to_up_pht
);
-- left rotation by 8
from_shift_8(31 downto 8) <= low_in_f192(23 downto 0);
from_shift_8(7 downto 0) <= low_in_f192(31 downto 24);
-- lower g192
lower_g192: g_192
port map (
in_g192 => from_shift_8,
in_S0_g192 => S0_in_f192,
in_S1_g192 => S1_in_f192,
in_S2_g192 => S2_in_f192,
out_g192 => to_low_pht
);
-- pht
pht_transform: pht
port map (
up_in_pht => to_up_pht,
down_in_pht => to_low_pht,
up_out_pht => to_up_key,
down_out_pht => to_low_key
);
-- upper adder of 32 bits
up_adder: for i in 0 to 31 generate
first: if (i=0) generate
the_adder: adder
port map (
in1_adder => to_up_key(0),
in2_adder => up_key_f192(0),
in_carry_adder => zero,
out_adder => up_out_f192(0),
out_carry_adder => intermediate_carry1(0)
);
end generate first;
the_rest: if (i>0) generate
the_adders: adder
port map (
in1_adder => to_up_key(i),
in2_adder => up_key_f192(i),
in_carry_adder => intermediate_carry1(i-1),
out_adder => up_out_f192(i),
out_carry_adder => intermediate_carry1(i)
);
end generate the_rest;
end generate up_adder;
 
-- lower adder of 32 bits
low_adder: for i in 0 to 31 generate
first1: if (i=0) generate
the_adder1:adder
port map (
in1_adder => to_low_key(0),
in2_adder => low_key_f192(0),
in_carry_adder => zero,
out_adder => low_out_f192(0),
out_carry_adder => intermediate_carry2(0)
);
end generate first1;
the_rest1: if (i>0) generate
the_adders1: adder
port map (
in1_adder => to_low_key(i),
in2_adder => low_key_f192(i),
in_carry_adder => intermediate_carry2(i-1),
out_adder => low_out_f192(i),
out_carry_adder => intermediate_carry2(i)
);
end generate the_rest1;
end generate low_adder;
 
end f192_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- twofish key scheduler for 192 bits key input
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_keysched192 is
port (
odd_in_tk192,
even_in_tk192 : in std_logic_vector(7 downto 0);
in_key_tk192 : in std_logic_vector(191 downto 0);
out_key_up_tk192,
out_key_down_tk192 : out std_logic_vector(31 downto 0)
);
end twofish_keysched192;
architecture twofish_keysched192_arch of twofish_keysched192 is
 
-- we declare internal signals
signal to_up_pht,
to_shift_8,
from_shift_8,
to_shift_9,
M0, M1, M2, M3, M4, M5 : std_logic_vector(31 downto 0);
 
signal byte0, byte1, byte2, byte3,
byte4, byte5, byte6, byte7,
byte8, byte9, byte10, byte11,
byte12, byte13, byte14, byte15,
byte16, byte17, byte18, byte19,
byte20, byte21, byte22, byte23 : std_logic_vector(7 downto 0);
-- we declare the components to be used
component pht
port (
up_in_pht,
down_in_pht : in std_logic_vector(31 downto 0);
up_out_pht,
down_out_pht : out std_logic_vector(31 downto 0)
);
end component;
 
component h_192
port (
in_h192 : in std_logic_vector(7 downto 0);
Mfirst_h192,
Msecond_h192,
Mthird_h192 : in std_logic_vector(31 downto 0);
out_h192 : out std_logic_vector(31 downto 0)
);
end component;
 
-- begin architecture description
begin
 
-- we assign the input signal to the respective
-- bytes as is described in the prototype
byte23 <= in_key_tk192(7 downto 0);
byte22 <= in_key_tk192(15 downto 8);
byte21 <= in_key_tk192(23 downto 16);
byte20 <= in_key_tk192(31 downto 24);
byte19 <= in_key_tk192(39 downto 32);
byte18 <= in_key_tk192(47 downto 40);
byte17 <= in_key_tk192(55 downto 48);
byte16 <= in_key_tk192(63 downto 56);
byte15 <= in_key_tk192(71 downto 64);
byte14 <= in_key_tk192(79 downto 72);
byte13 <= in_key_tk192(87 downto 80);
byte12 <= in_key_tk192(95 downto 88);
byte11 <= in_key_tk192(103 downto 96);
byte10 <= in_key_tk192(111 downto 104);
byte9 <= in_key_tk192(119 downto 112);
byte8 <= in_key_tk192(127 downto 120);
byte7 <= in_key_tk192(135 downto 128);
byte6 <= in_key_tk192(143 downto 136);
byte5 <= in_key_tk192(151 downto 144);
byte4 <= in_key_tk192(159 downto 152);
byte3 <= in_key_tk192(167 downto 160);
byte2 <= in_key_tk192(175 downto 168);
byte1 <= in_key_tk192(183 downto 176);
byte0 <= in_key_tk192(191 downto 184);
 
-- we form the M{0..5}
M0 <= byte3 & byte2 & byte1 & byte0;
M1 <= byte7 & byte6 & byte5 & byte4;
M2 <= byte11 & byte10 & byte9 & byte8;
M3 <= byte15 & byte14 & byte13 & byte12;
M4 <= byte19 & byte18 & byte17 & byte16;
M5 <= byte23 & byte22 & byte21 & byte20;
 
-- upper h
upper_h: h_192
port map (
in_h192 => even_in_tk192,
Mfirst_h192 => M4,
Msecond_h192 => M2,
Mthird_h192 => M0,
out_h192 => to_up_pht
);
-- lower h
lower_h: h_192
port map (
in_h192 => odd_in_tk192,
Mfirst_h192 => M5,
Msecond_h192 => M3,
Mthird_h192 => M1,
out_h192 => to_shift_8
);
-- left rotate by 8
from_shift_8(31 downto 8) <= to_shift_8(23 downto 0);
from_shift_8(7 downto 0) <= to_shift_8(31 downto 24);
-- pht transformation
pht_transform: pht
port map (
up_in_pht => to_up_pht,
down_in_pht => from_shift_8,
up_out_pht => out_key_up_tk192,
down_out_pht => to_shift_9
);
-- left rotate by 9
out_key_down_tk192(31 downto 9) <= to_shift_9(22 downto 0);
out_key_down_tk192(8 downto 0) <= to_shift_9(31 downto 23);
 
end twofish_keysched192_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- twofish S key component for 192 bits key
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_S192 is
port (
in_key_ts192 : in std_logic_vector(191 downto 0);
out_Sfirst_ts192,
out_Ssecond_ts192,
out_Sthird_ts192 : out std_logic_vector(31 downto 0)
);
end twofish_S192;
architecture twofish_S192_arch of twofish_S192 is
-- we declare the components to be used
component reed_solomon192
port (
in_rs192 : in std_logic_vector(191 downto 0);
out_Sfirst_rs192,
out_Ssecond_rs192,
out_Sthird_rs192 : out std_logic_vector(31 downto 0)
);
end component;
signal twofish_key : std_logic_vector(191 downto 0);
signal byte15, byte14, byte13, byte12, byte11, byte10,
byte9, byte8, byte7, byte6, byte5, byte4,
byte3, byte2, byte1, byte0,
byte16, byte17, byte18, byte19,
byte20, byte21, byte22, byte23 : std_logic_vector(7 downto 0);
 
-- begin architecture description
begin
 
-- splitting the input
byte23 <= in_key_ts192(7 downto 0);
byte22 <= in_key_ts192(15 downto 8);
byte21 <= in_key_ts192(23 downto 16);
byte20 <= in_key_ts192(31 downto 24);
byte19 <= in_key_ts192(39 downto 32);
byte18 <= in_key_ts192(47 downto 40);
byte17 <= in_key_ts192(55 downto 48);
byte16 <= in_key_ts192(63 downto 56);
byte15 <= in_key_ts192(71 downto 64);
byte14 <= in_key_ts192(79 downto 72);
byte13 <= in_key_ts192(87 downto 80);
byte12 <= in_key_ts192(95 downto 88);
byte11 <= in_key_ts192(103 downto 96);
byte10 <= in_key_ts192(111 downto 104);
byte9 <= in_key_ts192(119 downto 112);
byte8 <= in_key_ts192(127 downto 120);
byte7 <= in_key_ts192(135 downto 128);
byte6 <= in_key_ts192(143 downto 136);
byte5 <= in_key_ts192(151 downto 144);
byte4 <= in_key_ts192(159 downto 152);
byte3 <= in_key_ts192(167 downto 160);
byte2 <= in_key_ts192(175 downto 168);
byte1 <= in_key_ts192(183 downto 176);
byte0 <= in_key_ts192(191 downto 184);
 
-- forming the key
twofish_key <= byte23 & byte22 & byte21 & byte20 & byte19 & byte18 & byte17 & byte16 &
byte15 & byte14 & byte13 & byte12 & byte11 & byte10 & byte9 & byte8 & byte7 &
byte6 & byte5 & byte4 & byte3 & byte2 & byte1 & byte0;
 
 
-- the keys S0,1,2
produce_S0_S1_S2: reed_solomon192
port map (
in_rs192 => twofish_key,
out_Sfirst_rs192 => out_Sfirst_ts192,
out_Ssecond_rs192 => out_Ssecond_ts192,
out_Sthird_rs192 => out_Sthird_ts192
);
 
 
end twofish_S192_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- twofish whitening key scheduler for 192 bits key input
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_whit_keysched192 is
port (
in_key_twk192 : in std_logic_vector(191 downto 0);
out_K0_twk192,
out_K1_twk192,
out_K2_twk192,
out_K3_twk192,
out_K4_twk192,
out_K5_twk192,
out_K6_twk192,
out_K7_twk192 : out std_logic_vector(31 downto 0)
);
end twofish_whit_keysched192;
architecture twofish_whit_keysched192_arch of twofish_whit_keysched192 is
 
-- we declare internal signals
signal to_up_pht_1,
to_shift_8_1,
from_shift_8_1,
to_shift_9_1,
to_up_pht_2,
to_shift_8_2,
from_shift_8_2,
to_shift_9_2,
to_up_pht_3,
to_shift_8_3,
from_shift_8_3,
to_shift_9_3,
to_up_pht_4,
to_shift_8_4,
from_shift_8_4,
to_shift_9_4,
M0, M1, M2, M3, M4, M5 : std_logic_vector(31 downto 0);
 
signal byte0, byte1, byte2, byte3,
byte4, byte5, byte6, byte7,
byte8, byte9, byte10, byte11,
byte12, byte13, byte14, byte15,
byte16, byte17, byte18, byte19,
byte20, byte21, byte22, byte23 : std_logic_vector(7 downto 0);
 
signal zero, one, two, three, four, five, six, seven : std_logic_vector(7 downto 0);
-- we declare the components to be used
component pht
port (
up_in_pht,
down_in_pht : in std_logic_vector(31 downto 0);
up_out_pht,
down_out_pht : out std_logic_vector(31 downto 0)
);
end component;
 
component h_192
port (
in_h192 : in std_logic_vector(7 downto 0);
Mfirst_h192,
Msecond_h192,
Mthird_h192 : in std_logic_vector(31 downto 0);
out_h192 : out std_logic_vector(31 downto 0)
);
end component;
 
-- begin architecture description
begin
 
-- we produce the first eight numbers
zero <= "00000000";
one <= "00000001";
two <= "00000010";
three <= "00000011";
four <= "00000100";
five <= "00000101";
six <= "00000110";
seven <= "00000111";
 
-- we assign the input signal to the respective
-- bytes as is described in the prototype
byte23 <= in_key_twk192(7 downto 0);
byte22 <= in_key_twk192(15 downto 8);
byte21 <= in_key_twk192(23 downto 16);
byte20 <= in_key_twk192(31 downto 24);
byte19 <= in_key_twk192(39 downto 32);
byte18 <= in_key_twk192(47 downto 40);
byte17 <= in_key_twk192(55 downto 48);
byte16 <= in_key_twk192(63 downto 56);
byte15 <= in_key_twk192(71 downto 64);
byte14 <= in_key_twk192(79 downto 72);
byte13 <= in_key_twk192(87 downto 80);
byte12 <= in_key_twk192(95 downto 88);
byte11 <= in_key_twk192(103 downto 96);
byte10 <= in_key_twk192(111 downto 104);
byte9 <= in_key_twk192(119 downto 112);
byte8 <= in_key_twk192(127 downto 120);
byte7 <= in_key_twk192(135 downto 128);
byte6 <= in_key_twk192(143 downto 136);
byte5 <= in_key_twk192(151 downto 144);
byte4 <= in_key_twk192(159 downto 152);
byte3 <= in_key_twk192(167 downto 160);
byte2 <= in_key_twk192(175 downto 168);
byte1 <= in_key_twk192(183 downto 176);
byte0 <= in_key_twk192(191 downto 184);
 
-- we form the M{0..5}
M0 <= byte3 & byte2 & byte1 & byte0;
M1 <= byte7 & byte6 & byte5 & byte4;
M2 <= byte11 & byte10 & byte9 & byte8;
M3 <= byte15 & byte14 & byte13 & byte12;
M4 <= byte19 & byte18 & byte17 & byte16;
M5 <= byte23 & byte22 & byte21 & byte20;
 
-- we produce the keys for the whitening steps
-- keys K0,1
-- upper h
upper_h1: h_192
port map (
in_h192 => zero,
Mfirst_h192 => M4,
Msecond_h192 => M2,
Mthird_h192 => M0,
out_h192 => to_up_pht_1
);
-- lower h
lower_h1: h_192
port map (
in_h192 => one,
Mfirst_h192 => M5,
Msecond_h192 => M3,
Mthird_h192 => M1,
out_h192 => to_shift_8_1
);
-- left rotate by 8
from_shift_8_1(31 downto 8) <= to_shift_8_1(23 downto 0);
from_shift_8_1(7 downto 0) <= to_shift_8_1(31 downto 24);
-- pht transformation
pht_transform1: pht
port map (
up_in_pht => to_up_pht_1,
down_in_pht => from_shift_8_1,
up_out_pht => out_K0_twk192,
down_out_pht => to_shift_9_1
);
-- left rotate by 9
out_K1_twk192(31 downto 9) <= to_shift_9_1(22 downto 0);
out_K1_twk192(8 downto 0) <= to_shift_9_1(31 downto 23);
 
-- keys K2,3
-- upper h
upper_h2: h_192
port map (
in_h192 => two,
Mfirst_h192 => M4,
Msecond_h192 => M2,
Mthird_h192 => M0,
out_h192 => to_up_pht_2
);
-- lower h
lower_h2: h_192
port map (
in_h192 => three,
Mfirst_h192 => M5,
Msecond_h192 => M3,
Mthird_h192 => M1,
out_h192 => to_shift_8_2
);
-- left rotate by 8
from_shift_8_2(31 downto 8) <= to_shift_8_2(23 downto 0);
from_shift_8_2(7 downto 0) <= to_shift_8_2(31 downto 24);
-- pht transformation
pht_transform2: pht
port map (
up_in_pht => to_up_pht_2,
down_in_pht => from_shift_8_2,
up_out_pht => out_K2_twk192,
down_out_pht => to_shift_9_2
);
-- left rotate by 9
out_K3_twk192(31 downto 9) <= to_shift_9_2(22 downto 0);
out_K3_twk192(8 downto 0) <= to_shift_9_2(31 downto 23);
 
-- keys K4,5
-- upper h
upper_h3: h_192
port map (
in_h192 => four,
Mfirst_h192 => M4,
Msecond_h192 => M2,
Mthird_h192 => M0,
out_h192 => to_up_pht_3
);
-- lower h
lower_h3: h_192
port map (
in_h192 => five,
Mfirst_h192 => M5,
Msecond_h192 => M3,
Mthird_h192 => M1,
out_h192 => to_shift_8_3
);
-- left rotate by 8
from_shift_8_3(31 downto 8) <= to_shift_8_3(23 downto 0);
from_shift_8_3(7 downto 0) <= to_shift_8_3(31 downto 24);
-- pht transformation
pht_transform3: pht
port map (
up_in_pht => to_up_pht_3,
down_in_pht => from_shift_8_3,
up_out_pht => out_K4_twk192,
down_out_pht => to_shift_9_3
);
-- left rotate by 9
out_K5_twk192(31 downto 9) <= to_shift_9_3(22 downto 0);
out_K5_twk192(8 downto 0) <= to_shift_9_3(31 downto 23);
 
-- keys K6,7
-- upper h
upper_h4: h_192
port map (
in_h192 => six,
Mfirst_h192 => M4,
Msecond_h192 => M2,
Mthird_h192 => M0,
out_h192 => to_up_pht_4
);
-- lower h
lower_h4: h_192
port map (
in_h192 => seven,
Mfirst_h192 => M5,
Msecond_h192 => M3,
Mthird_h192 => M1,
out_h192 => to_shift_8_4
);
-- left rotate by 8
from_shift_8_4(31 downto 8) <= to_shift_8_4(23 downto 0);
from_shift_8_4(7 downto 0) <= to_shift_8_4(31 downto 24);
-- pht transformation
pht_transform4: pht
port map (
up_in_pht => to_up_pht_4,
down_in_pht => from_shift_8_4,
up_out_pht => out_K6_twk192,
down_out_pht => to_shift_9_4
);
-- left rotate by 9
out_K7_twk192(31 downto 9) <= to_shift_9_4(22 downto 0);
out_K7_twk192(8 downto 0) <= to_shift_9_4(31 downto 23);
 
end twofish_whit_keysched192_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- twofish encryption round with 128 bit key input
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_encryption_round192 is
port (
in1_ter192,
in2_ter192,
in3_ter192,
in4_ter192,
in_Sfirst_ter192,
in_Ssecond_ter192,
in_Sthird_ter192,
in_key_up_ter192,
in_key_down_ter192 : in std_logic_vector(31 downto 0);
out1_ter192,
out2_ter192,
out3_ter192,
out4_ter192 : out std_logic_vector(31 downto 0)
);
end twofish_encryption_round192;
 
architecture twofish_encryption_round192_arch of twofish_encryption_round192 is
-- we declare internal signals
signal to_left_shift,
from_right_shift,
to_xor_with3,
to_xor_with4 : std_logic_vector(31 downto 0);
component f_192
port (
up_in_f192,
low_in_f192,
S0_in_f192,
S1_in_f192,
S2_in_f192,
up_key_f192,
low_key_f192 : in std_logic_vector(31 downto 0);
up_out_f192,
low_out_f192 : out std_logic_vector(31 downto 0)
);
end component;
 
-- begin architecture description
begin
 
-- we declare f_192
function_f: f_192
port map (
up_in_f192 => in1_ter192,
low_in_f192 => in2_ter192,
S0_in_f192 => in_Sfirst_ter192,
S1_in_f192 => in_Ssecond_ter192,
S2_in_f192 => in_Sthird_ter192,
up_key_f192 => in_key_up_ter192,
low_key_f192 => in_key_down_ter192,
up_out_f192 => to_xor_with3,
low_out_f192 => to_xor_with4
);
-- we perform the exchange
-- in1_ter128 -> out3_ter128
-- in2_ter128 -> out4_ter128
-- in3_ter128 -> out1_ter128
-- in4_ter128 -> out2_ter128
-- we perform the left xor between the upper f function and
-- the third input (input 3)
to_left_shift <= to_xor_with3 XOR in3_ter192;
-- we perform the left side rotation to the right by 1 and
-- we perform the exchange too
out1_ter192(30 downto 0) <= to_left_shift(31 downto 1);
out1_ter192(31) <= to_left_shift(0);
-- we perform the right side rotation to the left by 1
from_right_shift(0) <= in4_ter192(31);
from_right_shift(31 downto 1) <= in4_ter192(30 downto 0);
-- we perform the right xor between the lower f function and
-- the fourth input (input 4)
out2_ter192 <= from_right_shift XOR to_xor_with4;
-- we perform the last exchanges
out3_ter192 <= in1_ter192;
out4_ter192 <= in2_ter192;
 
end twofish_encryption_round192_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- twofish decryption round with 128 bit key input
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity twofish_decryption_round192 is
port (
in1_tdr192,
in2_tdr192,
in3_tdr192,
in4_tdr192,
in_Sfirst_tdr192,
in_Ssecond_tdr192,
in_Sthird_tdr192,
in_key_up_tdr192,
in_key_down_tdr192 : in std_logic_vector(31 downto 0);
out1_tdr192,
out2_tdr192,
out3_tdr192,
out4_tdr192 : out std_logic_vector(31 downto 0)
);
end twofish_decryption_round192;
 
architecture twofish_decryption_round192_arch of twofish_decryption_round192 is
 
signal to_xor_with3,
to_xor_with4,
to_xor_with_up_f,
from_xor_with_down_f : std_logic_vector(31 downto 0);
 
component f_192
port (
up_in_f192,
low_in_f192,
S0_in_f192,
S1_in_f192,
S2_in_f192,
up_key_f192,
low_key_f192 : in std_logic_vector(31 downto 0);
up_out_f192,
low_out_f192 : out std_logic_vector(31 downto 0)
);
end component;
 
begin
 
-- we instantiate f function
function_f: f_192
port map (
up_in_f192 => in1_tdr192,
low_in_f192 => in2_tdr192,
S0_in_f192 => in_Sfirst_tdr192,
S1_in_f192 => in_Ssecond_tdr192,
S2_in_f192 => in_Sthird_tdr192,
up_key_f192 => in_key_up_tdr192,
low_key_f192 => in_key_down_tdr192,
up_out_f192 => to_xor_with3,
low_out_f192 => to_xor_with4
);
-- output 1: input3 with upper f
-- we first rotate the input3 by 1 bit leftwise
to_xor_with_up_f(0) <= in3_tdr192(31);
to_xor_with_up_f(31 downto 1) <= in3_tdr192(30 downto 0);
-- we perform the XOR with the upper output of f and the result
-- is ouput 1
out1_tdr192 <= to_xor_with_up_f XOR to_xor_with3;
-- output 2: input4 with lower f
-- we perform the XOR with the lower output of f
from_xor_with_down_f <= in4_tdr192 XOR to_xor_with4;
-- we perform the rotation by 1 bit rightwise and the result
-- is output2
out2_tdr192(31) <= from_xor_with_down_f(0);
out2_tdr192(30 downto 0) <= from_xor_with_down_f(31 downto 1);
-- we assign outputs 3 and 4
out3_tdr192 <= in1_tdr192;
out4_tdr192 <= in2_tdr192;
 
end twofish_decryption_round192_arch;
 
 
-- =============================================== --
-- =============================================== --
-- --
-- fourth part: 256 key input dependent components --
-- --
-- =============================================== --
-- =============================================== --
/trunk/vhdl/twofish_testbenches_secondary_circuits.vhd
0,0 → 1,115
-- Twofish_testbenches_secondary_circuits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file contains all the secondary circuits that are needed for running the testbenches
--
 
 
--
-- reg128
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity reg128 is
port ( in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128,clk_reg128 : in std_logic
);
end reg128;
 
architecture reg128_arch of reg128 is
begin
clk_proc: process(clk_reg128, reset_reg128,enable_reg128)
variable internal_state : std_logic_vector(127 downto 0);
begin
if reset_reg128 = '1' then
internal_state := ( others => '0' );
elsif (clk_reg128'event and clk_reg128 = '1') then
if enable_reg128='1' then
internal_state := in_reg128;
else
internal_state := internal_state;
end if;
end if;
out_reg128 <= internal_state;
end process clk_proc;
end reg128_arch;
 
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- mux128
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity mux128 is
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end mux128;
 
architecture mux128_arch of mux128 is
begin
with selection_mux128 select
out_mux128 <= in1_mux128 when '0',
in2_mux128 when others;
end mux128_arch;
 
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
-- --
-- new component --
-- --
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --
 
--
-- demux128
--
 
library ieee;
use ieee.std_logic_1164.all;
 
entity demux128 is
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end demux128;
 
architecture demux128_arch of demux128 is
begin
demux_proc: process(in_demux128, selection_demux128)
begin
if selection_demux128 = '0' then
out1_demux128 <= in_demux128;
else
out2_demux128 <= in_demux128;
end if;
end process demux_proc;
end demux128_arch;
/trunk/vhdl/twofish_cbc_decryption_monte_carlo_testbench_128bits.vhd
0,0 → 1,406
-- Twofish_cbc_decryption_monte_carlo_testbench_128bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the Decryption Monte Carlo KAT of the twofish cipher with 128 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity cbc_decryption_monte_carlo_testbench128 is
end cbc_decryption_monte_carlo_testbench128;
 
architecture cbc_decryption128_monte_carlo_testbench_arch of cbc_decryption_monte_carlo_testbench128 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched128
port (
odd_in_tk128,
even_in_tk128 : in std_logic_vector(7 downto 0);
in_key_tk128 : in std_logic_vector(127 downto 0);
out_key_up_tk128,
out_key_down_tk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched128
port (
in_key_twk128 : in std_logic_vector(127 downto 0);
out_K0_twk128,
out_K1_twk128,
out_K2_twk128,
out_K3_twk128,
out_K4_twk128,
out_K5_twk128,
out_K6_twk128,
out_K7_twk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_decryption_round128
port (
in1_tdr128,
in2_tdr128,
in3_tdr128,
in4_tdr128,
in_Sfirst_tdr128,
in_Ssecond_tdr128,
in_key_up_tdr128,
in_key_down_tdr128 : in std_logic_vector(31 downto 0);
out1_tdr128,
out2_tdr128,
out3_tdr128,
out4_tdr128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S128
port (
in_key_ts128 : in std_logic_vector(127 downto 0);
out_Sfirst_ts128,
out_Ssecond_ts128 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_cbc_decryption_monte_carlo_testvalues_128bits.txt";
FILE output_file : text is out "twofish_cbc_decryption_monte_carlo_128bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 0 to 9999) return string is
variable our_text : string (1 to 4) := (others => ' ');
variable thousands,
hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := ((int_number mod 1000) - (int_number mod 100)) / 100;
thousands := (int_number - (int_number mod 1000)) / 1000;
our_text(1) := digit_to_char(thousands);
our_text(2) := digit_to_char(hundreds);
our_text(3) := digit_to_char(tens);
our_text(4) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
twofish_key,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal key_up,
key_down,
Sfirst,
Ssecond,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched128
port map (
in_key_twk128 => twofish_key,
out_K0_twk128 => K0,
out_K1_twk128 => K1,
out_K2_twk128 => K2,
out_K3_twk128 => K3,
out_K4_twk128 => K4,
out_K5_twk128 => K5,
out_K6_twk128 => K6,
out_K7_twk128 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K4 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K5 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K6 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K7 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched128
port map (
odd_in_tk128 => odd_number,
even_in_tk128 => even_number,
in_key_tk128 => twofish_key,
out_key_up_tk128 => key_up,
out_key_down_tk128 => key_down
);
 
producing_the_Skeys: twofish_S128
port map (
in_key_ts128 => twofish_key,
out_Sfirst_ts128 => Sfirst,
out_Ssecond_ts128 => Ssecond
);
 
the_decryption_circuit: twofish_decryption_round128
port map (
in1_tdr128 => to_round(127 downto 96),
in2_tdr128 => to_round(95 downto 64),
in3_tdr128 => to_round(63 downto 32),
in4_tdr128 => to_round(31 downto 0),
in_Sfirst_tdr128 => Sfirst,
in_Ssecond_tdr128 => Ssecond,
in_key_up_tdr128 => key_up,
in_key_down_tdr128 => key_down,
out1_tdr128 => to_encr_reg128(127 downto 96),
out2_tdr128 => to_encr_reg128(95 downto 64),
out3_tdr128 => to_encr_reg128(63 downto 32),
out4_tdr128 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K0 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K1 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K2 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K3 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
cbc_dmc_proc: process
 
variable key_f, -- key input from file
pt_f, -- plaintext from file
ct_f,
iv_f : line; -- ciphertext from file
variable key_v, -- key vector input
pt_v , -- plaintext vector
ct_v,
iv_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter_10000 : integer range 0 to 9999 := 0; -- counter for the 10.000 repeats in the 400 next ones
variable counter_400 : integer range 0 to 399 := 0; -- counter for the 400 repeats
variable round : integer range 0 to 16 := 0; -- holds the rounds
variable PT, CT, CV, CTj_1 : std_logic_vector(127 downto 0) := (others => '0');
 
begin
 
while not endfile(input_file) loop
 
readline(input_file, key_f);
readline(input_file, iv_f);
readline(input_file,ct_f);
readline(input_file, pt_f);
hread(key_f,key_v);
hread(iv_f, iv_v);
hread(ct_f,ct_v);
hread(pt_f,pt_v);
 
twofish_key <= key_v;
CV := iv_v;
CT := ct_v;
 
for counter_10000 in 0 to 9999 loop
 
input_data <= CT;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
 
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00100110"; -- 38
odd_number <= "00100111"; -- 39
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector((((15-round)*2)+8), 8);
odd_number <= conv_std_logic_vector((((15-round)*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
 
PT := output_data XOR CV;
CV := CT;
CT := PT;
 
assert false report "I=" & to_text(counter_400) & " R=" & to_text(counter_10000) severity note;
 
end loop; -- counter_10000
 
hwrite(key_f, key_v);
hwrite(iv_f, iv_v);
hwrite(ct_f, ct_v);
hwrite(pt_f, PT);
writeline(output_file,key_f);
writeline(output_file, iv_f);
writeline(output_file,ct_f);
writeline(output_file,pt_f);
 
assert (pt_v = PT) report "file entry and decryption result DO NOT match!!! :( " severity failure;
assert (pt_v /= PT) report "Decryption I=" & to_text(counter_400) &" OK" severity note;
 
counter_400 := counter_400 + 1;
 
end loop;
assert false report "***** CBC Decryption Monte Carlo Test with 128 bits key size ended succesfully! :) *****" severity failure;
end process cbc_dmc_proc;
end cbc_decryption128_monte_carlo_testbench_arch;
 
/trunk/vhdl/twofish_cbc_decryption_monte_carlo_testbench_192bits.vhd
0,0 → 1,409
-- Twofish_cbc_decryption_monte_carlo_testbench_192bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
--
-- description : this file is the testbench for the Decryption Monte Carlo KAT of the twofish cipher with 192 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity cbc_decryption_monte_carlo_testbench192 is
end cbc_decryption_monte_carlo_testbench192;
 
architecture cbc_decryption192_monte_carlo_testbench_arch of cbc_decryption_monte_carlo_testbench192 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched192
port (
odd_in_tk192,
even_in_tk192 : in std_logic_vector(7 downto 0);
in_key_tk192 : in std_logic_vector(191 downto 0);
out_key_up_tk192,
out_key_down_tk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched192
port (
in_key_twk192 : in std_logic_vector(191 downto 0);
out_K0_twk192,
out_K1_twk192,
out_K2_twk192,
out_K3_twk192,
out_K4_twk192,
out_K5_twk192,
out_K6_twk192,
out_K7_twk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_decryption_round192
port (
in1_tdr192,
in2_tdr192,
in3_tdr192,
in4_tdr192,
in_Sfirst_tdr192,
in_Ssecond_tdr192,
in_Sthird_tdr192,
in_key_up_tdr192,
in_key_down_tdr192 : in std_logic_vector(31 downto 0);
out1_tdr192,
out2_tdr192,
out3_tdr192,
out4_tdr192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S192
port (
in_key_ts192 : in std_logic_vector(191 downto 0);
out_Sfirst_ts192,
out_Ssecond_ts192,
out_Sthird_ts192 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_cbc_decryption_monte_carlo_testvalues_192bits.txt";
FILE output_file : text is out "twofish_cbc_decryption_monte_carlo_192bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 0 to 9999) return string is
variable our_text : string (1 to 4) := (others => ' ');
variable thousands,
hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := ((int_number mod 1000) - (int_number mod 100)) / 100;
thousands := (int_number - (int_number mod 1000)) / 1000;
our_text(1) := digit_to_char(thousands);
our_text(2) := digit_to_char(hundreds);
our_text(3) := digit_to_char(tens);
our_text(4) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal twofish_key : std_logic_vector(191 downto 0);
 
signal key_up,
key_down,
Sfirst,
Ssecond,
Sthird,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched192
port map (
in_key_twk192 => twofish_key,
out_K0_twk192 => K0,
out_K1_twk192 => K1,
out_K2_twk192 => K2,
out_K3_twk192 => K3,
out_K4_twk192 => K4,
out_K5_twk192 => K5,
out_K6_twk192 => K6,
out_K7_twk192 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K4 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K5 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K6 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K7 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched192
port map (
odd_in_tk192 => odd_number,
even_in_tk192 => even_number,
in_key_tk192 => twofish_key,
out_key_up_tk192 => key_up,
out_key_down_tk192 => key_down
);
 
producing_the_Skeys: twofish_S192
port map (
in_key_ts192 => twofish_key,
out_Sfirst_ts192 => Sfirst,
out_Ssecond_ts192 => Ssecond,
out_Sthird_ts192 => Sthird
);
 
the_decryption_circuit: twofish_decryption_round192
port map (
in1_tdr192 => to_round(127 downto 96),
in2_tdr192 => to_round(95 downto 64),
in3_tdr192 => to_round(63 downto 32),
in4_tdr192 => to_round(31 downto 0),
in_Sfirst_tdr192 => Sfirst,
in_Ssecond_tdr192 => Ssecond,
in_Sthird_tdr192 => Sthird,
in_key_up_tdr192 => key_up,
in_key_down_tdr192 => key_down,
out1_tdr192 => to_encr_reg128(127 downto 96),
out2_tdr192 => to_encr_reg128(95 downto 64),
out3_tdr192 => to_encr_reg128(63 downto 32),
out4_tdr192 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K0 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K1 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K2 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K3 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
cbc_dmc_proc: process
 
variable key_f, -- key input from file
pt_f, -- plaintext from file
ct_f,
iv_f : line; -- ciphertext from file
variable key_v : std_logic_vector(191 downto 0); -- key vector input
variable pt_v , -- plaintext vector
ct_v,
iv_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter_10000 : integer range 0 to 9999 := 0; -- counter for the 10.000 repeats in the 400 next ones
variable counter_400 : integer range 0 to 399 := 0; -- counter for the 400 repeats
variable round : integer range 0 to 16 := 0; -- holds the rounds
variable PT, CT, CV, CTj_1 : std_logic_vector(127 downto 0) := (others => '0');
 
begin
 
while not endfile(input_file) loop
 
readline(input_file, key_f);
readline(input_file, iv_f);
readline(input_file,ct_f);
readline(input_file, pt_f);
hread(key_f,key_v);
hread(iv_f, iv_v);
hread(ct_f,ct_v);
hread(pt_f,pt_v);
 
twofish_key <= key_v;
CV := iv_v;
CT := ct_v;
 
for counter_10000 in 0 to 9999 loop
 
input_data <= CT;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
 
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00100110"; -- 38
odd_number <= "00100111"; -- 39
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector((((15-round)*2)+8), 8);
odd_number <= conv_std_logic_vector((((15-round)*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
 
PT := output_data XOR CV;
CV := CT;
CT := PT;
 
assert false report "I=" & to_text(counter_400) & " R=" & to_text(counter_10000) severity note;
 
end loop; -- counter_10000
 
hwrite(key_f, key_v);
hwrite(iv_f, iv_v);
hwrite(ct_f, ct_v);
hwrite(pt_f, PT);
writeline(output_file,key_f);
writeline(output_file, iv_f);
writeline(output_file,ct_f);
writeline(output_file,pt_f);
 
assert (pt_v = PT) report "file entry and decryption result DO NOT match!!! :( " severity failure;
assert (pt_v /= PT) report "Decryption I=" & to_text(counter_400) &" OK" severity note;
 
counter_400 := counter_400 + 1;
 
end loop;
assert false report "***** CBC Decryption Monte Carlo Test with 192 bits key size ended succesfully! :) *****" severity failure;
end process cbc_dmc_proc;
end cbc_decryption192_monte_carlo_testbench_arch;
 
/trunk/vhdl/twofish_ecb_decryption_monte_carlo_testbench_128bits.vhd
0,0 → 1,394
-- Twofish_ecb_decryption_monte_carlo_testbench_128bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the Decryption Monte Carlo KAT of the twofish cipher with 128 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity ecb_decryption_monte_carlo_testbench128 is
end ecb_decryption_monte_carlo_testbench128;
 
architecture ecb_decryption128_monte_carlo_testbench_arch of ecb_decryption_monte_carlo_testbench128 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched128
port (
odd_in_tk128,
even_in_tk128 : in std_logic_vector(7 downto 0);
in_key_tk128 : in std_logic_vector(127 downto 0);
out_key_up_tk128,
out_key_down_tk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched128
port (
in_key_twk128 : in std_logic_vector(127 downto 0);
out_K0_twk128,
out_K1_twk128,
out_K2_twk128,
out_K3_twk128,
out_K4_twk128,
out_K5_twk128,
out_K6_twk128,
out_K7_twk128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_decryption_round128
port (
in1_tdr128,
in2_tdr128,
in3_tdr128,
in4_tdr128,
in_Sfirst_tdr128,
in_Ssecond_tdr128,
in_key_up_tdr128,
in_key_down_tdr128 : in std_logic_vector(31 downto 0);
out1_tdr128,
out2_tdr128,
out3_tdr128,
out4_tdr128 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S128
port (
in_key_ts128 : in std_logic_vector(127 downto 0);
out_Sfirst_ts128,
out_Ssecond_ts128 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_ecb_decryption_monte_carlo_testvalues_128bits.txt";
FILE output_file : text is out "twofish_ecb_decryption_monte_carlo_128bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 0 to 9999) return string is
variable our_text : string (1 to 4) := (others => ' ');
variable thousands,
hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := ((int_number mod 1000) - (int_number mod 100)) / 100;
thousands := (int_number - (int_number mod 1000)) / 1000;
our_text(1) := digit_to_char(thousands);
our_text(2) := digit_to_char(hundreds);
our_text(3) := digit_to_char(tens);
our_text(4) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
twofish_key,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal key_up,
key_down,
Sfirst,
Ssecond,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched128
port map (
in_key_twk128 => twofish_key,
out_K0_twk128 => K0,
out_K1_twk128 => K1,
out_K2_twk128 => K2,
out_K3_twk128 => K3,
out_K4_twk128 => K4,
out_K5_twk128 => K5,
out_K6_twk128 => K6,
out_K7_twk128 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K4 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K5 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K6 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K7 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched128
port map (
odd_in_tk128 => odd_number,
even_in_tk128 => even_number,
in_key_tk128 => twofish_key,
out_key_up_tk128 => key_up,
out_key_down_tk128 => key_down
);
 
producing_the_Skeys: twofish_S128
port map (
in_key_ts128 => twofish_key,
out_Sfirst_ts128 => Sfirst,
out_Ssecond_ts128 => Ssecond
);
 
the_decryption_circuit: twofish_decryption_round128
port map (
in1_tdr128 => to_round(127 downto 96),
in2_tdr128 => to_round(95 downto 64),
in3_tdr128 => to_round(63 downto 32),
in4_tdr128 => to_round(31 downto 0),
in_Sfirst_tdr128 => Sfirst,
in_Ssecond_tdr128 => Ssecond,
in_key_up_tdr128 => key_up,
in_key_down_tdr128 => key_down,
out1_tdr128 => to_encr_reg128(127 downto 96),
out2_tdr128 => to_encr_reg128(95 downto 64),
out3_tdr128 => to_encr_reg128(63 downto 32),
out4_tdr128 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K0 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K1 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K2 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K3 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
ecb_dmc_proc: process
 
variable key_f, -- key input from file
pt_f, -- plaintext from file
ct_f : line; -- ciphertext from file
variable key_v, -- key vector input
pt_v , -- plaintext vector
ct_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter_10000 : integer range 0 to 9999 := 0; -- counter for the 10.000 repeats in the 400 next ones
variable counter_400 : integer range 0 to 399 := 0; -- counter for the 400 repeats
variable round : integer range 0 to 16 := 0; -- holds the rounds
variable intermediate_decryption_result : std_logic_vector(127 downto 0); -- holds the intermediate decryption result
 
begin
 
while not endfile(input_file) loop
 
readline(input_file, key_f);
readline(input_file, pt_f);
readline(input_file,ct_f);
hread(key_f,key_v);
hread(pt_f,pt_v);
hread(ct_f,ct_v);
 
twofish_key <= key_v;
intermediate_decryption_result := pt_v;
 
for counter_10000 in 0 to 9999 loop
input_data <= intermediate_decryption_result;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
 
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00100110"; -- 38
odd_number <= "00100111"; -- 39
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector((((15-round)*2)+8), 8);
odd_number <= conv_std_logic_vector((((15-round)*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
 
intermediate_decryption_result := output_data;
 
assert false report "I=" & to_text(counter_400) & " R=" & to_text(counter_10000) severity note;
 
end loop; -- counter_10000
 
hwrite(key_f, key_v);
hwrite(pt_f, pt_v);
hwrite(ct_f,output_data);
writeline(output_file,key_f);
writeline(output_file,pt_f);
writeline(output_file,ct_f);
 
assert (ct_v = output_data) report "file entry and decryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Decryption I=" & to_text(counter_400) &" OK" severity note;
counter_400 := counter_400 + 1;
end loop;
assert false report "***** ECB Decryption Monte Carlo Test with 128 bits key size ended succesfully! :) *****" severity failure;
end process ecb_dmc_proc;
end ecb_decryption128_monte_carlo_testbench_arch;
 
/trunk/vhdl/twofish_ecb_decryption_monte_carlo_testbench_192bits.vhd
0,0 → 1,400
-- Twofish_ecb_decryption_monte_carlo_testbench_192bits.vhd
-- Copyright (C) 2006 Spyros Ninos
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this library; see the file COPYING. If not, write to:
--
-- Free Software Foundation
-- 59 Temple Place - Suite 330
-- Boston, MA 02111-1307, USA.
--
-- description : this file is the testbench for the Decryption Monte Carlo KAT of the twofish cipher with 192 bit key
--
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_arith.all;
use std.textio.all;
 
entity ecb_decryption_monte_carlo_testbench192 is
end ecb_decryption_monte_carlo_testbench192;
 
architecture ecb_decryption192_monte_carlo_testbench_arch of ecb_decryption_monte_carlo_testbench192 is
 
component reg128
port (
in_reg128 : in std_logic_vector(127 downto 0);
out_reg128 : out std_logic_vector(127 downto 0);
enable_reg128, reset_reg128, clk_reg128 : in std_logic
);
end component;
 
component twofish_keysched192
port (
odd_in_tk192,
even_in_tk192 : in std_logic_vector(7 downto 0);
in_key_tk192 : in std_logic_vector(191 downto 0);
out_key_up_tk192,
out_key_down_tk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_whit_keysched192
port (
in_key_twk192 : in std_logic_vector(191 downto 0);
out_K0_twk192,
out_K1_twk192,
out_K2_twk192,
out_K3_twk192,
out_K4_twk192,
out_K5_twk192,
out_K6_twk192,
out_K7_twk192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_decryption_round192
port (
in1_tdr192,
in2_tdr192,
in3_tdr192,
in4_tdr192,
in_Sfirst_tdr192,
in_Ssecond_tdr192,
in_Sthird_tdr192,
in_key_up_tdr192,
in_key_down_tdr192 : in std_logic_vector(31 downto 0);
out1_tdr192,
out2_tdr192,
out3_tdr192,
out4_tdr192 : out std_logic_vector(31 downto 0)
);
end component;
 
component twofish_data_input
port (
in_tdi : in std_logic_vector(127 downto 0);
out_tdi : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_data_output
port (
in_tdo : in std_logic_vector(127 downto 0);
out_tdo : out std_logic_vector(127 downto 0)
);
end component;
 
component demux128
port ( in_demux128 : in std_logic_vector(127 downto 0);
out1_demux128, out2_demux128 : out std_logic_vector(127 downto 0);
selection_demux128 : in std_logic
);
end component;
component mux128
port ( in1_mux128, in2_mux128 : in std_logic_vector(127 downto 0);
selection_mux128 : in std_logic;
out_mux128 : out std_logic_vector(127 downto 0)
);
end component;
 
component twofish_S192
port (
in_key_ts192 : in std_logic_vector(191 downto 0);
out_Sfirst_ts192,
out_Ssecond_ts192,
out_Sthird_ts192 : out std_logic_vector(31 downto 0)
);
end component;
 
FILE input_file : text is in "twofish_ecb_decryption_monte_carlo_testvalues_192bits.txt";
FILE output_file : text is out "twofish_ecb_decryption_monte_carlo_192bits_results.txt";
-- we create the functions that transform a number to text
-- transforming a signle digit to a character
function digit_to_char(number : integer range 0 to 9) return character is
begin
case number is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
end case;
end;
 
-- transforming multi-digit number to text
function to_text(int_number : integer range 0 to 9999) return string is
variable our_text : string (1 to 4) := (others => ' ');
variable thousands,
hundreds,
tens,
ones : integer range 0 to 9;
begin
ones := int_number mod 10;
tens := ((int_number mod 100) - ones) / 10;
hundreds := ((int_number mod 1000) - (int_number mod 100)) / 100;
thousands := (int_number - (int_number mod 1000)) / 1000;
our_text(1) := digit_to_char(thousands);
our_text(2) := digit_to_char(hundreds);
our_text(3) := digit_to_char(tens);
our_text(4) := digit_to_char(ones);
return our_text;
end;
 
signal odd_number,
even_number : std_logic_vector(7 downto 0);
 
signal input_data,
output_data,
to_encr_reg128,
from_tdi_to_xors,
to_output_whit_xors,
from_xors_to_tdo,
to_mux, to_demux,
from_input_whit_xors,
to_round,
to_input_mux : std_logic_vector(127 downto 0) ;
 
signal twofish_key : std_logic_vector(191 downto 0);
 
signal key_up,
key_down,
Sfirst,
Ssecond,
Sthird,
from_xor0,
from_xor1,
from_xor2,
from_xor3,
K0,K1,K2,K3,
K4,K5,K6,K7 : std_logic_vector(31 downto 0);
 
signal clk : std_logic := '0';
signal mux_selection : std_logic := '0';
signal demux_selection: std_logic := '0';
signal enable_encr_reg : std_logic := '0';
signal reset : std_logic := '0';
signal enable_round_reg : std_logic := '0';
 
-- begin the testbench arch description
begin
 
 
-- getting data to encrypt
data_input: twofish_data_input
port map (
in_tdi => input_data,
out_tdi => from_tdi_to_xors
);
 
-- producing whitening keys K0..7
the_whitening_step: twofish_whit_keysched192
port map (
in_key_twk192 => twofish_key,
out_K0_twk192 => K0,
out_K1_twk192 => K1,
out_K2_twk192 => K2,
out_K3_twk192 => K3,
out_K4_twk192 => K4,
out_K5_twk192 => K5,
out_K6_twk192 => K6,
out_K7_twk192 => K7
);
 
-- performing the input whitening XORs
from_xor0 <= K4 XOR from_tdi_to_xors(127 downto 96);
from_xor1 <= K5 XOR from_tdi_to_xors(95 downto 64);
from_xor2 <= K6 XOR from_tdi_to_xors(63 downto 32);
from_xor3 <= K7 XOR from_tdi_to_xors(31 downto 0);
 
from_input_whit_xors <= from_xor0 & from_xor1 & from_xor2 & from_xor3;
 
round_reg: reg128
port map ( in_reg128 => from_input_whit_xors,
out_reg128 => to_input_mux,
enable_reg128 => enable_round_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
input_mux: mux128
port map ( in1_mux128 => to_input_mux,
in2_mux128 => to_mux,
out_mux128 => to_round,
selection_mux128 => mux_selection
);
 
 
-- creating a round
the_keysched_of_the_round: twofish_keysched192
port map (
odd_in_tk192 => odd_number,
even_in_tk192 => even_number,
in_key_tk192 => twofish_key,
out_key_up_tk192 => key_up,
out_key_down_tk192 => key_down
);
 
producing_the_Skeys: twofish_S192
port map (
in_key_ts192 => twofish_key,
out_Sfirst_ts192 => Sfirst,
out_Ssecond_ts192 => Ssecond,
out_Sthird_ts192 => Sthird
);
 
the_decryption_circuit: twofish_decryption_round192
port map (
in1_tdr192 => to_round(127 downto 96),
in2_tdr192 => to_round(95 downto 64),
in3_tdr192 => to_round(63 downto 32),
in4_tdr192 => to_round(31 downto 0),
in_Sfirst_tdr192 => Sfirst,
in_Ssecond_tdr192 => Ssecond,
in_Sthird_tdr192 => Sthird,
in_key_up_tdr192 => key_up,
in_key_down_tdr192 => key_down,
out1_tdr192 => to_encr_reg128(127 downto 96),
out2_tdr192 => to_encr_reg128(95 downto 64),
out3_tdr192 => to_encr_reg128(63 downto 32),
out4_tdr192 => to_encr_reg128(31 downto 0)
);
encr_reg: reg128
port map ( in_reg128 => to_encr_reg128,
out_reg128 => to_demux,
enable_reg128 => enable_encr_reg,
reset_reg128 => reset,
clk_reg128 => clk );
 
output_demux: demux128
port map ( in_demux128 => to_demux,
out1_demux128 => to_output_whit_xors,
out2_demux128 => to_mux,
selection_demux128 => demux_selection );
 
-- don't forget the last swap !!!
from_xors_to_tdo(127 downto 96) <= K0 XOR to_output_whit_xors(63 downto 32);
from_xors_to_tdo(95 downto 64) <= K1 XOR to_output_whit_xors(31 downto 0);
from_xors_to_tdo(63 downto 32) <= K2 XOR to_output_whit_xors(127 downto 96);
from_xors_to_tdo(31 downto 0) <= K3 XOR to_output_whit_xors(95 downto 64);
taking_the_output: twofish_data_output
port map (
in_tdo => from_xors_to_tdo,
out_tdo => output_data
);
 
-- we create the clock
clk <= not clk after 50 ns; -- period 100 ns
 
 
ecb_dmc_proc: process
 
variable key_f, -- key input from file
pt_f, -- plaintext from file
ct_f : line; -- ciphertext from file
variable key_v : std_logic_vector(191 downto 0); -- key vector input
variable pt_v , -- plaintext vector
ct_v : std_logic_vector(127 downto 0); -- ciphertext vector
 
variable counter_10000 : integer range 0 to 9999 := 0; -- counter for the 10.000 repeats in the 400 next ones
variable counter_400 : integer range 0 to 399 := 0; -- counter for the 400 repeats
variable round : integer range 0 to 16 := 0; -- holds the rounds
variable intermediate_decryption_result : std_logic_vector(127 downto 0); -- holds the intermediate decryption result
 
begin
 
while not endfile(input_file) loop
 
readline(input_file, key_f);
readline(input_file, pt_f);
readline(input_file,ct_f);
hread(key_f,key_v);
hread(pt_f,pt_v);
hread(ct_f,ct_v);
 
twofish_key <= key_v;
intermediate_decryption_result := pt_v;
 
for counter_10000 in 0 to 9999 loop
input_data <= intermediate_decryption_result;
wait for 25 ns;
reset <= '1';
wait for 50 ns;
reset <= '0';
 
mux_selection <= '0';
demux_selection <= '1';
enable_encr_reg <= '0';
enable_round_reg <= '0';
wait for 50 ns;
enable_round_reg <= '1';
wait for 50 ns;
enable_round_reg <= '0';
 
-- the first round
even_number <= "00100110"; -- 38
odd_number <= "00100111"; -- 39
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
demux_selection <= '1';
mux_selection <= '1';
-- the rest 15 rounds
for round in 1 to 15 loop
even_number <= conv_std_logic_vector((((15-round)*2)+8), 8);
odd_number <= conv_std_logic_vector((((15-round)*2)+9), 8);
wait for 50 ns;
enable_encr_reg <= '1';
wait for 50 ns;
enable_encr_reg <= '0';
end loop;
 
-- taking final results
demux_selection <= '0';
wait for 25 ns;
 
intermediate_decryption_result := output_data;
 
assert false report "I=" & to_text(counter_400) & " R=" & to_text(counter_10000) severity note;
 
end loop; -- counter_10000
 
hwrite(key_f, key_v);
hwrite(pt_f, pt_v);
hwrite(ct_f,output_data);
writeline(output_file,key_f);
writeline(output_file,pt_f);
writeline(output_file,ct_f);
 
assert (ct_v = output_data) report "file entry and decryption result DO NOT match!!! :( " severity failure;
assert (ct_v /= output_data) report "Decryption I=" & to_text(counter_400) &" OK" severity note;
counter_400 := counter_400 + 1;
end loop;
assert false report "***** ECB Decryption Monte Carlo Test with 192 bits key size ended succesfully! :) *****" severity failure;
end process ecb_dmc_proc;
end ecb_decryption192_monte_carlo_testbench_arch;
 
/trunk/Readme.en
0,0 → 1,9
This is under the GPL. See file COPYING.
 
This design implements the Twofish cipher for 128 and 192 bit keys.
 
Read the manual for further details.
 
Happy VHDLing!
 
- spyros

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.