blob: 6a73a1ce43f86eb224dda3f55eefa72b422b65b4 [file] [log] [blame]
Bram Moolenaaredf3f972016-08-29 22:49:24 +02001/* vi:set ts=8 sts=4 sw=4 noet:
Bram Moolenaar40e6a712010-05-16 22:32:54 +02002 *
Bram Moolenaar0bbabe82010-05-17 20:32:55 +02003 * VIM - Vi IMproved by Bram Moolenaar
Bram Moolenaar40e6a712010-05-16 22:32:54 +02004 *
Bram Moolenaar0bbabe82010-05-17 20:32:55 +02005 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
8 *
9 * FIPS-180-2 compliant SHA-256 implementation
Bram Moolenaar8d4eecc2012-11-20 17:19:01 +010010 * GPL by Christophe Devine, applies to older version.
Bram Moolenaar0bbabe82010-05-17 20:32:55 +020011 * Modified for md5deep, in public domain.
12 * Modified For Vim, Mohsin Ahmed, http://www.cs.albany.edu/~mosh
Bram Moolenaar8d4eecc2012-11-20 17:19:01 +010013 * Mohsin Ahmed states this work is distributed under the VIM License or GPL,
14 * at your choice.
Bram Moolenaar0bbabe82010-05-17 20:32:55 +020015 *
16 * Vim specific notes:
17 * Functions exported by this file:
18 * 1. sha256_key() hashes the password to 64 bytes char string.
19 * 2. sha2_seed() generates a random header.
20 * sha256_self_test() is implicitly called once.
Bram Moolenaar40e6a712010-05-16 22:32:54 +020021 */
22
23#include "vim.h"
24
Bram Moolenaar55debbe2010-05-23 23:34:36 +020025#if defined(FEAT_CRYPT) || defined(FEAT_PERSISTENT_UNDO)
Bram Moolenaar40e6a712010-05-16 22:32:54 +020026
Bram Moolenaar40e6a712010-05-16 22:32:54 +020027#define GET_UINT32(n, b, i) \
28{ \
Bram Moolenaarfa7584c2010-05-19 21:57:45 +020029 (n) = ( (UINT32_T)(b)[(i) ] << 24) \
30 | ( (UINT32_T)(b)[(i) + 1] << 16) \
31 | ( (UINT32_T)(b)[(i) + 2] << 8) \
32 | ( (UINT32_T)(b)[(i) + 3] ); \
Bram Moolenaar40e6a712010-05-16 22:32:54 +020033}
34
35#define PUT_UINT32(n,b,i) \
36{ \
37 (b)[(i) ] = (char_u)((n) >> 24); \
38 (b)[(i) + 1] = (char_u)((n) >> 16); \
39 (b)[(i) + 2] = (char_u)((n) >> 8); \
40 (b)[(i) + 3] = (char_u)((n) ); \
41}
42
Yegappan Lakshmanane89aef32025-05-14 20:31:55 +020043 void
Bram Moolenaar764b23c2016-01-30 21:10:09 +010044sha256_start(context_sha256_T *ctx)
Bram Moolenaar40e6a712010-05-16 22:32:54 +020045{
46 ctx->total[0] = 0;
47 ctx->total[1] = 0;
48
49 ctx->state[0] = 0x6A09E667;
50 ctx->state[1] = 0xBB67AE85;
51 ctx->state[2] = 0x3C6EF372;
52 ctx->state[3] = 0xA54FF53A;
53 ctx->state[4] = 0x510E527F;
54 ctx->state[5] = 0x9B05688C;
55 ctx->state[6] = 0x1F83D9AB;
56 ctx->state[7] = 0x5BE0CD19;
57}
58
59 static void
Bram Moolenaar764b23c2016-01-30 21:10:09 +010060sha256_process(context_sha256_T *ctx, char_u data[64])
Bram Moolenaar40e6a712010-05-16 22:32:54 +020061{
Bram Moolenaarfa7584c2010-05-19 21:57:45 +020062 UINT32_T temp1, temp2, W[64];
63 UINT32_T A, B, C, D, E, F, G, H;
Bram Moolenaar40e6a712010-05-16 22:32:54 +020064
65 GET_UINT32(W[0], data, 0);
66 GET_UINT32(W[1], data, 4);
67 GET_UINT32(W[2], data, 8);
68 GET_UINT32(W[3], data, 12);
69 GET_UINT32(W[4], data, 16);
70 GET_UINT32(W[5], data, 20);
71 GET_UINT32(W[6], data, 24);
72 GET_UINT32(W[7], data, 28);
73 GET_UINT32(W[8], data, 32);
74 GET_UINT32(W[9], data, 36);
75 GET_UINT32(W[10], data, 40);
76 GET_UINT32(W[11], data, 44);
77 GET_UINT32(W[12], data, 48);
78 GET_UINT32(W[13], data, 52);
79 GET_UINT32(W[14], data, 56);
80 GET_UINT32(W[15], data, 60);
81
kylo252ae6f1d82022-02-16 19:24:07 +000082#define SHR(x, n) (((x) & 0xFFFFFFFF) >> (n))
83#define ROTR(x, n) (SHR(x, n) | ((x) << (32 - (n))))
Bram Moolenaar40e6a712010-05-16 22:32:54 +020084
85#define S0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
86#define S1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
87
88#define S2(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
89#define S3(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
90
kylo252ae6f1d82022-02-16 19:24:07 +000091#define F0(x, y, z) (((x) & (y)) | ((z) & ((x) | (y))))
92#define F1(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
Bram Moolenaar40e6a712010-05-16 22:32:54 +020093
94#define R(t) \
95( \
kylo252ae6f1d82022-02-16 19:24:07 +000096 W[t] = S1(W[(t) - 2]) + W[(t) - 7] + \
97 S0(W[(t) - 15]) + W[(t) - 16] \
Bram Moolenaar40e6a712010-05-16 22:32:54 +020098)
99
100#define P(a,b,c,d,e,f,g,h,x,K) \
101{ \
kylo252ae6f1d82022-02-16 19:24:07 +0000102 temp1 = (h) + S3(e) + F1(e, f, g) + (K) + (x); \
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200103 temp2 = S2(a) + F0(a, b, c); \
kylo252ae6f1d82022-02-16 19:24:07 +0000104 (d) += temp1; (h) = temp1 + temp2; \
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200105}
106
107 A = ctx->state[0];
108 B = ctx->state[1];
109 C = ctx->state[2];
110 D = ctx->state[3];
111 E = ctx->state[4];
112 F = ctx->state[5];
113 G = ctx->state[6];
114 H = ctx->state[7];
115
116 P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98);
117 P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491);
118 P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF);
119 P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5);
120 P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B);
121 P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1);
122 P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4);
123 P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5);
124 P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98);
125 P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01);
126 P( G, H, A, B, C, D, E, F, W[10], 0x243185BE);
127 P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3);
128 P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74);
129 P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE);
130 P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7);
131 P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174);
132 P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1);
133 P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786);
134 P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6);
135 P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC);
136 P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F);
137 P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA);
138 P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC);
139 P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA);
140 P( A, B, C, D, E, F, G, H, R(24), 0x983E5152);
141 P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D);
142 P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8);
143 P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7);
144 P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3);
145 P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147);
146 P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351);
147 P( B, C, D, E, F, G, H, A, R(31), 0x14292967);
148 P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85);
149 P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138);
150 P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC);
151 P( F, G, H, A, B, C, D, E, R(35), 0x53380D13);
152 P( E, F, G, H, A, B, C, D, R(36), 0x650A7354);
153 P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB);
154 P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E);
155 P( B, C, D, E, F, G, H, A, R(39), 0x92722C85);
156 P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1);
157 P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B);
158 P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70);
159 P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3);
160 P( E, F, G, H, A, B, C, D, R(44), 0xD192E819);
161 P( D, E, F, G, H, A, B, C, R(45), 0xD6990624);
162 P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585);
163 P( B, C, D, E, F, G, H, A, R(47), 0x106AA070);
164 P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116);
165 P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08);
166 P( G, H, A, B, C, D, E, F, R(50), 0x2748774C);
167 P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5);
168 P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3);
169 P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A);
170 P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F);
171 P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3);
172 P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE);
173 P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F);
174 P( G, H, A, B, C, D, E, F, R(58), 0x84C87814);
175 P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208);
176 P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA);
177 P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB);
178 P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7);
179 P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2);
180
181 ctx->state[0] += A;
182 ctx->state[1] += B;
183 ctx->state[2] += C;
184 ctx->state[3] += D;
185 ctx->state[4] += E;
186 ctx->state[5] += F;
187 ctx->state[6] += G;
188 ctx->state[7] += H;
189}
190
Bram Moolenaar55debbe2010-05-23 23:34:36 +0200191 void
Bram Moolenaar764b23c2016-01-30 21:10:09 +0100192sha256_update(context_sha256_T *ctx, char_u *input, UINT32_T length)
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200193{
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200194 UINT32_T left, fill;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200195
196 if (length == 0)
197 return;
198
199 left = ctx->total[0] & 0x3F;
200 fill = 64 - left;
201
202 ctx->total[0] += length;
203 ctx->total[0] &= 0xFFFFFFFF;
204
205 if (ctx->total[0] < length)
206 ctx->total[1]++;
207
208 if (left && length >= fill)
209 {
210 memcpy((void *)(ctx->buffer + left), (void *)input, fill);
211 sha256_process(ctx, ctx->buffer);
212 length -= fill;
213 input += fill;
214 left = 0;
215 }
216
217 while (length >= 64)
218 {
219 sha256_process(ctx, input);
220 length -= 64;
221 input += 64;
222 }
223
224 if (length)
225 memcpy((void *)(ctx->buffer + left), (void *)input, length);
226}
227
228static char_u sha256_padding[64] = {
229 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
230 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
231 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
232 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
233};
234
Bram Moolenaar55debbe2010-05-23 23:34:36 +0200235 void
Bram Moolenaar764b23c2016-01-30 21:10:09 +0100236sha256_finish(context_sha256_T *ctx, char_u digest[32])
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200237{
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200238 UINT32_T last, padn;
239 UINT32_T high, low;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200240 char_u msglen[8];
241
242 high = (ctx->total[0] >> 29) | (ctx->total[1] << 3);
243 low = (ctx->total[0] << 3);
244
245 PUT_UINT32(high, msglen, 0);
246 PUT_UINT32(low, msglen, 4);
247
248 last = ctx->total[0] & 0x3F;
249 padn = (last < 56) ? (56 - last) : (120 - last);
250
251 sha256_update(ctx, sha256_padding, padn);
252 sha256_update(ctx, msglen, 8);
253
254 PUT_UINT32(ctx->state[0], digest, 0);
255 PUT_UINT32(ctx->state[1], digest, 4);
256 PUT_UINT32(ctx->state[2], digest, 8);
257 PUT_UINT32(ctx->state[3], digest, 12);
258 PUT_UINT32(ctx->state[4], digest, 16);
259 PUT_UINT32(ctx->state[5], digest, 20);
260 PUT_UINT32(ctx->state[6], digest, 24);
261 PUT_UINT32(ctx->state[7], digest, 28);
262}
Bram Moolenaar63d9e732019-12-05 21:10:38 +0100263#endif // FEAT_CRYPT || FEAT_PERSISTENT_UNDO
Bram Moolenaar80794b12010-06-13 05:20:42 +0200264
265#if defined(FEAT_CRYPT) || defined(PROTO)
Bram Moolenaar823a1652010-05-16 23:02:33 +0200266/*
Bram Moolenaar80794b12010-06-13 05:20:42 +0200267 * Returns hex digest of "buf[buf_len]" in a static array.
268 * if "salt" is not NULL also do "salt[salt_len]".
Bram Moolenaar823a1652010-05-16 23:02:33 +0200269 */
Bram Moolenaaraf9aeb92013-02-13 17:35:04 +0100270 char_u *
Bram Moolenaar764b23c2016-01-30 21:10:09 +0100271sha256_bytes(
272 char_u *buf,
273 int buf_len,
274 char_u *salt,
275 int salt_len)
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200276{
277 char_u sha256sum[32];
Bram Moolenaar823a1652010-05-16 23:02:33 +0200278 static char_u hexit[65];
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200279 int j;
280 context_sha256_T ctx;
281
282 sha256_self_test();
283
Bram Moolenaar55debbe2010-05-23 23:34:36 +0200284 sha256_start(&ctx);
Bram Moolenaar80794b12010-06-13 05:20:42 +0200285 sha256_update(&ctx, buf, buf_len);
286 if (salt != NULL)
287 sha256_update(&ctx, salt, salt_len);
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200288 sha256_finish(&ctx, sha256sum);
289 for (j = 0; j < 32; j++)
Bram Moolenaar823a1652010-05-16 23:02:33 +0200290 sprintf((char *)hexit + j * 2, "%02x", sha256sum[j]);
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200291 hexit[sizeof(hexit) - 1] = '\0';
292 return hexit;
293}
294
295/*
Bram Moolenaar823a1652010-05-16 23:02:33 +0200296 * Returns sha256(buf) as 64 hex chars in static array.
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200297 */
Bram Moolenaar823a1652010-05-16 23:02:33 +0200298 char_u *
Bram Moolenaar764b23c2016-01-30 21:10:09 +0100299sha256_key(
300 char_u *buf,
301 char_u *salt,
302 int salt_len)
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200303{
Bram Moolenaar63d9e732019-12-05 21:10:38 +0100304 // No passwd means don't encrypt
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200305 if (buf == NULL || *buf == NUL)
Bram Moolenaar823a1652010-05-16 23:02:33 +0200306 return (char_u *)"";
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200307
Bram Moolenaar80794b12010-06-13 05:20:42 +0200308 return sha256_bytes(buf, (int)STRLEN(buf), salt, salt_len);
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200309}
310
311/*
312 * These are the standard FIPS-180-2 test vectors
313 */
314
315static char *sha_self_test_msg[] = {
316 "abc",
317 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
318 NULL
319};
320
321static char *sha_self_test_vector[] = {
322 "ba7816bf8f01cfea414140de5dae2223" \
323 "b00361a396177a9cb410ff61f20015ad",
324 "248d6a61d20638b8e5c026930c3e6039" \
325 "a33ce45964ff2167f6ecedd419db06c1",
326 "cdc76e5c9914fb9281a1c7e284d73e67" \
327 "f1809a48a497200e046d39ccc7112cd0"
328};
329
330/*
331 * Perform a test on the SHA256 algorithm.
332 * Return FAIL or OK.
333 */
334 int
Bram Moolenaar764b23c2016-01-30 21:10:09 +0100335sha256_self_test(void)
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200336{
337 int i, j;
338 char output[65];
339 context_sha256_T ctx;
340 char_u buf[1000];
341 char_u sha256sum[32];
342 static int failures = 0;
Bram Moolenaar823a1652010-05-16 23:02:33 +0200343 char_u *hexit;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200344 static int sha256_self_tested = 0;
345
346 if (sha256_self_tested > 0)
347 return failures > 0 ? FAIL : OK;
348 sha256_self_tested = 1;
349
350 for (i = 0; i < 3; i++)
351 {
352 if (i < 2)
353 {
Bram Moolenaar823a1652010-05-16 23:02:33 +0200354 hexit = sha256_bytes((char_u *)sha_self_test_msg[i],
Bram Moolenaar80794b12010-06-13 05:20:42 +0200355 (int)STRLEN(sha_self_test_msg[i]),
356 NULL, 0);
Bram Moolenaar823a1652010-05-16 23:02:33 +0200357 STRCPY(output, hexit);
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200358 }
359 else
360 {
Bram Moolenaar55debbe2010-05-23 23:34:36 +0200361 sha256_start(&ctx);
Bram Moolenaar7db5fc82010-05-24 11:59:29 +0200362 vim_memset(buf, 'a', 1000);
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200363 for (j = 0; j < 1000; j++)
364 sha256_update(&ctx, (char_u *)buf, 1000);
365 sha256_finish(&ctx, sha256sum);
366 for (j = 0; j < 32; j++)
367 sprintf(output + j * 2, "%02x", sha256sum[j]);
368 }
369 if (memcmp(output, sha_self_test_vector[i], 64))
370 {
371 failures++;
372 output[sizeof(output) - 1] = '\0';
Bram Moolenaar63d9e732019-12-05 21:10:38 +0100373 // printf("sha256_self_test %d failed %s\n", i, output);
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200374 }
375 }
376 return failures > 0 ? FAIL : OK;
377}
378
379 static unsigned int
Bram Moolenaar764b23c2016-01-30 21:10:09 +0100380get_some_time(void)
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200381{
Bram Moolenaar80794b12010-06-13 05:20:42 +0200382# ifdef HAVE_GETTIMEOFDAY
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200383 struct timeval tv;
384
Bram Moolenaar63d9e732019-12-05 21:10:38 +0100385 // Using usec makes it less predictable.
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200386 gettimeofday(&tv, NULL);
387 return (unsigned int)(tv.tv_sec + tv.tv_usec);
Bram Moolenaar80794b12010-06-13 05:20:42 +0200388# else
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200389 return (unsigned int)time(NULL);
Bram Moolenaar80794b12010-06-13 05:20:42 +0200390# endif
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200391}
392
393/*
Bram Moolenaara8ffcbb2010-06-21 06:15:46 +0200394 * Fill "header[header_len]" with random_data.
395 * Also "salt[salt_len]" when "salt" is not NULL.
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200396 */
397 void
Bram Moolenaar764b23c2016-01-30 21:10:09 +0100398sha2_seed(
399 char_u *header,
400 int header_len,
401 char_u *salt,
402 int salt_len)
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200403{
404 int i;
405 static char_u random_data[1000];
406 char_u sha256sum[32];
407 context_sha256_T ctx;
Bram Moolenaar80794b12010-06-13 05:20:42 +0200408
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200409 srand(get_some_time());
410
411 for (i = 0; i < (int)sizeof(random_data) - 1; i++)
412 random_data[i] = (char_u)((get_some_time() ^ rand()) & 0xff);
Bram Moolenaar55debbe2010-05-23 23:34:36 +0200413 sha256_start(&ctx);
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200414 sha256_update(&ctx, (char_u *)random_data, sizeof(random_data));
415 sha256_finish(&ctx, sha256sum);
416
Bram Moolenaar63d9e732019-12-05 21:10:38 +0100417 // put first block into header.
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200418 for (i = 0; i < header_len; i++)
419 header[i] = sha256sum[i % sizeof(sha256sum)];
Bram Moolenaar80794b12010-06-13 05:20:42 +0200420
Bram Moolenaar63d9e732019-12-05 21:10:38 +0100421 // put remaining block into salt.
Bram Moolenaara8ffcbb2010-06-21 06:15:46 +0200422 if (salt != NULL)
423 for (i = 0; i < salt_len; i++)
424 salt[i] = sha256sum[(i + header_len) % sizeof(sha256sum)];
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200425}
426
Bram Moolenaar63d9e732019-12-05 21:10:38 +0100427#endif // FEAT_CRYPT