Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/ttssh2/ttxssh/ed25519_blocks.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9048 - (show annotations) (download) (as text)
Wed Dec 16 12:24:13 2020 UTC (3 years, 3 months ago) by nmaya
File MIME type: text/x-csrc
File size: 8306 byte(s)
ソースファイルの著作権表記の "最後の発行の年" を削除

ticket #40996
1 /*
2 * (C) 2004- TeraTerm Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "ed25519_crypto_api.h"
30
31 typedef unsigned long long uint64;
32
33 static uint64 load_bigendian(const unsigned char *x)
34 {
35 return
36 (uint64) (x[7]) \
37 | (((uint64) (x[6])) << 8) \
38 | (((uint64) (x[5])) << 16) \
39 | (((uint64) (x[4])) << 24) \
40 | (((uint64) (x[3])) << 32) \
41 | (((uint64) (x[2])) << 40) \
42 | (((uint64) (x[1])) << 48) \
43 | (((uint64) (x[0])) << 56)
44 ;
45 }
46
47 static void store_bigendian(unsigned char *x,uint64 u)
48 {
49 x[7] = (unsigned char)u; u >>= 8;
50 x[6] = (unsigned char)u; u >>= 8;
51 x[5] = (unsigned char)u; u >>= 8;
52 x[4] = (unsigned char)u; u >>= 8;
53 x[3] = (unsigned char)u; u >>= 8;
54 x[2] = (unsigned char)u; u >>= 8;
55 x[1] = (unsigned char)u; u >>= 8;
56 x[0] = (unsigned char)u;
57 }
58
59 #define SHR(x,c) ((x) >> (c))
60 #define ROTR(x,c) (((x) >> (c)) | ((x) << (64 - (c))))
61
62 #define Ch(x,y,z) ((x & y) ^ (~x & z))
63 #define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
64 #define Sigma0(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
65 #define Sigma1(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
66 #define sigma0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x,7))
67 #define sigma1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x,6))
68
69 #define M(w0,w14,w9,w1) w0 = sigma1(w14) + w9 + sigma0(w1) + w0;
70
71 #define EXPAND \
72 M(w0 ,w14,w9 ,w1 ) \
73 M(w1 ,w15,w10,w2 ) \
74 M(w2 ,w0 ,w11,w3 ) \
75 M(w3 ,w1 ,w12,w4 ) \
76 M(w4 ,w2 ,w13,w5 ) \
77 M(w5 ,w3 ,w14,w6 ) \
78 M(w6 ,w4 ,w15,w7 ) \
79 M(w7 ,w5 ,w0 ,w8 ) \
80 M(w8 ,w6 ,w1 ,w9 ) \
81 M(w9 ,w7 ,w2 ,w10) \
82 M(w10,w8 ,w3 ,w11) \
83 M(w11,w9 ,w4 ,w12) \
84 M(w12,w10,w5 ,w13) \
85 M(w13,w11,w6 ,w14) \
86 M(w14,w12,w7 ,w15) \
87 M(w15,w13,w8 ,w0 )
88
89 #define F(w,k) \
90 T1 = h + Sigma1(e) + Ch(e,f,g) + k + w; \
91 T2 = Sigma0(a) + Maj(a,b,c); \
92 h = g; \
93 g = f; \
94 f = e; \
95 e = d + T1; \
96 d = c; \
97 c = b; \
98 b = a; \
99 a = T1 + T2;
100
101 int crypto_hashblocks_sha512(unsigned char *statebytes,const unsigned char *in,unsigned long long inlen)
102 {
103 uint64 state[8];
104 uint64 a;
105 uint64 b;
106 uint64 c;
107 uint64 d;
108 uint64 e;
109 uint64 f;
110 uint64 g;
111 uint64 h;
112 uint64 T1;
113 uint64 T2;
114
115 a = load_bigendian(statebytes + 0); state[0] = a;
116 b = load_bigendian(statebytes + 8); state[1] = b;
117 c = load_bigendian(statebytes + 16); state[2] = c;
118 d = load_bigendian(statebytes + 24); state[3] = d;
119 e = load_bigendian(statebytes + 32); state[4] = e;
120 f = load_bigendian(statebytes + 40); state[5] = f;
121 g = load_bigendian(statebytes + 48); state[6] = g;
122 h = load_bigendian(statebytes + 56); state[7] = h;
123
124 while (inlen >= 128) {
125 uint64 w0 = load_bigendian(in + 0);
126 uint64 w1 = load_bigendian(in + 8);
127 uint64 w2 = load_bigendian(in + 16);
128 uint64 w3 = load_bigendian(in + 24);
129 uint64 w4 = load_bigendian(in + 32);
130 uint64 w5 = load_bigendian(in + 40);
131 uint64 w6 = load_bigendian(in + 48);
132 uint64 w7 = load_bigendian(in + 56);
133 uint64 w8 = load_bigendian(in + 64);
134 uint64 w9 = load_bigendian(in + 72);
135 uint64 w10 = load_bigendian(in + 80);
136 uint64 w11 = load_bigendian(in + 88);
137 uint64 w12 = load_bigendian(in + 96);
138 uint64 w13 = load_bigendian(in + 104);
139 uint64 w14 = load_bigendian(in + 112);
140 uint64 w15 = load_bigendian(in + 120);
141
142 F(w0 ,0x428a2f98d728ae22ULL)
143 F(w1 ,0x7137449123ef65cdULL)
144 F(w2 ,0xb5c0fbcfec4d3b2fULL)
145 F(w3 ,0xe9b5dba58189dbbcULL)
146 F(w4 ,0x3956c25bf348b538ULL)
147 F(w5 ,0x59f111f1b605d019ULL)
148 F(w6 ,0x923f82a4af194f9bULL)
149 F(w7 ,0xab1c5ed5da6d8118ULL)
150 F(w8 ,0xd807aa98a3030242ULL)
151 F(w9 ,0x12835b0145706fbeULL)
152 F(w10,0x243185be4ee4b28cULL)
153 F(w11,0x550c7dc3d5ffb4e2ULL)
154 F(w12,0x72be5d74f27b896fULL)
155 F(w13,0x80deb1fe3b1696b1ULL)
156 F(w14,0x9bdc06a725c71235ULL)
157 F(w15,0xc19bf174cf692694ULL)
158
159 EXPAND
160
161 F(w0 ,0xe49b69c19ef14ad2ULL)
162 F(w1 ,0xefbe4786384f25e3ULL)
163 F(w2 ,0x0fc19dc68b8cd5b5ULL)
164 F(w3 ,0x240ca1cc77ac9c65ULL)
165 F(w4 ,0x2de92c6f592b0275ULL)
166 F(w5 ,0x4a7484aa6ea6e483ULL)
167 F(w6 ,0x5cb0a9dcbd41fbd4ULL)
168 F(w7 ,0x76f988da831153b5ULL)
169 F(w8 ,0x983e5152ee66dfabULL)
170 F(w9 ,0xa831c66d2db43210ULL)
171 F(w10,0xb00327c898fb213fULL)
172 F(w11,0xbf597fc7beef0ee4ULL)
173 F(w12,0xc6e00bf33da88fc2ULL)
174 F(w13,0xd5a79147930aa725ULL)
175 F(w14,0x06ca6351e003826fULL)
176 F(w15,0x142929670a0e6e70ULL)
177
178 EXPAND
179
180 F(w0 ,0x27b70a8546d22ffcULL)
181 F(w1 ,0x2e1b21385c26c926ULL)
182 F(w2 ,0x4d2c6dfc5ac42aedULL)
183 F(w3 ,0x53380d139d95b3dfULL)
184 F(w4 ,0x650a73548baf63deULL)
185 F(w5 ,0x766a0abb3c77b2a8ULL)
186 F(w6 ,0x81c2c92e47edaee6ULL)
187 F(w7 ,0x92722c851482353bULL)
188 F(w8 ,0xa2bfe8a14cf10364ULL)
189 F(w9 ,0xa81a664bbc423001ULL)
190 F(w10,0xc24b8b70d0f89791ULL)
191 F(w11,0xc76c51a30654be30ULL)
192 F(w12,0xd192e819d6ef5218ULL)
193 F(w13,0xd69906245565a910ULL)
194 F(w14,0xf40e35855771202aULL)
195 F(w15,0x106aa07032bbd1b8ULL)
196
197 EXPAND
198
199 F(w0 ,0x19a4c116b8d2d0c8ULL)
200 F(w1 ,0x1e376c085141ab53ULL)
201 F(w2 ,0x2748774cdf8eeb99ULL)
202 F(w3 ,0x34b0bcb5e19b48a8ULL)
203 F(w4 ,0x391c0cb3c5c95a63ULL)
204 F(w5 ,0x4ed8aa4ae3418acbULL)
205 F(w6 ,0x5b9cca4f7763e373ULL)
206 F(w7 ,0x682e6ff3d6b2b8a3ULL)
207 F(w8 ,0x748f82ee5defb2fcULL)
208 F(w9 ,0x78a5636f43172f60ULL)
209 F(w10,0x84c87814a1f0ab72ULL)
210 F(w11,0x8cc702081a6439ecULL)
211 F(w12,0x90befffa23631e28ULL)
212 F(w13,0xa4506cebde82bde9ULL)
213 F(w14,0xbef9a3f7b2c67915ULL)
214 F(w15,0xc67178f2e372532bULL)
215
216 EXPAND
217
218 F(w0 ,0xca273eceea26619cULL)
219 F(w1 ,0xd186b8c721c0c207ULL)
220 F(w2 ,0xeada7dd6cde0eb1eULL)
221 F(w3 ,0xf57d4f7fee6ed178ULL)
222 F(w4 ,0x06f067aa72176fbaULL)
223 F(w5 ,0x0a637dc5a2c898a6ULL)
224 F(w6 ,0x113f9804bef90daeULL)
225 F(w7 ,0x1b710b35131c471bULL)
226 F(w8 ,0x28db77f523047d84ULL)
227 F(w9 ,0x32caab7b40c72493ULL)
228 F(w10,0x3c9ebe0a15c9bebcULL)
229 F(w11,0x431d67c49c100d4cULL)
230 F(w12,0x4cc5d4becb3e42b6ULL)
231 F(w13,0x597f299cfc657e2aULL)
232 F(w14,0x5fcb6fab3ad6faecULL)
233 F(w15,0x6c44198c4a475817ULL)
234
235 a += state[0];
236 b += state[1];
237 c += state[2];
238 d += state[3];
239 e += state[4];
240 f += state[5];
241 g += state[6];
242 h += state[7];
243
244 state[0] = a;
245 state[1] = b;
246 state[2] = c;
247 state[3] = d;
248 state[4] = e;
249 state[5] = f;
250 state[6] = g;
251 state[7] = h;
252
253 in += 128;
254 inlen -= 128;
255 }
256
257 store_bigendian(statebytes + 0,state[0]);
258 store_bigendian(statebytes + 8,state[1]);
259 store_bigendian(statebytes + 16,state[2]);
260 store_bigendian(statebytes + 24,state[3]);
261 store_bigendian(statebytes + 32,state[4]);
262 store_bigendian(statebytes + 40,state[5]);
263 store_bigendian(statebytes + 48,state[6]);
264 store_bigendian(statebytes + 56,state[7]);
265
266 return (int)inlen;
267 }
268

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26