salsa20 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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