salsa20 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,8 @@
1
+ *.o
2
+ *.bundle
3
+ *.so
4
+ ext/salsa20/Makefile
5
+ doc
6
+ pkg
7
+ *.class
8
+ tmp/
@@ -0,0 +1,3 @@
1
+ 0.1.0 Aug 20 2011
2
+
3
+ - Initial release
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ Copyright (C) 2011-2011 Dov Murik. All rights reserved.
2
+
3
+
4
+ Original C implementation of the Salsa20 algorithm by Daniel Bernstein.
5
+
6
+
7
+ Redistribution and use in source and binary forms, with or without
8
+ modification, are permitted provided that the following conditions are met:
9
+
10
+ 1. Redistributions of source code must retain the above copyright notice, this
11
+ list of conditions and the following disclaimer.
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,52 @@
1
+ = salsa20
2
+
3
+ Ruby-wrapper for the {Salsa20 stream cipher
4
+ algorithm}[http://cr.yp.to/snuffle.html] designed by Daniel Bernstein. Salsa20
5
+ is a family of 256-bit stream ciphers designed in 2005 and submitted to
6
+ eSTREAM, the ECRYPT Stream Cipher Project.
7
+
8
+ == How to install
9
+
10
+ gem install salsa20
11
+
12
+ You'll need a working compiler -- the crypto code is the {original C
13
+ implementation}[http://cr.yp.to/snuffle.html] from Daniel Bernstein.
14
+
15
+ == Usage
16
+
17
+ require 'salsa20'
18
+
19
+ key = "VERY_SECRET_256_BIT_KEY_12345678"
20
+ iv = "-RANDOM-"
21
+ plain_text = "Salsa20 is a family of 256-bit stream ciphers"
22
+
23
+ encryptor = Salsa20.new(key, iv)
24
+ encrypted_text = encryptor.encrypt(plain_text)
25
+ p encrypted_text
26
+ # => "\x9D\x1C\xE4\x83\xAB\x8E\xB7\x85a,\xC3\xF6\x981*\x03\b-\x99\xAD\xDF\xBFS\x96\x94$\xA0\xF0U\v\xABz;=R\xBB\xE1\xB0\xDD\xBC\x1A9\xB8\xBEb"
27
+
28
+ decryptor = Salsa20.new(key, iv)
29
+ decrypted_text = decryptor.decrypt(encrypted_text)
30
+ p decrypted_text
31
+ # => "Salsa20 is a family of 256-bit stream ciphers"
32
+
33
+ The Salsa20 cipher algorhitm supports efficiently seeking to any 64-bytes
34
+ boundry position in the stream using the +seek+ method. Use +position+ to tell
35
+ the current stream position in bytes.
36
+
37
+ For more information, see the detailed rdoc of the Salsa20 class.
38
+
39
+ == References
40
+
41
+ * http://cr.yp.to/snuffle.html
42
+ * http://www.ecrypt.eu.org/stream/salsa20pf.html
43
+ * http://en.wikipedia.org/wiki/Salsa20
44
+
45
+ == License
46
+
47
+ BSD 2-Clause open source license (full license text in the +LICENSE+ file).
48
+
49
+ == Contact
50
+
51
+ Author :: Dov Murik (dov.murik@gmail.com)
52
+ Project homepage :: https://github.com/dubek/salsa20-ruby
@@ -0,0 +1,21 @@
1
+ gem 'rdoc'
2
+ require 'rdoc/task'
3
+ require 'rake/extensiontask'
4
+ require 'rake/testtask'
5
+
6
+ GEMSPEC = eval(File.read(File.expand_path("../salsa20.gemspec", __FILE__)))
7
+
8
+ Rake::ExtensionTask.new('salsa20_ext')
9
+
10
+ Rake::TestTask.new do |t|
11
+ t.libs << "test"
12
+ t.test_files = FileList['test/*test.rb']
13
+ t.verbose = true
14
+ end
15
+
16
+ RDoc::Task.new do |rdoc|
17
+ rdoc.rdoc_dir = 'doc/rdoc'
18
+ rdoc.options += GEMSPEC.rdoc_options
19
+ rdoc.template = ENV['TEMPLATE'] if ENV['TEMPLATE']
20
+ rdoc.rdoc_files.include(*GEMSPEC.extra_rdoc_files)
21
+ end
@@ -0,0 +1,272 @@
1
+ /* ecrypt-config.h */
2
+
3
+ /* *** Normally, it should not be necessary to edit this file. *** */
4
+
5
+ #ifndef ECRYPT_CONFIG
6
+ #define ECRYPT_CONFIG
7
+
8
+ /* ------------------------------------------------------------------------- */
9
+
10
+ /* Guess the endianness of the target architecture. */
11
+
12
+ /*
13
+ * The LITTLE endian machines:
14
+ */
15
+ #if defined(__ultrix) /* Older MIPS */
16
+ #define ECRYPT_LITTLE_ENDIAN
17
+ #elif defined(__alpha) /* Alpha */
18
+ #define ECRYPT_LITTLE_ENDIAN
19
+ #elif defined(i386) /* x86 (gcc) */
20
+ #define ECRYPT_LITTLE_ENDIAN
21
+ #elif defined(__i386) /* x86 (gcc) */
22
+ #define ECRYPT_LITTLE_ENDIAN
23
+ #elif defined(_M_IX86) /* x86 (MSC, Borland) */
24
+ #define ECRYPT_LITTLE_ENDIAN
25
+ #elif defined(_MSC_VER) /* x86 (surely MSC) */
26
+ #define ECRYPT_LITTLE_ENDIAN
27
+ #elif defined(__INTEL_COMPILER) /* x86 (surely Intel compiler icl.exe) */
28
+ #define ECRYPT_LITTLE_ENDIAN
29
+
30
+ /*
31
+ * The BIG endian machines:
32
+ */
33
+ #elif defined(sun) /* Newer Sparc's */
34
+ #define ECRYPT_BIG_ENDIAN
35
+ #elif defined(__ppc__) /* PowerPC */
36
+ #define ECRYPT_BIG_ENDIAN
37
+
38
+ /*
39
+ * Finally machines with UNKNOWN endianness:
40
+ */
41
+ #elif defined (_AIX) /* RS6000 */
42
+ #define ECRYPT_UNKNOWN
43
+ #elif defined(__hpux) /* HP-PA */
44
+ #define ECRYPT_UNKNOWN
45
+ #elif defined(__aux) /* 68K */
46
+ #define ECRYPT_UNKNOWN
47
+ #elif defined(__dgux) /* 88K (but P6 in latest boxes) */
48
+ #define ECRYPT_UNKNOWN
49
+ #elif defined(__sgi) /* Newer MIPS */
50
+ #define ECRYPT_UNKNOWN
51
+ #else /* Any other processor */
52
+ #define ECRYPT_UNKNOWN
53
+ #endif
54
+
55
+ /* ------------------------------------------------------------------------- */
56
+
57
+ /*
58
+ * Find minimal-width types to store 8-bit, 16-bit, 32-bit, and 64-bit
59
+ * integers.
60
+ *
61
+ * Note: to enable 64-bit types on 32-bit compilers, it might be
62
+ * necessary to switch from ISO C90 mode to ISO C99 mode (e.g., gcc
63
+ * -std=c99).
64
+ */
65
+
66
+ #include <limits.h>
67
+
68
+ /* --- check char --- */
69
+
70
+ #if (UCHAR_MAX / 0xFU > 0xFU)
71
+ #ifndef I8T
72
+ #define I8T char
73
+ #define U8C(v) (v##U)
74
+
75
+ #if (UCHAR_MAX == 0xFFU)
76
+ #define ECRYPT_I8T_IS_BYTE
77
+ #endif
78
+
79
+ #endif
80
+
81
+ #if (UCHAR_MAX / 0xFFU > 0xFFU)
82
+ #ifndef I16T
83
+ #define I16T char
84
+ #define U16C(v) (v##U)
85
+ #endif
86
+
87
+ #if (UCHAR_MAX / 0xFFFFU > 0xFFFFU)
88
+ #ifndef I32T
89
+ #define I32T char
90
+ #define U32C(v) (v##U)
91
+ #endif
92
+
93
+ #if (UCHAR_MAX / 0xFFFFFFFFU > 0xFFFFFFFFU)
94
+ #ifndef I64T
95
+ #define I64T char
96
+ #define U64C(v) (v##U)
97
+ #define ECRYPT_NATIVE64
98
+ #endif
99
+
100
+ #endif
101
+ #endif
102
+ #endif
103
+ #endif
104
+
105
+ /* --- check short --- */
106
+
107
+ #if (USHRT_MAX / 0xFU > 0xFU)
108
+ #ifndef I8T
109
+ #define I8T short
110
+ #define U8C(v) (v##U)
111
+
112
+ #if (USHRT_MAX == 0xFFU)
113
+ #define ECRYPT_I8T_IS_BYTE
114
+ #endif
115
+
116
+ #endif
117
+
118
+ #if (USHRT_MAX / 0xFFU > 0xFFU)
119
+ #ifndef I16T
120
+ #define I16T short
121
+ #define U16C(v) (v##U)
122
+ #endif
123
+
124
+ #if (USHRT_MAX / 0xFFFFU > 0xFFFFU)
125
+ #ifndef I32T
126
+ #define I32T short
127
+ #define U32C(v) (v##U)
128
+ #endif
129
+
130
+ #if (USHRT_MAX / 0xFFFFFFFFU > 0xFFFFFFFFU)
131
+ #ifndef I64T
132
+ #define I64T short
133
+ #define U64C(v) (v##U)
134
+ #define ECRYPT_NATIVE64
135
+ #endif
136
+
137
+ #endif
138
+ #endif
139
+ #endif
140
+ #endif
141
+
142
+ /* --- check int --- */
143
+
144
+ #if (UINT_MAX / 0xFU > 0xFU)
145
+ #ifndef I8T
146
+ #define I8T int
147
+ #define U8C(v) (v##U)
148
+
149
+ #if (ULONG_MAX == 0xFFU)
150
+ #define ECRYPT_I8T_IS_BYTE
151
+ #endif
152
+
153
+ #endif
154
+
155
+ #if (UINT_MAX / 0xFFU > 0xFFU)
156
+ #ifndef I16T
157
+ #define I16T int
158
+ #define U16C(v) (v##U)
159
+ #endif
160
+
161
+ #if (UINT_MAX / 0xFFFFU > 0xFFFFU)
162
+ #ifndef I32T
163
+ #define I32T int
164
+ #define U32C(v) (v##U)
165
+ #endif
166
+
167
+ #if (UINT_MAX / 0xFFFFFFFFU > 0xFFFFFFFFU)
168
+ #ifndef I64T
169
+ #define I64T int
170
+ #define U64C(v) (v##U)
171
+ #define ECRYPT_NATIVE64
172
+ #endif
173
+
174
+ #endif
175
+ #endif
176
+ #endif
177
+ #endif
178
+
179
+ /* --- check long --- */
180
+
181
+ #if (ULONG_MAX / 0xFUL > 0xFUL)
182
+ #ifndef I8T
183
+ #define I8T long
184
+ #define U8C(v) (v##UL)
185
+
186
+ #if (ULONG_MAX == 0xFFUL)
187
+ #define ECRYPT_I8T_IS_BYTE
188
+ #endif
189
+
190
+ #endif
191
+
192
+ #if (ULONG_MAX / 0xFFUL > 0xFFUL)
193
+ #ifndef I16T
194
+ #define I16T long
195
+ #define U16C(v) (v##UL)
196
+ #endif
197
+
198
+ #if (ULONG_MAX / 0xFFFFUL > 0xFFFFUL)
199
+ #ifndef I32T
200
+ #define I32T long
201
+ #define U32C(v) (v##UL)
202
+ #endif
203
+
204
+ #if (ULONG_MAX / 0xFFFFFFFFUL > 0xFFFFFFFFUL)
205
+ #ifndef I64T
206
+ #define I64T long
207
+ #define U64C(v) (v##UL)
208
+ #define ECRYPT_NATIVE64
209
+ #endif
210
+
211
+ #endif
212
+ #endif
213
+ #endif
214
+ #endif
215
+
216
+ /* --- check long long --- */
217
+
218
+ #ifdef ULLONG_MAX
219
+
220
+ #if (ULLONG_MAX / 0xFULL > 0xFULL)
221
+ #ifndef I8T
222
+ #define I8T long long
223
+ #define U8C(v) (v##ULL)
224
+
225
+ #if (ULLONG_MAX == 0xFFULL)
226
+ #define ECRYPT_I8T_IS_BYTE
227
+ #endif
228
+
229
+ #endif
230
+
231
+ #if (ULLONG_MAX / 0xFFULL > 0xFFULL)
232
+ #ifndef I16T
233
+ #define I16T long long
234
+ #define U16C(v) (v##ULL)
235
+ #endif
236
+
237
+ #if (ULLONG_MAX / 0xFFFFULL > 0xFFFFULL)
238
+ #ifndef I32T
239
+ #define I32T long long
240
+ #define U32C(v) (v##ULL)
241
+ #endif
242
+
243
+ #if (ULLONG_MAX / 0xFFFFFFFFULL > 0xFFFFFFFFULL)
244
+ #ifndef I64T
245
+ #define I64T long long
246
+ #define U64C(v) (v##ULL)
247
+ #endif
248
+
249
+ #endif
250
+ #endif
251
+ #endif
252
+ #endif
253
+
254
+ #endif
255
+
256
+ /* --- check __int64 --- */
257
+
258
+ #ifdef _UI64_MAX
259
+
260
+ #if (_UI64_MAX / 0xFFFFFFFFui64 > 0xFFFFFFFFui64)
261
+ #ifndef I64T
262
+ #define I64T __int64
263
+ #define U64C(v) (v##ui64)
264
+ #endif
265
+
266
+ #endif
267
+
268
+ #endif
269
+
270
+ /* ------------------------------------------------------------------------- */
271
+
272
+ #endif
@@ -0,0 +1,46 @@
1
+ /* ecrypt-machine.h */
2
+
3
+ /*
4
+ * This file is included by 'ecrypt-portable.h'. It allows to override
5
+ * the default macros for specific platforms. Please carefully check
6
+ * the machine code generated by your compiler (with optimisations
7
+ * turned on) before deciding to edit this file.
8
+ */
9
+
10
+ /* ------------------------------------------------------------------------- */
11
+
12
+ #if (defined(ECRYPT_DEFAULT_ROT) && !defined(ECRYPT_MACHINE_ROT))
13
+
14
+ #define ECRYPT_MACHINE_ROT
15
+
16
+ #if (defined(WIN32) && defined(_MSC_VER))
17
+
18
+ #undef ROTL32
19
+ #undef ROTR32
20
+ #undef ROTL64
21
+ #undef ROTR64
22
+
23
+ #include <stdlib.h>
24
+
25
+ #define ROTL32(v, n) _lrotl(v, n)
26
+ #define ROTR32(v, n) _lrotr(v, n)
27
+ #define ROTL64(v, n) _rotl64(v, n)
28
+ #define ROTR64(v, n) _rotr64(v, n)
29
+
30
+ #endif
31
+
32
+ #endif
33
+
34
+ /* ------------------------------------------------------------------------- */
35
+
36
+ #if (defined(ECRYPT_DEFAULT_SWAP) && !defined(ECRYPT_MACHINE_SWAP))
37
+
38
+ #define ECRYPT_MACHINE_SWAP
39
+
40
+ /*
41
+ * If you want to overwrite the default swap macros, put it here. And so on.
42
+ */
43
+
44
+ #endif
45
+
46
+ /* ------------------------------------------------------------------------- */
@@ -0,0 +1,303 @@
1
+ /* ecrypt-portable.h */
2
+
3
+ /*
4
+ * WARNING: the conversions defined below are implemented as macros,
5
+ * and should be used carefully. They should NOT be used with
6
+ * parameters which perform some action. E.g., the following two lines
7
+ * are not equivalent:
8
+ *
9
+ * 1) ++x; y = ROTL32(x, n);
10
+ * 2) y = ROTL32(++x, n);
11
+ */
12
+
13
+ /*
14
+ * *** Please do not edit this file. ***
15
+ *
16
+ * The default macros can be overridden for specific architectures by
17
+ * editing 'ecrypt-machine.h'.
18
+ */
19
+
20
+ #ifndef ECRYPT_PORTABLE
21
+ #define ECRYPT_PORTABLE
22
+
23
+ #include "ecrypt-config.h"
24
+
25
+ /* ------------------------------------------------------------------------- */
26
+
27
+ /*
28
+ * The following types are defined (if available):
29
+ *
30
+ * u8: unsigned integer type, at least 8 bits
31
+ * u16: unsigned integer type, at least 16 bits
32
+ * u32: unsigned integer type, at least 32 bits
33
+ * u64: unsigned integer type, at least 64 bits
34
+ *
35
+ * s8, s16, s32, s64 -> signed counterparts of u8, u16, u32, u64
36
+ *
37
+ * The selection of minimum-width integer types is taken care of by
38
+ * 'ecrypt-config.h'. Note: to enable 64-bit types on 32-bit
39
+ * compilers, it might be necessary to switch from ISO C90 mode to ISO
40
+ * C99 mode (e.g., gcc -std=c99).
41
+ */
42
+
43
+ #ifdef I8T
44
+ typedef signed I8T s8;
45
+ typedef unsigned I8T u8;
46
+ #endif
47
+
48
+ #ifdef I16T
49
+ typedef signed I16T s16;
50
+ typedef unsigned I16T u16;
51
+ #endif
52
+
53
+ #ifdef I32T
54
+ typedef signed I32T s32;
55
+ typedef unsigned I32T u32;
56
+ #endif
57
+
58
+ #ifdef I64T
59
+ typedef signed I64T s64;
60
+ typedef unsigned I64T u64;
61
+ #endif
62
+
63
+ /*
64
+ * The following macros are used to obtain exact-width results.
65
+ */
66
+
67
+ #define U8V(v) ((u8)(v) & U8C(0xFF))
68
+ #define U16V(v) ((u16)(v) & U16C(0xFFFF))
69
+ #define U32V(v) ((u32)(v) & U32C(0xFFFFFFFF))
70
+ #define U64V(v) ((u64)(v) & U64C(0xFFFFFFFFFFFFFFFF))
71
+
72
+ /* ------------------------------------------------------------------------- */
73
+
74
+ /*
75
+ * The following macros return words with their bits rotated over n
76
+ * positions to the left/right.
77
+ */
78
+
79
+ #define ECRYPT_DEFAULT_ROT
80
+
81
+ #define ROTL8(v, n) \
82
+ (U8V((v) << (n)) | ((v) >> (8 - (n))))
83
+
84
+ #define ROTL16(v, n) \
85
+ (U16V((v) << (n)) | ((v) >> (16 - (n))))
86
+
87
+ #define ROTL32(v, n) \
88
+ (U32V((v) << (n)) | ((v) >> (32 - (n))))
89
+
90
+ #define ROTL64(v, n) \
91
+ (U64V((v) << (n)) | ((v) >> (64 - (n))))
92
+
93
+ #define ROTR8(v, n) ROTL8(v, 8 - (n))
94
+ #define ROTR16(v, n) ROTL16(v, 16 - (n))
95
+ #define ROTR32(v, n) ROTL32(v, 32 - (n))
96
+ #define ROTR64(v, n) ROTL64(v, 64 - (n))
97
+
98
+ #include "ecrypt-machine.h"
99
+
100
+ /* ------------------------------------------------------------------------- */
101
+
102
+ /*
103
+ * The following macros return a word with bytes in reverse order.
104
+ */
105
+
106
+ #define ECRYPT_DEFAULT_SWAP
107
+
108
+ #define SWAP16(v) \
109
+ ROTL16(v, 8)
110
+
111
+ #define SWAP32(v) \
112
+ ((ROTL32(v, 8) & U32C(0x00FF00FF)) | \
113
+ (ROTL32(v, 24) & U32C(0xFF00FF00)))
114
+
115
+ #ifdef ECRYPT_NATIVE64
116
+ #define SWAP64(v) \
117
+ ((ROTL64(v, 8) & U64C(0x000000FF000000FF)) | \
118
+ (ROTL64(v, 24) & U64C(0x0000FF000000FF00)) | \
119
+ (ROTL64(v, 40) & U64C(0x00FF000000FF0000)) | \
120
+ (ROTL64(v, 56) & U64C(0xFF000000FF000000)))
121
+ #else
122
+ #define SWAP64(v) \
123
+ (((u64)SWAP32(U32V(v)) << 32) | (u64)SWAP32(U32V(v >> 32)))
124
+ #endif
125
+
126
+ #include "ecrypt-machine.h"
127
+
128
+ #define ECRYPT_DEFAULT_WTOW
129
+
130
+ #ifdef ECRYPT_LITTLE_ENDIAN
131
+ #define U16TO16_LITTLE(v) (v)
132
+ #define U32TO32_LITTLE(v) (v)
133
+ #define U64TO64_LITTLE(v) (v)
134
+
135
+ #define U16TO16_BIG(v) SWAP16(v)
136
+ #define U32TO32_BIG(v) SWAP32(v)
137
+ #define U64TO64_BIG(v) SWAP64(v)
138
+ #endif
139
+
140
+ #ifdef ECRYPT_BIG_ENDIAN
141
+ #define U16TO16_LITTLE(v) SWAP16(v)
142
+ #define U32TO32_LITTLE(v) SWAP32(v)
143
+ #define U64TO64_LITTLE(v) SWAP64(v)
144
+
145
+ #define U16TO16_BIG(v) (v)
146
+ #define U32TO32_BIG(v) (v)
147
+ #define U64TO64_BIG(v) (v)
148
+ #endif
149
+
150
+ #include "ecrypt-machine.h"
151
+
152
+ /*
153
+ * The following macros load words from an array of bytes with
154
+ * different types of endianness, and vice versa.
155
+ */
156
+
157
+ #define ECRYPT_DEFAULT_BTOW
158
+
159
+ #if (!defined(ECRYPT_UNKNOWN) && defined(ECRYPT_I8T_IS_BYTE))
160
+
161
+ #define U8TO16_LITTLE(p) U16TO16_LITTLE(((u16*)(p))[0])
162
+ #define U8TO32_LITTLE(p) U32TO32_LITTLE(((u32*)(p))[0])
163
+ #define U8TO64_LITTLE(p) U64TO64_LITTLE(((u64*)(p))[0])
164
+
165
+ #define U8TO16_BIG(p) U16TO16_BIG(((u16*)(p))[0])
166
+ #define U8TO32_BIG(p) U32TO32_BIG(((u32*)(p))[0])
167
+ #define U8TO64_BIG(p) U64TO64_BIG(((u64*)(p))[0])
168
+
169
+ #define U16TO8_LITTLE(p, v) (((u16*)(p))[0] = U16TO16_LITTLE(v))
170
+ #define U32TO8_LITTLE(p, v) (((u32*)(p))[0] = U32TO32_LITTLE(v))
171
+ #define U64TO8_LITTLE(p, v) (((u64*)(p))[0] = U64TO64_LITTLE(v))
172
+
173
+ #define U16TO8_BIG(p, v) (((u16*)(p))[0] = U16TO16_BIG(v))
174
+ #define U32TO8_BIG(p, v) (((u32*)(p))[0] = U32TO32_BIG(v))
175
+ #define U64TO8_BIG(p, v) (((u64*)(p))[0] = U64TO64_BIG(v))
176
+
177
+ #else
178
+
179
+ #define U8TO16_LITTLE(p) \
180
+ (((u16)((p)[0]) ) | \
181
+ ((u16)((p)[1]) << 8))
182
+
183
+ #define U8TO32_LITTLE(p) \
184
+ (((u32)((p)[0]) ) | \
185
+ ((u32)((p)[1]) << 8) | \
186
+ ((u32)((p)[2]) << 16) | \
187
+ ((u32)((p)[3]) << 24))
188
+
189
+ #ifdef ECRYPT_NATIVE64
190
+ #define U8TO64_LITTLE(p) \
191
+ (((u64)((p)[0]) ) | \
192
+ ((u64)((p)[1]) << 8) | \
193
+ ((u64)((p)[2]) << 16) | \
194
+ ((u64)((p)[3]) << 24) | \
195
+ ((u64)((p)[4]) << 32) | \
196
+ ((u64)((p)[5]) << 40) | \
197
+ ((u64)((p)[6]) << 48) | \
198
+ ((u64)((p)[7]) << 56))
199
+ #else
200
+ #define U8TO64_LITTLE(p) \
201
+ ((u64)U8TO32_LITTLE(p) | ((u64)U8TO32_LITTLE((p) + 4) << 32))
202
+ #endif
203
+
204
+ #define U8TO16_BIG(p) \
205
+ (((u16)((p)[0]) << 8) | \
206
+ ((u16)((p)[1]) ))
207
+
208
+ #define U8TO32_BIG(p) \
209
+ (((u32)((p)[0]) << 24) | \
210
+ ((u32)((p)[1]) << 16) | \
211
+ ((u32)((p)[2]) << 8) | \
212
+ ((u32)((p)[3]) ))
213
+
214
+ #ifdef ECRYPT_NATIVE64
215
+ #define U8TO64_BIG(p) \
216
+ (((u64)((p)[0]) << 56) | \
217
+ ((u64)((p)[1]) << 48) | \
218
+ ((u64)((p)[2]) << 40) | \
219
+ ((u64)((p)[3]) << 32) | \
220
+ ((u64)((p)[4]) << 24) | \
221
+ ((u64)((p)[5]) << 16) | \
222
+ ((u64)((p)[6]) << 8) | \
223
+ ((u64)((p)[7]) ))
224
+ #else
225
+ #define U8TO64_BIG(p) \
226
+ (((u64)U8TO32_BIG(p) << 32) | (u64)U8TO32_BIG((p) + 4))
227
+ #endif
228
+
229
+ #define U16TO8_LITTLE(p, v) \
230
+ do { \
231
+ (p)[0] = U8V((v) ); \
232
+ (p)[1] = U8V((v) >> 8); \
233
+ } while (0)
234
+
235
+ #define U32TO8_LITTLE(p, v) \
236
+ do { \
237
+ (p)[0] = U8V((v) ); \
238
+ (p)[1] = U8V((v) >> 8); \
239
+ (p)[2] = U8V((v) >> 16); \
240
+ (p)[3] = U8V((v) >> 24); \
241
+ } while (0)
242
+
243
+ #ifdef ECRYPT_NATIVE64
244
+ #define U64TO8_LITTLE(p, v) \
245
+ do { \
246
+ (p)[0] = U8V((v) ); \
247
+ (p)[1] = U8V((v) >> 8); \
248
+ (p)[2] = U8V((v) >> 16); \
249
+ (p)[3] = U8V((v) >> 24); \
250
+ (p)[4] = U8V((v) >> 32); \
251
+ (p)[5] = U8V((v) >> 40); \
252
+ (p)[6] = U8V((v) >> 48); \
253
+ (p)[7] = U8V((v) >> 56); \
254
+ } while (0)
255
+ #else
256
+ #define U64TO8_LITTLE(p, v) \
257
+ do { \
258
+ U32TO8_LITTLE((p), U32V((v) )); \
259
+ U32TO8_LITTLE((p) + 4, U32V((v) >> 32)); \
260
+ } while (0)
261
+ #endif
262
+
263
+ #define U16TO8_BIG(p, v) \
264
+ do { \
265
+ (p)[0] = U8V((v) ); \
266
+ (p)[1] = U8V((v) >> 8); \
267
+ } while (0)
268
+
269
+ #define U32TO8_BIG(p, v) \
270
+ do { \
271
+ (p)[0] = U8V((v) >> 24); \
272
+ (p)[1] = U8V((v) >> 16); \
273
+ (p)[2] = U8V((v) >> 8); \
274
+ (p)[3] = U8V((v) ); \
275
+ } while (0)
276
+
277
+ #ifdef ECRYPT_NATIVE64
278
+ #define U64TO8_BIG(p, v) \
279
+ do { \
280
+ (p)[0] = U8V((v) >> 56); \
281
+ (p)[1] = U8V((v) >> 48); \
282
+ (p)[2] = U8V((v) >> 40); \
283
+ (p)[3] = U8V((v) >> 32); \
284
+ (p)[4] = U8V((v) >> 24); \
285
+ (p)[5] = U8V((v) >> 16); \
286
+ (p)[6] = U8V((v) >> 8); \
287
+ (p)[7] = U8V((v) ); \
288
+ } while (0)
289
+ #else
290
+ #define U64TO8_BIG(p, v) \
291
+ do { \
292
+ U32TO8_BIG((p), U32V((v) >> 32)); \
293
+ U32TO8_BIG((p) + 4, U32V((v) )); \
294
+ } while (0)
295
+ #endif
296
+
297
+ #endif
298
+
299
+ #include "ecrypt-machine.h"
300
+
301
+ /* ------------------------------------------------------------------------- */
302
+
303
+ #endif