diff --git a/builds/msvc/vs2010/libsodium/libsodium.vcxproj b/builds/msvc/vs2010/libsodium/libsodium.vcxproj
index 1c91ec22..5495556c 100644
--- a/builds/msvc/vs2010/libsodium/libsodium.vcxproj
+++ b/builds/msvc/vs2010/libsodium/libsodium.vcxproj
@@ -93,7 +93,7 @@
-
+
diff --git a/builds/msvc/vs2010/libsodium/libsodium.vcxproj.filters b/builds/msvc/vs2010/libsodium/libsodium.vcxproj.filters
index c650cb31..c4348161 100644
--- a/builds/msvc/vs2010/libsodium/libsodium.vcxproj.filters
+++ b/builds/msvc/vs2010/libsodium/libsodium.vcxproj.filters
@@ -961,7 +961,7 @@
src\crypto_scalarmult\curve25519\ref10
-
+
src\crypto_stream\chacha20
diff --git a/builds/msvc/vs2012/libsodium/libsodium.vcxproj b/builds/msvc/vs2012/libsodium/libsodium.vcxproj
index 316bf6f4..eb5ee848 100644
--- a/builds/msvc/vs2012/libsodium/libsodium.vcxproj
+++ b/builds/msvc/vs2012/libsodium/libsodium.vcxproj
@@ -93,7 +93,7 @@
-
+
diff --git a/builds/msvc/vs2012/libsodium/libsodium.vcxproj.filters b/builds/msvc/vs2012/libsodium/libsodium.vcxproj.filters
index dc3b222e..c48991eb 100644
--- a/builds/msvc/vs2012/libsodium/libsodium.vcxproj.filters
+++ b/builds/msvc/vs2012/libsodium/libsodium.vcxproj.filters
@@ -961,7 +961,7 @@
src\crypto_scalarmult\curve25519\ref10
-
+
src\crypto_stream\chacha20
diff --git a/builds/msvc/vs2013/libsodium/libsodium.vcxproj b/builds/msvc/vs2013/libsodium/libsodium.vcxproj
index 76e3ea1f..19d9f3c0 100644
--- a/builds/msvc/vs2013/libsodium/libsodium.vcxproj
+++ b/builds/msvc/vs2013/libsodium/libsodium.vcxproj
@@ -93,7 +93,7 @@
-
+
diff --git a/builds/msvc/vs2013/libsodium/libsodium.vcxproj.filters b/builds/msvc/vs2013/libsodium/libsodium.vcxproj.filters
index 81e42f23..c553cf26 100644
--- a/builds/msvc/vs2013/libsodium/libsodium.vcxproj.filters
+++ b/builds/msvc/vs2013/libsodium/libsodium.vcxproj.filters
@@ -961,7 +961,7 @@
src\crypto_scalarmult\curve25519\ref10
-
+
src\crypto_stream\chacha20
diff --git a/builds/msvc/vs2015/libsodium/libsodium.vcxproj b/builds/msvc/vs2015/libsodium/libsodium.vcxproj
index 8635a8c4..10a9c6ad 100644
--- a/builds/msvc/vs2015/libsodium/libsodium.vcxproj
+++ b/builds/msvc/vs2015/libsodium/libsodium.vcxproj
@@ -93,7 +93,7 @@
-
+
@@ -325,4 +325,4 @@
-
\ No newline at end of file
+
diff --git a/builds/msvc/vs2015/libsodium/libsodium.vcxproj.filters b/builds/msvc/vs2015/libsodium/libsodium.vcxproj.filters
index 0fdaa73d..6ebfc22b 100644
--- a/builds/msvc/vs2015/libsodium/libsodium.vcxproj.filters
+++ b/builds/msvc/vs2015/libsodium/libsodium.vcxproj.filters
@@ -925,7 +925,7 @@
-
+
src\crypto_stream\chacha20
@@ -998,4 +998,4 @@
src\crypto_sign\ed25519\ref10
-
\ No newline at end of file
+
diff --git a/libsodium.vcxproj b/libsodium.vcxproj
index 4611ced2..7a9b6253 100644
--- a/libsodium.vcxproj
+++ b/libsodium.vcxproj
@@ -501,7 +501,7 @@
-
+
@@ -535,4 +535,4 @@
-
\ No newline at end of file
+
diff --git a/libsodium.vcxproj.filters b/libsodium.vcxproj.filters
index 6204163c..5ba55c9d 100644
--- a/libsodium.vcxproj.filters
+++ b/libsodium.vcxproj.filters
@@ -566,7 +566,7 @@
Source Files
-
+
Source Files
@@ -656,4 +656,4 @@
Source Files
-
\ No newline at end of file
+
diff --git a/src/libsodium/Makefile.am b/src/libsodium/Makefile.am
index d2be0d8a..71725704 100644
--- a/src/libsodium/Makefile.am
+++ b/src/libsodium/Makefile.am
@@ -122,7 +122,8 @@ libsodium_la_SOURCES = \
crypto_sign/ed25519/ref10/sign.c \
crypto_sign/ed25519/ref10/sqrtm1.h \
crypto_stream/crypto_stream.c \
- crypto_stream/chacha20/stream_chacha20_api.c \
+ crypto_stream/chacha20/stream_chacha20.c \
+ crypto_stream/chacha20/stream_chacha20.h \
crypto_stream/chacha20/ref/stream_chacha20_ref.h \
crypto_stream/chacha20/ref/stream_chacha20_ref.c \
crypto_stream/salsa20/stream_salsa20_api.c \
diff --git a/src/libsodium/crypto_stream/chacha20/ref/stream_chacha20_ref.c b/src/libsodium/crypto_stream/chacha20/ref/stream_chacha20_ref.c
index 848fdf73..f6fab60c 100644
--- a/src/libsodium/crypto_stream/chacha20/ref/stream_chacha20_ref.c
+++ b/src/libsodium/crypto_stream/chacha20/ref/stream_chacha20_ref.c
@@ -9,9 +9,10 @@
#include
#include
+#include "utils.h"
#include "crypto_stream_chacha20.h"
#include "stream_chacha20_ref.h"
-#include "utils.h"
+#include "../stream_chacha20.h"
struct chacha_ctx {
uint32_t input[16];
@@ -238,9 +239,9 @@ chacha_encrypt_bytes(chacha_ctx *x, const u8 *m, u8 *c, unsigned long long bytes
}
}
-int
-crypto_stream_chacha20_ref(unsigned char *c, unsigned long long clen,
- const unsigned char *n, const unsigned char *k)
+static int
+stream_ref(unsigned char *c, unsigned long long clen,
+ const unsigned char *n, const unsigned char *k)
{
struct chacha_ctx ctx;
@@ -257,9 +258,9 @@ crypto_stream_chacha20_ref(unsigned char *c, unsigned long long clen,
return 0;
}
-int
-crypto_stream_chacha20_ietf_ref(unsigned char *c, unsigned long long clen,
- const unsigned char *n, const unsigned char *k)
+static int
+stream_ietf_ref(unsigned char *c, unsigned long long clen,
+ const unsigned char *n, const unsigned char *k)
{
struct chacha_ctx ctx;
@@ -279,11 +280,11 @@ crypto_stream_chacha20_ietf_ref(unsigned char *c, unsigned long long clen,
return 0;
}
-int
-crypto_stream_chacha20_ref_xor_ic(unsigned char *c, const unsigned char *m,
- unsigned long long mlen,
- const unsigned char *n, uint64_t ic,
- const unsigned char *k)
+static int
+stream_ref_xor_ic(unsigned char *c, const unsigned char *m,
+ unsigned long long mlen,
+ const unsigned char *n, uint64_t ic,
+ const unsigned char *k)
{
struct chacha_ctx ctx;
uint8_t ic_bytes[8];
@@ -307,11 +308,11 @@ crypto_stream_chacha20_ref_xor_ic(unsigned char *c, const unsigned char *m,
return 0;
}
-int
-crypto_stream_chacha20_ietf_ref_xor_ic(unsigned char *c, const unsigned char *m,
- unsigned long long mlen,
- const unsigned char *n, uint32_t ic,
- const unsigned char *k)
+static int
+stream_ietf_ref_xor_ic(unsigned char *c, const unsigned char *m,
+ unsigned long long mlen,
+ const unsigned char *n, uint32_t ic,
+ const unsigned char *k)
{
struct chacha_ctx ctx;
uint8_t ic_bytes[4];
@@ -328,3 +329,11 @@ crypto_stream_chacha20_ietf_ref_xor_ic(unsigned char *c, const unsigned char *m,
return 0;
}
+
+struct crypto_stream_chacha20_implementation
+crypto_stream_chacha20_ref_implementation = {
+ SODIUM_C99(.stream =) stream_ref,
+ SODIUM_C99(.stream_ietf =) stream_ietf_ref,
+ SODIUM_C99(.stream_xor_ic =) stream_ref_xor_ic,
+ SODIUM_C99(.stream_ietf_xor_ic =) stream_ietf_ref_xor_ic
+};
diff --git a/src/libsodium/crypto_stream/chacha20/ref/stream_chacha20_ref.h b/src/libsodium/crypto_stream/chacha20/ref/stream_chacha20_ref.h
index d7290815..bfd6b500 100644
--- a/src/libsodium/crypto_stream/chacha20/ref/stream_chacha20_ref.h
+++ b/src/libsodium/crypto_stream/chacha20/ref/stream_chacha20_ref.h
@@ -1,6 +1,9 @@
#include "crypto_stream_chacha20.h"
+extern struct crypto_stream_chacha20_implementation
+ crypto_stream_chacha20_ref_implementation;
+
int
crypto_stream_chacha20_ref(unsigned char *c, unsigned long long clen,
const unsigned char *n, const unsigned char *k);
diff --git a/src/libsodium/crypto_stream/chacha20/stream_chacha20_api.c b/src/libsodium/crypto_stream/chacha20/stream_chacha20.c
similarity index 75%
rename from src/libsodium/crypto_stream/chacha20/stream_chacha20_api.c
rename to src/libsodium/crypto_stream/chacha20/stream_chacha20.c
index 2d0a0669..97da45f1 100644
--- a/src/libsodium/crypto_stream/chacha20/stream_chacha20_api.c
+++ b/src/libsodium/crypto_stream/chacha20/stream_chacha20.c
@@ -1,6 +1,11 @@
#include "crypto_stream_chacha20.h"
+#include "stream_chacha20.h"
+#include "runtime.h"
#include "ref/stream_chacha20_ref.h"
+static const crypto_stream_chacha20_implementation *implementation =
+ &crypto_stream_chacha20_ref_implementation;
+
size_t
crypto_stream_chacha20_keybytes(void) {
return crypto_stream_chacha20_KEYBYTES;
@@ -20,14 +25,14 @@ int
crypto_stream_chacha20(unsigned char *c, unsigned long long clen,
const unsigned char *n, const unsigned char *k)
{
- return crypto_stream_chacha20_ref(c, clen, n, k);
+ return implementation->stream(c, clen, n, k);
}
int
crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen,
const unsigned char *n, const unsigned char *k)
{
- return crypto_stream_chacha20_ietf_ref(c, clen, n, k);
+ return implementation->stream_ietf(c, clen, n, k);
}
int
@@ -36,7 +41,7 @@ crypto_stream_chacha20_xor_ic(unsigned char *c, const unsigned char *m,
const unsigned char *n, uint64_t ic,
const unsigned char *k)
{
- return crypto_stream_chacha20_ref_xor_ic(c, m, mlen, n, ic, k);
+ return implementation->stream_xor_ic(c, m, mlen, n, ic, k);
}
int
@@ -45,7 +50,7 @@ crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m,
const unsigned char *n, uint32_t ic,
const unsigned char *k)
{
- return crypto_stream_chacha20_ietf_ref_xor_ic(c, m, mlen, n, ic, k);
+ return implementation->stream_ietf_xor_ic(c, m, mlen, n, ic, k);
}
int
@@ -53,7 +58,7 @@ crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m,
unsigned long long mlen, const unsigned char *n,
const unsigned char *k)
{
- return crypto_stream_chacha20_ref_xor_ic(c, m, mlen, n, 0U, k);
+ return implementation->stream_xor_ic(c, m, mlen, n, 0U, k);
}
int
@@ -61,5 +66,5 @@ crypto_stream_chacha20_ietf_xor(unsigned char *c, const unsigned char *m,
unsigned long long mlen, const unsigned char *n,
const unsigned char *k)
{
- return crypto_stream_chacha20_ietf_ref_xor_ic(c, m, mlen, n, 0U, k);
+ return implementation->stream_ietf_xor_ic(c, m, mlen, n, 0U, k);
}
diff --git a/src/libsodium/crypto_stream/chacha20/stream_chacha20.h b/src/libsodium/crypto_stream/chacha20/stream_chacha20.h
new file mode 100644
index 00000000..d6b71c5e
--- /dev/null
+++ b/src/libsodium/crypto_stream/chacha20/stream_chacha20.h
@@ -0,0 +1,22 @@
+
+#ifndef stream_chacha20_H
+#define stream_chacha20_H
+
+#include
+
+typedef struct crypto_stream_chacha20_implementation {
+ int (*stream)(unsigned char *c, unsigned long long clen,
+ const unsigned char *n, const unsigned char *k);
+ int (*stream_ietf)(unsigned char *c, unsigned long long clen,
+ const unsigned char *n, const unsigned char *k);
+ int (*stream_xor_ic)(unsigned char *c, const unsigned char *m,
+ unsigned long long mlen,
+ const unsigned char *n, uint64_t ic,
+ const unsigned char *k);
+ int (*stream_ietf_xor_ic)(unsigned char *c, const unsigned char *m,
+ unsigned long long mlen,
+ const unsigned char *n, uint32_t ic,
+ const unsigned char *k);
+} crypto_stream_chacha20_implementation;
+
+#endif