spiped 0.0.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.
- checksums.yaml +7 -0
- data/ext/spiped/extconf.rb +3 -0
- data/ext/spiped/spiped-source/BUILDING +46 -0
- data/ext/spiped/spiped-source/CHANGELOG +44 -0
- data/ext/spiped/spiped-source/COPYRIGHT +33 -0
- data/ext/spiped/spiped-source/Makefile +47 -0
- data/ext/spiped/spiped-source/Makefile.POSIX +27 -0
- data/ext/spiped/spiped-source/Makefile.inc +20 -0
- data/ext/spiped/spiped-source/Makefile.prog +23 -0
- data/ext/spiped/spiped-source/POSIX/README +10 -0
- data/ext/spiped/spiped-source/POSIX/posix-cflags.sh +10 -0
- data/ext/spiped/spiped-source/POSIX/posix-clock_realtime.c +3 -0
- data/ext/spiped/spiped-source/POSIX/posix-l.c +1 -0
- data/ext/spiped/spiped-source/POSIX/posix-l.sh +14 -0
- data/ext/spiped/spiped-source/POSIX/posix-msg_nosignal.c +3 -0
- data/ext/spiped/spiped-source/README +198 -0
- data/ext/spiped/spiped-source/STYLE +151 -0
- data/ext/spiped/spiped-source/lib/dnsthread/dnsthread.c +464 -0
- data/ext/spiped/spiped-source/lib/dnsthread/dnsthread.h +45 -0
- data/ext/spiped/spiped-source/libcperciva/alg/sha256.c +442 -0
- data/ext/spiped/spiped-source/libcperciva/alg/sha256.h +95 -0
- data/ext/spiped/spiped-source/libcperciva/cpusupport/Build/cpusupport-X86-AESNI.c +13 -0
- data/ext/spiped/spiped-source/libcperciva/cpusupport/Build/cpusupport-X86-CPUID.c +8 -0
- data/ext/spiped/spiped-source/libcperciva/cpusupport/Build/cpusupport.sh +37 -0
- data/ext/spiped/spiped-source/libcperciva/cpusupport/cpusupport.h +63 -0
- data/ext/spiped/spiped-source/libcperciva/cpusupport/cpusupport_x86_aesni.c +30 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aes.c +166 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aes.h +31 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aes_aesni.c +229 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aes_aesni.h +31 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aesctr.c +124 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aesctr.h +41 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_dh.c +293 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_dh.h +43 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_dh_group14.c +46 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_dh_group14.h +9 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_entropy.c +215 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_entropy.h +14 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_verify_bytes.c +21 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_verify_bytes.h +14 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/elasticarray.c +276 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/elasticarray.h +167 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/mpool.h +85 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/ptrheap.c +334 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/ptrheap.h +89 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/timerqueue.c +241 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/timerqueue.h +60 -0
- data/ext/spiped/spiped-source/libcperciva/events/events.c +203 -0
- data/ext/spiped/spiped-source/libcperciva/events/events.h +106 -0
- data/ext/spiped/spiped-source/libcperciva/events/events_immediate.c +149 -0
- data/ext/spiped/spiped-source/libcperciva/events/events_internal.h +95 -0
- data/ext/spiped/spiped-source/libcperciva/events/events_network.c +347 -0
- data/ext/spiped/spiped-source/libcperciva/events/events_network_selectstats.c +106 -0
- data/ext/spiped/spiped-source/libcperciva/events/events_timer.c +273 -0
- data/ext/spiped/spiped-source/libcperciva/network/network.h +95 -0
- data/ext/spiped/spiped-source/libcperciva/network/network_accept.c +103 -0
- data/ext/spiped/spiped-source/libcperciva/network/network_connect.c +258 -0
- data/ext/spiped/spiped-source/libcperciva/network/network_read.c +155 -0
- data/ext/spiped/spiped-source/libcperciva/network/network_write.c +188 -0
- data/ext/spiped/spiped-source/libcperciva/util/asprintf.c +49 -0
- data/ext/spiped/spiped-source/libcperciva/util/asprintf.h +16 -0
- data/ext/spiped/spiped-source/libcperciva/util/daemonize.c +134 -0
- data/ext/spiped/spiped-source/libcperciva/util/daemonize.h +10 -0
- data/ext/spiped/spiped-source/libcperciva/util/entropy.c +76 -0
- data/ext/spiped/spiped-source/libcperciva/util/entropy.h +13 -0
- data/ext/spiped/spiped-source/libcperciva/util/imalloc.h +33 -0
- data/ext/spiped/spiped-source/libcperciva/util/insecure_memzero.c +19 -0
- data/ext/spiped/spiped-source/libcperciva/util/insecure_memzero.h +33 -0
- data/ext/spiped/spiped-source/libcperciva/util/monoclock.c +52 -0
- data/ext/spiped/spiped-source/libcperciva/util/monoclock.h +14 -0
- data/ext/spiped/spiped-source/libcperciva/util/noeintr.c +54 -0
- data/ext/spiped/spiped-source/libcperciva/util/noeintr.h +14 -0
- data/ext/spiped/spiped-source/libcperciva/util/sock.c +472 -0
- data/ext/spiped/spiped-source/libcperciva/util/sock.h +56 -0
- data/ext/spiped/spiped-source/libcperciva/util/sock_internal.h +14 -0
- data/ext/spiped/spiped-source/libcperciva/util/sock_util.c +271 -0
- data/ext/spiped/spiped-source/libcperciva/util/sock_util.h +51 -0
- data/ext/spiped/spiped-source/libcperciva/util/sysendian.h +146 -0
- data/ext/spiped/spiped-source/libcperciva/util/warnp.c +76 -0
- data/ext/spiped/spiped-source/libcperciva/util/warnp.h +59 -0
- data/ext/spiped/spiped-source/proto/proto_conn.c +362 -0
- data/ext/spiped/spiped-source/proto/proto_conn.h +25 -0
- data/ext/spiped/spiped-source/proto/proto_crypt.c +396 -0
- data/ext/spiped/spiped-source/proto/proto_crypt.h +102 -0
- data/ext/spiped/spiped-source/proto/proto_handshake.c +330 -0
- data/ext/spiped/spiped-source/proto/proto_handshake.h +30 -0
- data/ext/spiped/spiped-source/proto/proto_pipe.c +202 -0
- data/ext/spiped/spiped-source/proto/proto_pipe.h +23 -0
- data/ext/spiped/spiped-source/spipe/Makefile +90 -0
- data/ext/spiped/spiped-source/spipe/README +24 -0
- data/ext/spiped/spiped-source/spipe/main.c +178 -0
- data/ext/spiped/spiped-source/spipe/pushbits.c +101 -0
- data/ext/spiped/spiped-source/spipe/pushbits.h +10 -0
- data/ext/spiped/spiped-source/spipe/spipe.1 +60 -0
- data/ext/spiped/spiped-source/spiped/Makefile +98 -0
- data/ext/spiped/spiped-source/spiped/README +62 -0
- data/ext/spiped/spiped-source/spiped/dispatch.c +214 -0
- data/ext/spiped/spiped-source/spiped/dispatch.h +27 -0
- data/ext/spiped/spiped-source/spiped/main.c +267 -0
- data/ext/spiped/spiped-source/spiped/spiped.1 +112 -0
- data/lib/spiped.rb +3 -0
- metadata +143 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#ifndef _DNSTHREAD_H_
|
|
2
|
+
#define _DNSTHREAD_H_
|
|
3
|
+
|
|
4
|
+
/* Opaque address structure. */
|
|
5
|
+
struct sock_addr;
|
|
6
|
+
|
|
7
|
+
/* Opaque thread token. */
|
|
8
|
+
typedef struct dnsthread_internal * DNSTHREAD;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* dnsthread_spawn(void):
|
|
12
|
+
* Spawn a thread for performing address resolution. Return a token which can
|
|
13
|
+
* be passed to dnsthread_resolveone and dnsthread_kill.
|
|
14
|
+
*/
|
|
15
|
+
DNSTHREAD dnsthread_spawn(void);
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* dnsthread_resolveone(T, addr, callback, cookie):
|
|
19
|
+
* Using the thread for which ${T} was returned by dnsthread_spawn, resolve
|
|
20
|
+
* the address ${addr}, which must be in one of the forms accepted by the
|
|
21
|
+
* sock_resolve function. If ${T} is already resolving an address, fail with
|
|
22
|
+
* EALREADY. Upon completion, invoke ${callback}(${cookie}, sas), where
|
|
23
|
+
* ${sas} is a NULL-terminated array of pointers to sock_addr structures or
|
|
24
|
+
* NULL on resolution failure.
|
|
25
|
+
*/
|
|
26
|
+
int dnsthread_resolveone(DNSTHREAD, const char *,
|
|
27
|
+
int (*)(void *, struct sock_addr **), void *);
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* dnsthread_kill(T):
|
|
31
|
+
* Instruct an address resolution thread to die. If the thread does not have
|
|
32
|
+
* an address resolution operation currently pending, wait for the thread to
|
|
33
|
+
* die before returning.
|
|
34
|
+
*/
|
|
35
|
+
int dnsthread_kill(DNSTHREAD);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* dnsthread_resolve(addr, callback, cookie):
|
|
39
|
+
* Perform a non-blocking address resolution of ${addr}. This function may
|
|
40
|
+
* spawn a thread internally.
|
|
41
|
+
*/
|
|
42
|
+
int dnsthread_resolve(const char *,
|
|
43
|
+
int (*)(void *, struct sock_addr **), void *);
|
|
44
|
+
|
|
45
|
+
#endif /* !_DNSTHREAD_H_ */
|
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
#include <assert.h>
|
|
2
|
+
#include <stdint.h>
|
|
3
|
+
#include <string.h>
|
|
4
|
+
|
|
5
|
+
#include "insecure_memzero.h"
|
|
6
|
+
#include "sysendian.h"
|
|
7
|
+
|
|
8
|
+
#include "sha256.h"
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* Encode a length len/4 vector of (uint32_t) into a length len vector of
|
|
12
|
+
* (uint8_t) in big-endian form. Assumes len is a multiple of 4.
|
|
13
|
+
*/
|
|
14
|
+
static void
|
|
15
|
+
be32enc_vect(uint8_t * dst, const uint32_t * src, size_t len)
|
|
16
|
+
{
|
|
17
|
+
size_t i;
|
|
18
|
+
|
|
19
|
+
/* Sanity-check. */
|
|
20
|
+
assert(len % 4 == 0);
|
|
21
|
+
|
|
22
|
+
/* Encode vector, one word at a time. */
|
|
23
|
+
for (i = 0; i < len / 4; i++)
|
|
24
|
+
be32enc(dst + i * 4, src[i]);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
* Decode a big-endian length len vector of (uint8_t) into a length
|
|
29
|
+
* len/4 vector of (uint32_t). Assumes len is a multiple of 4.
|
|
30
|
+
*/
|
|
31
|
+
static void
|
|
32
|
+
be32dec_vect(uint32_t * dst, const uint8_t * src, size_t len)
|
|
33
|
+
{
|
|
34
|
+
size_t i;
|
|
35
|
+
|
|
36
|
+
/* Sanity-check. */
|
|
37
|
+
assert(len % 4 == 0);
|
|
38
|
+
|
|
39
|
+
/* Decode vector, one word at a time. */
|
|
40
|
+
for (i = 0; i < len / 4; i++)
|
|
41
|
+
dst[i] = be32dec(src + i * 4);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Elementary functions used by SHA256 */
|
|
45
|
+
#define Ch(x, y, z) ((x & (y ^ z)) ^ z)
|
|
46
|
+
#define Maj(x, y, z) ((x & (y | z)) | (y & z))
|
|
47
|
+
#define SHR(x, n) (x >> n)
|
|
48
|
+
#define ROTR(x, n) ((x >> n) | (x << (32 - n)))
|
|
49
|
+
#define S0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
|
|
50
|
+
#define S1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
|
|
51
|
+
#define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
|
|
52
|
+
#define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
|
|
53
|
+
|
|
54
|
+
/* SHA256 round function */
|
|
55
|
+
#define RND(a, b, c, d, e, f, g, h, k) \
|
|
56
|
+
t0 = h + S1(e) + Ch(e, f, g) + k; \
|
|
57
|
+
t1 = S0(a) + Maj(a, b, c); \
|
|
58
|
+
d += t0; \
|
|
59
|
+
h = t0 + t1;
|
|
60
|
+
|
|
61
|
+
/* Adjusted round function for rotating state */
|
|
62
|
+
#define RNDr(S, W, i, k) \
|
|
63
|
+
RND(S[(64 - i) % 8], S[(65 - i) % 8], \
|
|
64
|
+
S[(66 - i) % 8], S[(67 - i) % 8], \
|
|
65
|
+
S[(68 - i) % 8], S[(69 - i) % 8], \
|
|
66
|
+
S[(70 - i) % 8], S[(71 - i) % 8], \
|
|
67
|
+
W[i] + k)
|
|
68
|
+
|
|
69
|
+
/*
|
|
70
|
+
* SHA256 block compression function. The 256-bit state is transformed via
|
|
71
|
+
* the 512-bit input block to produce a new state.
|
|
72
|
+
*/
|
|
73
|
+
static void
|
|
74
|
+
SHA256_Transform(uint32_t * state, const uint8_t block[64])
|
|
75
|
+
{
|
|
76
|
+
uint32_t W[64];
|
|
77
|
+
uint32_t S[8];
|
|
78
|
+
uint32_t t0, t1;
|
|
79
|
+
int i;
|
|
80
|
+
|
|
81
|
+
/* 1. Prepare message schedule W. */
|
|
82
|
+
be32dec_vect(W, block, 64);
|
|
83
|
+
for (i = 16; i < 64; i++)
|
|
84
|
+
W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
|
|
85
|
+
|
|
86
|
+
/* 2. Initialize working variables. */
|
|
87
|
+
memcpy(S, state, 32);
|
|
88
|
+
|
|
89
|
+
/* 3. Mix. */
|
|
90
|
+
RNDr(S, W, 0, 0x428a2f98);
|
|
91
|
+
RNDr(S, W, 1, 0x71374491);
|
|
92
|
+
RNDr(S, W, 2, 0xb5c0fbcf);
|
|
93
|
+
RNDr(S, W, 3, 0xe9b5dba5);
|
|
94
|
+
RNDr(S, W, 4, 0x3956c25b);
|
|
95
|
+
RNDr(S, W, 5, 0x59f111f1);
|
|
96
|
+
RNDr(S, W, 6, 0x923f82a4);
|
|
97
|
+
RNDr(S, W, 7, 0xab1c5ed5);
|
|
98
|
+
RNDr(S, W, 8, 0xd807aa98);
|
|
99
|
+
RNDr(S, W, 9, 0x12835b01);
|
|
100
|
+
RNDr(S, W, 10, 0x243185be);
|
|
101
|
+
RNDr(S, W, 11, 0x550c7dc3);
|
|
102
|
+
RNDr(S, W, 12, 0x72be5d74);
|
|
103
|
+
RNDr(S, W, 13, 0x80deb1fe);
|
|
104
|
+
RNDr(S, W, 14, 0x9bdc06a7);
|
|
105
|
+
RNDr(S, W, 15, 0xc19bf174);
|
|
106
|
+
RNDr(S, W, 16, 0xe49b69c1);
|
|
107
|
+
RNDr(S, W, 17, 0xefbe4786);
|
|
108
|
+
RNDr(S, W, 18, 0x0fc19dc6);
|
|
109
|
+
RNDr(S, W, 19, 0x240ca1cc);
|
|
110
|
+
RNDr(S, W, 20, 0x2de92c6f);
|
|
111
|
+
RNDr(S, W, 21, 0x4a7484aa);
|
|
112
|
+
RNDr(S, W, 22, 0x5cb0a9dc);
|
|
113
|
+
RNDr(S, W, 23, 0x76f988da);
|
|
114
|
+
RNDr(S, W, 24, 0x983e5152);
|
|
115
|
+
RNDr(S, W, 25, 0xa831c66d);
|
|
116
|
+
RNDr(S, W, 26, 0xb00327c8);
|
|
117
|
+
RNDr(S, W, 27, 0xbf597fc7);
|
|
118
|
+
RNDr(S, W, 28, 0xc6e00bf3);
|
|
119
|
+
RNDr(S, W, 29, 0xd5a79147);
|
|
120
|
+
RNDr(S, W, 30, 0x06ca6351);
|
|
121
|
+
RNDr(S, W, 31, 0x14292967);
|
|
122
|
+
RNDr(S, W, 32, 0x27b70a85);
|
|
123
|
+
RNDr(S, W, 33, 0x2e1b2138);
|
|
124
|
+
RNDr(S, W, 34, 0x4d2c6dfc);
|
|
125
|
+
RNDr(S, W, 35, 0x53380d13);
|
|
126
|
+
RNDr(S, W, 36, 0x650a7354);
|
|
127
|
+
RNDr(S, W, 37, 0x766a0abb);
|
|
128
|
+
RNDr(S, W, 38, 0x81c2c92e);
|
|
129
|
+
RNDr(S, W, 39, 0x92722c85);
|
|
130
|
+
RNDr(S, W, 40, 0xa2bfe8a1);
|
|
131
|
+
RNDr(S, W, 41, 0xa81a664b);
|
|
132
|
+
RNDr(S, W, 42, 0xc24b8b70);
|
|
133
|
+
RNDr(S, W, 43, 0xc76c51a3);
|
|
134
|
+
RNDr(S, W, 44, 0xd192e819);
|
|
135
|
+
RNDr(S, W, 45, 0xd6990624);
|
|
136
|
+
RNDr(S, W, 46, 0xf40e3585);
|
|
137
|
+
RNDr(S, W, 47, 0x106aa070);
|
|
138
|
+
RNDr(S, W, 48, 0x19a4c116);
|
|
139
|
+
RNDr(S, W, 49, 0x1e376c08);
|
|
140
|
+
RNDr(S, W, 50, 0x2748774c);
|
|
141
|
+
RNDr(S, W, 51, 0x34b0bcb5);
|
|
142
|
+
RNDr(S, W, 52, 0x391c0cb3);
|
|
143
|
+
RNDr(S, W, 53, 0x4ed8aa4a);
|
|
144
|
+
RNDr(S, W, 54, 0x5b9cca4f);
|
|
145
|
+
RNDr(S, W, 55, 0x682e6ff3);
|
|
146
|
+
RNDr(S, W, 56, 0x748f82ee);
|
|
147
|
+
RNDr(S, W, 57, 0x78a5636f);
|
|
148
|
+
RNDr(S, W, 58, 0x84c87814);
|
|
149
|
+
RNDr(S, W, 59, 0x8cc70208);
|
|
150
|
+
RNDr(S, W, 60, 0x90befffa);
|
|
151
|
+
RNDr(S, W, 61, 0xa4506ceb);
|
|
152
|
+
RNDr(S, W, 62, 0xbef9a3f7);
|
|
153
|
+
RNDr(S, W, 63, 0xc67178f2);
|
|
154
|
+
|
|
155
|
+
/* 4. Mix local working variables into global state. */
|
|
156
|
+
for (i = 0; i < 8; i++)
|
|
157
|
+
state[i] += S[i];
|
|
158
|
+
|
|
159
|
+
/* Clean the stack. */
|
|
160
|
+
insecure_memzero(W, 256);
|
|
161
|
+
insecure_memzero(S, 32);
|
|
162
|
+
insecure_memzero(&t0, sizeof(uint32_t));
|
|
163
|
+
insecure_memzero(&t1, sizeof(uint32_t));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
static uint8_t PAD[64] = {
|
|
167
|
+
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
168
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
169
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
170
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
/* Add padding and terminating bit-count. */
|
|
174
|
+
static void
|
|
175
|
+
SHA256_Pad(SHA256_CTX * ctx)
|
|
176
|
+
{
|
|
177
|
+
uint8_t len[8];
|
|
178
|
+
uint32_t r, plen;
|
|
179
|
+
|
|
180
|
+
/*
|
|
181
|
+
* Convert length to a vector of bytes -- we do this now rather
|
|
182
|
+
* than later because the length will change after we pad.
|
|
183
|
+
*/
|
|
184
|
+
be64enc(len, ctx->count);
|
|
185
|
+
|
|
186
|
+
/* Add 1--64 bytes so that the resulting length is 56 mod 64. */
|
|
187
|
+
r = (ctx->count >> 3) & 0x3f;
|
|
188
|
+
plen = (r < 56) ? (56 - r) : (120 - r);
|
|
189
|
+
SHA256_Update(ctx, PAD, (size_t)plen);
|
|
190
|
+
|
|
191
|
+
/* Add the terminating bit-count. */
|
|
192
|
+
SHA256_Update(ctx, len, 8);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* Magic initialization constants. */
|
|
196
|
+
static const uint32_t initstate[8] = {
|
|
197
|
+
0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
|
|
198
|
+
0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* SHA256_Init(ctx):
|
|
203
|
+
* Initialize the SHA256 context ${ctx}.
|
|
204
|
+
*/
|
|
205
|
+
void
|
|
206
|
+
SHA256_Init(SHA256_CTX * ctx)
|
|
207
|
+
{
|
|
208
|
+
|
|
209
|
+
/* Zero bits processed so far. */
|
|
210
|
+
ctx->count = 0;
|
|
211
|
+
|
|
212
|
+
/* Initialize state. */
|
|
213
|
+
memcpy(ctx->state, initstate, sizeof(initstate));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* SHA256_Update(ctx, in, len):
|
|
218
|
+
* Input ${len} bytes from ${in} into the SHA256 context ${ctx}.
|
|
219
|
+
*/
|
|
220
|
+
void
|
|
221
|
+
SHA256_Update(SHA256_CTX * ctx, const void * in, size_t len)
|
|
222
|
+
{
|
|
223
|
+
uint32_t r;
|
|
224
|
+
const uint8_t * src = in;
|
|
225
|
+
|
|
226
|
+
/* Return immediately if we have nothing to do. */
|
|
227
|
+
if (len == 0)
|
|
228
|
+
return;
|
|
229
|
+
|
|
230
|
+
/* Number of bytes left in the buffer from previous updates. */
|
|
231
|
+
r = (ctx->count >> 3) & 0x3f;
|
|
232
|
+
|
|
233
|
+
/* Update number of bits. */
|
|
234
|
+
ctx->count += (uint64_t)(len) << 3;
|
|
235
|
+
|
|
236
|
+
/* Handle the case where we don't need to perform any transforms. */
|
|
237
|
+
if (len < 64 - r) {
|
|
238
|
+
memcpy(&ctx->buf[r], src, len);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* Finish the current block. */
|
|
243
|
+
memcpy(&ctx->buf[r], src, 64 - r);
|
|
244
|
+
SHA256_Transform(ctx->state, ctx->buf);
|
|
245
|
+
src += 64 - r;
|
|
246
|
+
len -= 64 - r;
|
|
247
|
+
|
|
248
|
+
/* Perform complete blocks. */
|
|
249
|
+
while (len >= 64) {
|
|
250
|
+
SHA256_Transform(ctx->state, src);
|
|
251
|
+
src += 64;
|
|
252
|
+
len -= 64;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* Copy left over data into buffer. */
|
|
256
|
+
memcpy(ctx->buf, src, len);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* SHA256_Final(digest, ctx):
|
|
261
|
+
* Output the SHA256 hash of the data input to the context ${ctx} into the
|
|
262
|
+
* buffer ${digest}.
|
|
263
|
+
*/
|
|
264
|
+
void
|
|
265
|
+
SHA256_Final(uint8_t digest[32], SHA256_CTX * ctx)
|
|
266
|
+
{
|
|
267
|
+
|
|
268
|
+
/* Add padding. */
|
|
269
|
+
SHA256_Pad(ctx);
|
|
270
|
+
|
|
271
|
+
/* Write the hash. */
|
|
272
|
+
be32enc_vect(digest, ctx->state, 32);
|
|
273
|
+
|
|
274
|
+
/* Clear the context state. */
|
|
275
|
+
insecure_memzero(ctx, sizeof(SHA256_CTX));
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* SHA256_Buf(in, len, digest):
|
|
280
|
+
* Compute the SHA256 hash of ${len} bytes from $in} and write it to ${digest}.
|
|
281
|
+
*/
|
|
282
|
+
void
|
|
283
|
+
SHA256_Buf(const void * in, size_t len, uint8_t digest[32])
|
|
284
|
+
{
|
|
285
|
+
SHA256_CTX ctx;
|
|
286
|
+
|
|
287
|
+
SHA256_Init(&ctx);
|
|
288
|
+
SHA256_Update(&ctx, in, len);
|
|
289
|
+
SHA256_Final(digest, &ctx);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* HMAC_SHA256_Init(ctx, K, Klen):
|
|
294
|
+
* Initialize the HMAC-SHA256 context ${ctx} with ${Klen} bytes of key from
|
|
295
|
+
* ${K}.
|
|
296
|
+
*/
|
|
297
|
+
void
|
|
298
|
+
HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen)
|
|
299
|
+
{
|
|
300
|
+
uint8_t pad[64];
|
|
301
|
+
uint8_t khash[32];
|
|
302
|
+
const uint8_t * K = _K;
|
|
303
|
+
size_t i;
|
|
304
|
+
|
|
305
|
+
/* If Klen > 64, the key is really SHA256(K). */
|
|
306
|
+
if (Klen > 64) {
|
|
307
|
+
SHA256_Init(&ctx->ictx);
|
|
308
|
+
SHA256_Update(&ctx->ictx, K, Klen);
|
|
309
|
+
SHA256_Final(khash, &ctx->ictx);
|
|
310
|
+
K = khash;
|
|
311
|
+
Klen = 32;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/* Inner SHA256 operation is SHA256(K xor [block of 0x36] || data). */
|
|
315
|
+
SHA256_Init(&ctx->ictx);
|
|
316
|
+
memset(pad, 0x36, 64);
|
|
317
|
+
for (i = 0; i < Klen; i++)
|
|
318
|
+
pad[i] ^= K[i];
|
|
319
|
+
SHA256_Update(&ctx->ictx, pad, 64);
|
|
320
|
+
|
|
321
|
+
/* Outer SHA256 operation is SHA256(K xor [block of 0x5c] || hash). */
|
|
322
|
+
SHA256_Init(&ctx->octx);
|
|
323
|
+
memset(pad, 0x5c, 64);
|
|
324
|
+
for (i = 0; i < Klen; i++)
|
|
325
|
+
pad[i] ^= K[i];
|
|
326
|
+
SHA256_Update(&ctx->octx, pad, 64);
|
|
327
|
+
|
|
328
|
+
/* Clean the stack. */
|
|
329
|
+
insecure_memzero(khash, 32);
|
|
330
|
+
insecure_memzero(pad, 64);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* HMAC_SHA256_Update(ctx, in, len):
|
|
335
|
+
* Input ${len} bytes from ${in} into the HMAC-SHA256 context ${ctx}.
|
|
336
|
+
*/
|
|
337
|
+
void
|
|
338
|
+
HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void * in, size_t len)
|
|
339
|
+
{
|
|
340
|
+
|
|
341
|
+
/* Feed data to the inner SHA256 operation. */
|
|
342
|
+
SHA256_Update(&ctx->ictx, in, len);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* HMAC_SHA256_Final(digest, ctx):
|
|
347
|
+
* Output the HMAC-SHA256 of the data input to the context ${ctx} into the
|
|
348
|
+
* buffer ${digest}.
|
|
349
|
+
*/
|
|
350
|
+
void
|
|
351
|
+
HMAC_SHA256_Final(uint8_t digest[32], HMAC_SHA256_CTX * ctx)
|
|
352
|
+
{
|
|
353
|
+
uint8_t ihash[32];
|
|
354
|
+
|
|
355
|
+
/* Finish the inner SHA256 operation. */
|
|
356
|
+
SHA256_Final(ihash, &ctx->ictx);
|
|
357
|
+
|
|
358
|
+
/* Feed the inner hash to the outer SHA256 operation. */
|
|
359
|
+
SHA256_Update(&ctx->octx, ihash, 32);
|
|
360
|
+
|
|
361
|
+
/* Finish the outer SHA256 operation. */
|
|
362
|
+
SHA256_Final(digest, &ctx->octx);
|
|
363
|
+
|
|
364
|
+
/* Clean the stack. */
|
|
365
|
+
insecure_memzero(ihash, 32);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* HMAC_SHA256_Buf(K, Klen, in, len, digest):
|
|
370
|
+
* Compute the HMAC-SHA256 of ${len} bytes from ${in} using the key ${K} of
|
|
371
|
+
* length ${Klen}, and write the result to ${digest}.
|
|
372
|
+
*/
|
|
373
|
+
void
|
|
374
|
+
HMAC_SHA256_Buf(const void * K, size_t Klen, const void * in, size_t len,
|
|
375
|
+
uint8_t digest[32])
|
|
376
|
+
{
|
|
377
|
+
HMAC_SHA256_CTX ctx;
|
|
378
|
+
|
|
379
|
+
HMAC_SHA256_Init(&ctx, K, Klen);
|
|
380
|
+
HMAC_SHA256_Update(&ctx, in, len);
|
|
381
|
+
HMAC_SHA256_Final(digest, &ctx);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
|
|
386
|
+
* Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and
|
|
387
|
+
* write the output to buf. The value dkLen must be at most 32 * (2^32 - 1).
|
|
388
|
+
*/
|
|
389
|
+
void
|
|
390
|
+
PBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,
|
|
391
|
+
size_t saltlen, uint64_t c, uint8_t * buf, size_t dkLen)
|
|
392
|
+
{
|
|
393
|
+
HMAC_SHA256_CTX PShctx, hctx;
|
|
394
|
+
size_t i;
|
|
395
|
+
uint8_t ivec[4];
|
|
396
|
+
uint8_t U[32];
|
|
397
|
+
uint8_t T[32];
|
|
398
|
+
uint64_t j;
|
|
399
|
+
int k;
|
|
400
|
+
size_t clen;
|
|
401
|
+
|
|
402
|
+
/* Sanity-check. */
|
|
403
|
+
assert(dkLen <= 32 * (size_t)(UINT32_MAX));
|
|
404
|
+
|
|
405
|
+
/* Compute HMAC state after processing P and S. */
|
|
406
|
+
HMAC_SHA256_Init(&PShctx, passwd, passwdlen);
|
|
407
|
+
HMAC_SHA256_Update(&PShctx, salt, saltlen);
|
|
408
|
+
|
|
409
|
+
/* Iterate through the blocks. */
|
|
410
|
+
for (i = 0; i * 32 < dkLen; i++) {
|
|
411
|
+
/* Generate INT(i + 1). */
|
|
412
|
+
be32enc(ivec, (uint32_t)(i + 1));
|
|
413
|
+
|
|
414
|
+
/* Compute U_1 = PRF(P, S || INT(i)). */
|
|
415
|
+
memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX));
|
|
416
|
+
HMAC_SHA256_Update(&hctx, ivec, 4);
|
|
417
|
+
HMAC_SHA256_Final(U, &hctx);
|
|
418
|
+
|
|
419
|
+
/* T_i = U_1 ... */
|
|
420
|
+
memcpy(T, U, 32);
|
|
421
|
+
|
|
422
|
+
for (j = 2; j <= c; j++) {
|
|
423
|
+
/* Compute U_j. */
|
|
424
|
+
HMAC_SHA256_Init(&hctx, passwd, passwdlen);
|
|
425
|
+
HMAC_SHA256_Update(&hctx, U, 32);
|
|
426
|
+
HMAC_SHA256_Final(U, &hctx);
|
|
427
|
+
|
|
428
|
+
/* ... xor U_j ... */
|
|
429
|
+
for (k = 0; k < 32; k++)
|
|
430
|
+
T[k] ^= U[k];
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/* Copy as many bytes as necessary into buf. */
|
|
434
|
+
clen = dkLen - i * 32;
|
|
435
|
+
if (clen > 32)
|
|
436
|
+
clen = 32;
|
|
437
|
+
memcpy(&buf[i * 32], T, clen);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/* Clean PShctx, since we never called _Final on it. */
|
|
441
|
+
insecure_memzero(&PShctx, sizeof(HMAC_SHA256_CTX));
|
|
442
|
+
}
|