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,95 @@
|
|
|
1
|
+
#ifndef _SHA256_H_
|
|
2
|
+
#define _SHA256_H_
|
|
3
|
+
|
|
4
|
+
#include <stddef.h>
|
|
5
|
+
#include <stdint.h>
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* Use #defines in order to avoid namespace collisions with anyone else's
|
|
9
|
+
* SHA256 code (e.g., the code in OpenSSL).
|
|
10
|
+
*/
|
|
11
|
+
#define SHA256_Init libcperciva_SHA256_Init
|
|
12
|
+
#define SHA256_Update libcperciva_SHA256_Update
|
|
13
|
+
#define SHA256_Final libcperciva_SHA256_Final
|
|
14
|
+
#define SHA256_Buf libcperciva_SHA256_Buf
|
|
15
|
+
#define SHA256_CTX libcperciva_SHA256_CTX
|
|
16
|
+
#define HMAC_SHA256_Init libcperciva_HMAC_SHA256_Init
|
|
17
|
+
#define HMAC_SHA256_Update libcperciva_HMAC_SHA256_Update
|
|
18
|
+
#define HMAC_SHA256_Final libcperciva_HMAC_SHA256_Final
|
|
19
|
+
#define HMAC_SHA256_Buf libcperciva_HMAC_SHA256_Buf
|
|
20
|
+
#define HMAC_SHA256_CTX libcperciva_HMAC_SHA256_CTX
|
|
21
|
+
|
|
22
|
+
/* Context structure for SHA256 operations. */
|
|
23
|
+
typedef struct {
|
|
24
|
+
uint32_t state[8];
|
|
25
|
+
uint64_t count;
|
|
26
|
+
uint8_t buf[64];
|
|
27
|
+
} SHA256_CTX;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* SHA256_Init(ctx):
|
|
31
|
+
* Initialize the SHA256 context ${ctx}.
|
|
32
|
+
*/
|
|
33
|
+
void SHA256_Init(SHA256_CTX *);
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* SHA256_Update(ctx, in, len):
|
|
37
|
+
* Input ${len} bytes from ${in} into the SHA256 context ${ctx}.
|
|
38
|
+
*/
|
|
39
|
+
void SHA256_Update(SHA256_CTX *, const void *, size_t);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* SHA256_Final(digest, ctx):
|
|
43
|
+
* Output the SHA256 hash of the data input to the context ${ctx} into the
|
|
44
|
+
* buffer ${digest}.
|
|
45
|
+
*/
|
|
46
|
+
void SHA256_Final(uint8_t[32], SHA256_CTX *);
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* SHA256_Buf(in, len, digest):
|
|
50
|
+
* Compute the SHA256 hash of ${len} bytes from $in} and write it to ${digest}.
|
|
51
|
+
*/
|
|
52
|
+
void SHA256_Buf(const void *, size_t, uint8_t[32]);
|
|
53
|
+
|
|
54
|
+
/* Context structure for HMAC-SHA256 operations. */
|
|
55
|
+
typedef struct {
|
|
56
|
+
SHA256_CTX ictx;
|
|
57
|
+
SHA256_CTX octx;
|
|
58
|
+
} HMAC_SHA256_CTX;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* HMAC_SHA256_Init(ctx, K, Klen):
|
|
62
|
+
* Initialize the HMAC-SHA256 context ${ctx} with ${Klen} bytes of key from
|
|
63
|
+
* ${K}.
|
|
64
|
+
*/
|
|
65
|
+
void HMAC_SHA256_Init(HMAC_SHA256_CTX *, const void *, size_t);
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* HMAC_SHA256_Update(ctx, in, len):
|
|
69
|
+
* Input ${len} bytes from ${in} into the HMAC-SHA256 context ${ctx}.
|
|
70
|
+
*/
|
|
71
|
+
void HMAC_SHA256_Update(HMAC_SHA256_CTX *, const void *, size_t);
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* HMAC_SHA256_Final(digest, ctx):
|
|
75
|
+
* Output the HMAC-SHA256 of the data input to the context ${ctx} into the
|
|
76
|
+
* buffer ${digest}.
|
|
77
|
+
*/
|
|
78
|
+
void HMAC_SHA256_Final(uint8_t[32], HMAC_SHA256_CTX *);
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* HMAC_SHA256_Buf(K, Klen, in, len, digest):
|
|
82
|
+
* Compute the HMAC-SHA256 of ${len} bytes from ${in} using the key ${K} of
|
|
83
|
+
* length ${Klen}, and write the result to ${digest}.
|
|
84
|
+
*/
|
|
85
|
+
void HMAC_SHA256_Buf(const void *, size_t, const void *, size_t, uint8_t[32]);
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
|
|
89
|
+
* Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and
|
|
90
|
+
* write the output to buf. The value dkLen must be at most 32 * (2^32 - 1).
|
|
91
|
+
*/
|
|
92
|
+
void PBKDF2_SHA256(const uint8_t *, size_t, const uint8_t *, size_t,
|
|
93
|
+
uint64_t, uint8_t *, size_t);
|
|
94
|
+
|
|
95
|
+
#endif /* !_SHA256_H_ */
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Should be sourced by `command -p sh mk-h.sh` from within a Makefile
|
|
2
|
+
# Standard output should be written to cpusupport-config.h, which is both a
|
|
3
|
+
# C header file defining CPUSUPPORT_ARCH_FEATURE macros and sourceable sh
|
|
4
|
+
# code which sets CFLAGS_ARCH_FEATURE environment variables.
|
|
5
|
+
feature() {
|
|
6
|
+
ARCH=$1
|
|
7
|
+
FEATURE=$2
|
|
8
|
+
shift 2;
|
|
9
|
+
printf "Checking if compiler supports $ARCH $FEATURE feature..." 1>&2
|
|
10
|
+
for CFLAG in "$@"; do
|
|
11
|
+
if ${CC} ${CFLAGS} -D_POSIX_C_SOURCE=200809L ${CFLAG} \
|
|
12
|
+
cpusupport-$ARCH-$FEATURE.c 2>/dev/null; then
|
|
13
|
+
rm -f a.out
|
|
14
|
+
break;
|
|
15
|
+
fi
|
|
16
|
+
CFLAG=NOTSUPPORTED;
|
|
17
|
+
done
|
|
18
|
+
case $CFLAG in
|
|
19
|
+
NOTSUPPORTED)
|
|
20
|
+
echo " no" 1>&2
|
|
21
|
+
;;
|
|
22
|
+
"")
|
|
23
|
+
echo " yes" 1>&2
|
|
24
|
+
echo "#define CPUSUPPORT_${ARCH}_${FEATURE}"
|
|
25
|
+
;;
|
|
26
|
+
*)
|
|
27
|
+
echo " yes, via $CFLAG" 1>&2
|
|
28
|
+
echo "#define CPUSUPPORT_${ARCH}_${FEATURE}"
|
|
29
|
+
echo "#ifdef cpusupport_dummy"
|
|
30
|
+
echo "export CFLAGS_${ARCH}_${FEATURE}=\"${CFLAG}\""
|
|
31
|
+
echo "#endif"
|
|
32
|
+
;;
|
|
33
|
+
esac
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
feature X86 CPUID ""
|
|
37
|
+
feature X86 AESNI "" "-maes" "-maes -Wno-cast-align" "-maes -Wno-missing-prototypes -Wno-cast-qual"
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#ifndef _CPUSUPPORT_H_
|
|
2
|
+
#define _CPUSUPPORT_H_
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* To enable support for non-portable CPU features at compile time, one or
|
|
6
|
+
* more CPUSUPPORT_ARCH_FEATURE macros should be defined. This can be done
|
|
7
|
+
* directly on the compiler command line; or a file can be created with the
|
|
8
|
+
* necessary #define lines and then -D CPUSUPPORT_CONFIG_FILE=cpuconfig.h
|
|
9
|
+
* (or similar) can be provided to include that file here.
|
|
10
|
+
*/
|
|
11
|
+
#ifdef CPUSUPPORT_CONFIG_FILE
|
|
12
|
+
#include CPUSUPPORT_CONFIG_FILE
|
|
13
|
+
#endif
|
|
14
|
+
|
|
15
|
+
/*
|
|
16
|
+
* The CPUSUPPORT_FEATURE macro declares the necessary variables and
|
|
17
|
+
* functions for detecting CPU feature support at run time. The function
|
|
18
|
+
* defined in the macro acts to cache the result of the ..._detect function
|
|
19
|
+
* using the ..._present and ..._init variables.
|
|
20
|
+
*/
|
|
21
|
+
#define CPUSUPPORT_FEATURE(arch, feature) \
|
|
22
|
+
extern int cpusupport_ ## arch ## _ ## feature ## _present; \
|
|
23
|
+
extern int cpusupport_ ## arch ## _ ## feature ## _init; \
|
|
24
|
+
int cpusupport_ ## arch ## _ ## feature ## _detect(void); \
|
|
25
|
+
\
|
|
26
|
+
static inline int \
|
|
27
|
+
cpusupport_ ## arch ## _ ## feature(void) \
|
|
28
|
+
{ \
|
|
29
|
+
\
|
|
30
|
+
if (cpusupport_ ## arch ## _ ## feature ## _present) \
|
|
31
|
+
return (1); \
|
|
32
|
+
else if (cpusupport_ ## arch ## _ ## feature ## _init) \
|
|
33
|
+
return (0); \
|
|
34
|
+
cpusupport_ ## arch ## _ ## feature ## _present = \
|
|
35
|
+
cpusupport_ ## arch ##_ ## feature ## _detect(); \
|
|
36
|
+
cpusupport_ ## arch ## _ ## feature ## _init = 1; \
|
|
37
|
+
return (cpusupport_ ## arch ## _ ## feature ## _present); \
|
|
38
|
+
} \
|
|
39
|
+
struct cpusupport_ ## arch ## _ ## feature ## _dummy
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* CPUSUPPORT_FEATURE_DECL(arch, feature):
|
|
43
|
+
* Macro which defines variables and provides a function declaration for
|
|
44
|
+
* detecting the presence of "feature" on the "arch" architecture. The
|
|
45
|
+
* function body following this macro expansion must return nonzero if the
|
|
46
|
+
* feature is present, or zero if the feature is not present or the detection
|
|
47
|
+
* fails for any reason.
|
|
48
|
+
*/
|
|
49
|
+
#define CPUSUPPORT_FEATURE_DECL(arch, feature) \
|
|
50
|
+
int cpusupport_ ## arch ## _ ## feature ## _present = 0; \
|
|
51
|
+
int cpusupport_ ## arch ## _ ## feature ## _init = 0; \
|
|
52
|
+
int \
|
|
53
|
+
cpusupport_ ## arch ## _ ## feature ## _detect(void)
|
|
54
|
+
|
|
55
|
+
/*
|
|
56
|
+
* Any features listed here must have associated C files compiled and linked
|
|
57
|
+
* in, since the macro references symbols which must be defined. Projects
|
|
58
|
+
* which do not need to detect certain CPU features may wish to remove lines
|
|
59
|
+
* from this list so that the associated C files can be omitted.
|
|
60
|
+
*/
|
|
61
|
+
CPUSUPPORT_FEATURE(x86, aesni);
|
|
62
|
+
|
|
63
|
+
#endif /* !_CPUSUPPORT_H_ */
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#include "cpusupport.h"
|
|
2
|
+
|
|
3
|
+
#ifdef CPUSUPPORT_X86_CPUID
|
|
4
|
+
#include <cpuid.h>
|
|
5
|
+
#endif
|
|
6
|
+
|
|
7
|
+
#define CPUID_AESNI_BIT (1 << 25)
|
|
8
|
+
|
|
9
|
+
CPUSUPPORT_FEATURE_DECL(x86, aesni)
|
|
10
|
+
{
|
|
11
|
+
#ifdef CPUSUPPORT_X86_CPUID
|
|
12
|
+
unsigned int eax, ebx, ecx, edx;
|
|
13
|
+
|
|
14
|
+
/* Check if CPUID supports the level we need. */
|
|
15
|
+
if (!__get_cpuid(0, &eax, &ebx, &ecx, &edx))
|
|
16
|
+
goto unsupported;
|
|
17
|
+
if (eax < 1)
|
|
18
|
+
goto unsupported;
|
|
19
|
+
|
|
20
|
+
/* Ask about CPU features. */
|
|
21
|
+
if (!__get_cpuid(1, &eax, &ebx, &ecx, &edx))
|
|
22
|
+
goto unsupported;
|
|
23
|
+
|
|
24
|
+
/* Return the relevant feature bit. */
|
|
25
|
+
return (ecx & CPUID_AESNI_BIT);
|
|
26
|
+
|
|
27
|
+
unsupported:
|
|
28
|
+
#endif
|
|
29
|
+
return (0);
|
|
30
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#include <assert.h>
|
|
2
|
+
#include <stdint.h>
|
|
3
|
+
#include <stdlib.h>
|
|
4
|
+
#include <string.h>
|
|
5
|
+
|
|
6
|
+
#include <openssl/aes.h>
|
|
7
|
+
|
|
8
|
+
#include "cpusupport.h"
|
|
9
|
+
#include "crypto_aes_aesni.h"
|
|
10
|
+
#include "insecure_memzero.h"
|
|
11
|
+
#include "warnp.h"
|
|
12
|
+
|
|
13
|
+
#include "crypto_aes.h"
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* This represents either an AES_KEY or a struct crypto_aes_key_aesni; we
|
|
17
|
+
* know which it is based on whether we're using AESNI code or not. As such,
|
|
18
|
+
* it's just an opaque pointer; but declaring it as a named structure type
|
|
19
|
+
* prevents type-mismatch bugs in upstream code.
|
|
20
|
+
*/
|
|
21
|
+
struct crypto_aes_key;
|
|
22
|
+
|
|
23
|
+
#ifdef CPUSUPPORT_X86_AESNI
|
|
24
|
+
/* Test whether OpenSSL and AESNI code produce the same AES ciphertext. */
|
|
25
|
+
static int
|
|
26
|
+
aesnitest(uint8_t ptext[16], uint8_t * key, size_t keylen)
|
|
27
|
+
{
|
|
28
|
+
AES_KEY kexp_openssl;
|
|
29
|
+
void * kexp_aesni;
|
|
30
|
+
uint8_t ctext_openssl[16];
|
|
31
|
+
uint8_t ctext_aesni[16];
|
|
32
|
+
|
|
33
|
+
/* Expand the key. */
|
|
34
|
+
AES_set_encrypt_key(key, keylen * 8, &kexp_openssl);
|
|
35
|
+
if ((kexp_aesni = crypto_aes_key_expand_aesni(key, keylen)) == NULL)
|
|
36
|
+
goto err0;
|
|
37
|
+
|
|
38
|
+
/* Encrypt the block. */
|
|
39
|
+
AES_encrypt(ptext, ctext_openssl, &kexp_openssl);
|
|
40
|
+
crypto_aes_encrypt_block_aesni(ptext, ctext_aesni, kexp_aesni);
|
|
41
|
+
|
|
42
|
+
/* Free the AESNI expanded key. */
|
|
43
|
+
crypto_aes_key_free_aesni(kexp_aesni);
|
|
44
|
+
|
|
45
|
+
/* Do the outputs match? */
|
|
46
|
+
return (memcmp(ctext_openssl, ctext_aesni, 16));
|
|
47
|
+
|
|
48
|
+
err0:
|
|
49
|
+
/* Failure! */
|
|
50
|
+
return (-1);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Should we use AESNI? */
|
|
54
|
+
static int
|
|
55
|
+
useaesni(void)
|
|
56
|
+
{
|
|
57
|
+
static int aesnigood = -1;
|
|
58
|
+
uint8_t key[32];
|
|
59
|
+
uint8_t ptext[16];
|
|
60
|
+
size_t i;
|
|
61
|
+
|
|
62
|
+
/* If we haven't decided which code to use yet, decide now. */
|
|
63
|
+
while (aesnigood == -1) {
|
|
64
|
+
/* Default to OpenSSL. */
|
|
65
|
+
aesnigood = 0;
|
|
66
|
+
|
|
67
|
+
/* If the CPU doesn't claim to support AESNI, stop here. */
|
|
68
|
+
if (!cpusupport_x86_aesni())
|
|
69
|
+
break;
|
|
70
|
+
|
|
71
|
+
/* Test cases: key is 0x00010203..., ptext is 0x00112233... */
|
|
72
|
+
for (i = 0; i < 16; i++)
|
|
73
|
+
ptext[i] = 0x11 * i;
|
|
74
|
+
for (i = 0; i < 32; i++)
|
|
75
|
+
key[i] = i;
|
|
76
|
+
|
|
77
|
+
/* Test that AESNI and OpenSSL produce the same results. */
|
|
78
|
+
if (aesnitest(ptext, key, 16) || aesnitest(ptext, key, 32)) {
|
|
79
|
+
warn0("Disabling AESNI due to failed self-test");
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* AESNI works; use it. */
|
|
84
|
+
aesnigood = 1;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return (aesnigood);
|
|
88
|
+
}
|
|
89
|
+
#endif /* CPUSUPPORT_X86_AESNI */
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* crypto_aes_key_expand(key, len):
|
|
93
|
+
* Expand the ${len}-byte AES key ${key} into a structure which can be passed
|
|
94
|
+
* to crypto_aes_encrypt_block. The length must be 16 or 32.
|
|
95
|
+
*/
|
|
96
|
+
struct crypto_aes_key *
|
|
97
|
+
crypto_aes_key_expand(const uint8_t * key, size_t len)
|
|
98
|
+
{
|
|
99
|
+
AES_KEY * kexp;
|
|
100
|
+
|
|
101
|
+
/* Sanity-check. */
|
|
102
|
+
assert((len == 16) || (len == 32));
|
|
103
|
+
|
|
104
|
+
#ifdef CPUSUPPORT_X86_AESNI
|
|
105
|
+
/* Use AESNI if we can. */
|
|
106
|
+
if (useaesni())
|
|
107
|
+
return (crypto_aes_key_expand_aesni(key, len));
|
|
108
|
+
#endif
|
|
109
|
+
|
|
110
|
+
/* Allocate structure. */
|
|
111
|
+
if ((kexp = malloc(sizeof(AES_KEY))) == NULL)
|
|
112
|
+
goto err0;
|
|
113
|
+
|
|
114
|
+
/* Expand the key. */
|
|
115
|
+
AES_set_encrypt_key(key, len * 8, kexp);
|
|
116
|
+
|
|
117
|
+
/* Success! */
|
|
118
|
+
return ((void *)kexp);
|
|
119
|
+
|
|
120
|
+
err0:
|
|
121
|
+
/* Failure! */
|
|
122
|
+
return (NULL);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* crypto_aes_encrypt_block(in, out, key):
|
|
127
|
+
* Using the expanded AES key ${key}, encrypt the block ${in} and write the
|
|
128
|
+
* resulting ciphertext to ${out}.
|
|
129
|
+
*/
|
|
130
|
+
void
|
|
131
|
+
crypto_aes_encrypt_block(const uint8_t * in, uint8_t * out,
|
|
132
|
+
const struct crypto_aes_key * key)
|
|
133
|
+
{
|
|
134
|
+
|
|
135
|
+
#ifdef CPUSUPPORT_X86_AESNI
|
|
136
|
+
if (useaesni()) {
|
|
137
|
+
crypto_aes_encrypt_block_aesni(in, out, (const void *)key);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
#endif
|
|
141
|
+
|
|
142
|
+
/* Get AES to do the work. */
|
|
143
|
+
AES_encrypt(in, out, (const void *)key);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* crypto_aes_key_free(key):
|
|
148
|
+
* Free the expanded AES key ${key}.
|
|
149
|
+
*/
|
|
150
|
+
void
|
|
151
|
+
crypto_aes_key_free(struct crypto_aes_key * key)
|
|
152
|
+
{
|
|
153
|
+
|
|
154
|
+
#ifdef CPUSUPPORT_X86_AESNI
|
|
155
|
+
if (useaesni()) {
|
|
156
|
+
crypto_aes_key_free_aesni((void *)key);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
#endif
|
|
160
|
+
|
|
161
|
+
/* Attempt to zero the expanded key. */
|
|
162
|
+
insecure_memzero(key, sizeof(AES_KEY));
|
|
163
|
+
|
|
164
|
+
/* Free the key. */
|
|
165
|
+
free(key);
|
|
166
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#ifndef _CRYPTO_AES_H_
|
|
2
|
+
#define _CRYPTO_AES_H_
|
|
3
|
+
|
|
4
|
+
#include <stddef.h>
|
|
5
|
+
#include <stdint.h>
|
|
6
|
+
|
|
7
|
+
/* Opaque structure. */
|
|
8
|
+
struct crypto_aes_key;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* crypto_aes_key_expand(key, len):
|
|
12
|
+
* Expand the ${len}-byte AES key ${key} into a structure which can be passed
|
|
13
|
+
* to crypto_aes_encrypt_block. The length must be 16 or 32.
|
|
14
|
+
*/
|
|
15
|
+
struct crypto_aes_key * crypto_aes_key_expand(const uint8_t *, size_t);
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* crypto_aes_encrypt_block(in, out, key):
|
|
19
|
+
* Using the expanded AES key ${key}, encrypt the block ${in} and write the
|
|
20
|
+
* resulting ciphertext to ${out}.
|
|
21
|
+
*/
|
|
22
|
+
void crypto_aes_encrypt_block(const uint8_t *, uint8_t *,
|
|
23
|
+
const struct crypto_aes_key *);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* crypto_aes_key_free(key):
|
|
27
|
+
* Free the expanded AES key ${key}.
|
|
28
|
+
*/
|
|
29
|
+
void crypto_aes_key_free(struct crypto_aes_key *);
|
|
30
|
+
|
|
31
|
+
#endif /* !_CRYPTO_AES_H_ */
|