aboutsummaryrefslogtreecommitdiff
path: root/src/crypto/chacha.h
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2017-12-07 13:27:11 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2017-12-25 19:28:03 +0000
commit1e5491e942d0a372ebebe9ef3d40941fc4a4fbb6 (patch)
treed13f404893c3994db28935da90947fbea1fc7cd5 /src/crypto/chacha.h
parentMerge pull request #2936 (diff)
downloadmonero-1e5491e942d0a372ebebe9ef3d40941fc4a4fbb6.tar.xz
Add a chacha20 variant to go with chacha8
Diffstat (limited to 'src/crypto/chacha.h')
-rw-r--r--src/crypto/chacha.h84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/crypto/chacha.h b/src/crypto/chacha.h
new file mode 100644
index 000000000..a9665030d
--- /dev/null
+++ b/src/crypto/chacha.h
@@ -0,0 +1,84 @@
+// Copyright (c) 2014-2017, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+#pragma once
+
+#include <stdint.h>
+#include <stddef.h>
+
+#define CHACHA_KEY_SIZE 32
+#define CHACHA_IV_SIZE 8
+
+#if defined(__cplusplus)
+#include <memory.h>
+
+#include "common/memwipe.h"
+#include "hash.h"
+
+namespace crypto {
+ extern "C" {
+#endif
+ void chacha8(const void* data, size_t length, const uint8_t* key, const uint8_t* iv, char* cipher);
+ void chacha20(const void* data, size_t length, const uint8_t* key, const uint8_t* iv, char* cipher);
+#if defined(__cplusplus)
+ }
+
+ using chacha_key = tools::scrubbed_arr<uint8_t, CHACHA_KEY_SIZE>;
+
+#pragma pack(push, 1)
+ // MS VC 2012 doesn't interpret `class chacha_iv` as POD in spite of [9.0.10], so it is a struct
+ struct chacha_iv {
+ uint8_t data[CHACHA_IV_SIZE];
+ };
+#pragma pack(pop)
+
+ static_assert(sizeof(chacha_key) == CHACHA_KEY_SIZE && sizeof(chacha_iv) == CHACHA_IV_SIZE, "Invalid structure size");
+
+ inline void chacha8(const void* data, std::size_t length, const chacha_key& key, const chacha_iv& iv, char* cipher) {
+ chacha8(data, length, key.data(), reinterpret_cast<const uint8_t*>(&iv), cipher);
+ }
+
+ inline void chacha20(const void* data, std::size_t length, const chacha_key& key, const chacha_iv& iv, char* cipher) {
+ chacha20(data, length, key.data(), reinterpret_cast<const uint8_t*>(&iv), cipher);
+ }
+
+ inline void generate_chacha_key(const void *data, size_t size, chacha_key& key) {
+ static_assert(sizeof(chacha_key) <= sizeof(hash), "Size of hash must be at least that of chacha_key");
+ tools::scrubbed_arr<char, HASH_SIZE> pwd_hash;
+ crypto::cn_slow_hash(data, size, pwd_hash.data());
+ memcpy(&key, pwd_hash.data(), sizeof(key));
+ }
+
+ inline void generate_chacha_key(std::string password, chacha_key& key) {
+ return generate_chacha_key(password.data(), password.size(), key);
+ }
+}
+
+#endif