ruby_olm 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ext/ruby_olm/ext_lib_olm/ext_account.c +274 -0
- data/ext/ruby_olm/ext_lib_olm/ext_lib_olm.c +51 -0
- data/ext/ruby_olm/ext_lib_olm/ext_lib_olm.h +13 -0
- data/ext/ruby_olm/ext_lib_olm/ext_session.c +363 -0
- data/ext/ruby_olm/ext_lib_olm/ext_utility.c +69 -0
- data/ext/ruby_olm/ext_lib_olm/extconf.rb +69 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_account.cpp +695 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_account.h +56 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_inbound_group_session.cpp +654 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_inbound_group_session.h +51 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_jni.h +81 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_jni_helper.cpp +224 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_jni_helper.h +30 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_manager.cpp +35 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_manager.h +36 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_outbound_group_session.cpp +563 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_outbound_group_session.h +49 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_pk.cpp +716 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_pk.h +48 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_session.cpp +977 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_session.h +59 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_utility.cpp +236 -0
- data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_utility.h +40 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_decode_message.cpp +14 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_decrypt.cpp +65 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_group_decrypt.cpp +73 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_unpickle_account.cpp +14 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_unpickle_session.cpp +14 -0
- data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/include/fuzzing.hh +82 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/account.hh +160 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/base64.h +77 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/base64.hh +63 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/cipher.h +138 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/crypto.h +202 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/error.h +72 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/inbound_group_session.h +235 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/list.hh +119 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/megolm.h +95 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/memory.h +41 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/memory.hh +90 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/message.h +93 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/message.hh +138 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/olm.h +451 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/olm.hh +4 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/outbound_group_session.h +181 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pickle.h +90 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pickle.hh +149 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pickle_encoding.h +76 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pk.h +214 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/ratchet.hh +184 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/session.hh +156 -0
- data/ext/ruby_olm/ext_lib_olm/olm/include/olm/utility.hh +61 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/aes.c +1073 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/aes.h +123 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/aes_test.c +276 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/arcfour.c +45 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/arcfour.h +30 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/arcfour_test.c +47 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/base64.c +135 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/base64.h +27 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/base64_test.c +54 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/blowfish.c +269 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/blowfish.h +32 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/blowfish_test.c +68 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/des.c +269 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/des.h +37 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/des_test.c +83 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md2.c +104 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md2.h +33 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md2_test.c +58 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md5.c +189 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md5.h +34 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md5_test.c +60 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/rot-13.c +35 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/rot-13.h +20 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/rot-13_test.c +44 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha1.c +149 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha1.h +35 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha1_test.c +58 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha256.c +159 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha256.h +34 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha256_test.c +61 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/contrib/Curve25519Donna.c +118 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/contrib/Curve25519Donna.h +53 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/curve25519-donna-c64.c +449 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/curve25519-donna.c +860 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/python-src/curve25519/curve25519module.c +105 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/speed-curve25519.c +50 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/test-curve25519.c +54 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/test-noncanon.c +39 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/test-sc-curve25519.c +72 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna.h +18 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/add_scalar.c +56 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/ed25519.h +38 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/fe.c +1493 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/fe.h +41 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/fixedint.h +72 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/ge.c +467 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/ge.h +74 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/key_exchange.c +79 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/keypair.c +16 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/precomp_data.h +1391 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sc.c +814 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sc.h +12 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/seed.c +40 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sha512.c +275 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sha512.h +21 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sign.c +31 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/verify.c +77 -0
- data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/test.c +150 -0
- data/ext/ruby_olm/ext_lib_olm/olm/python/dummy/stddef.h +0 -0
- data/ext/ruby_olm/ext_lib_olm/olm/python/dummy/stdint.h +0 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/account.cpp +380 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/base64.cpp +167 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/cipher.cpp +152 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/crypto.cpp +299 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/ed25519.c +22 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/error.c +44 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/inbound_group_session.c +524 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/megolm.c +150 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/memory.cpp +45 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/message.cpp +401 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/olm.cpp +738 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/outbound_group_session.c +363 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/pickle.cpp +242 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/pickle_encoding.c +92 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/pk.cpp +412 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/ratchet.cpp +625 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/session.cpp +462 -0
- data/ext/ruby_olm/ext_lib_olm/olm/src/utility.cpp +57 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/include/unittest.hh +107 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_base64.cpp +70 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_crypto.cpp +246 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_group_session.cpp +329 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_list.cpp +92 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_megolm.cpp +134 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_message.cpp +112 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm.cpp +405 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_decrypt.cpp +90 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_sha256.cpp +20 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_signature.cpp +81 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_using_malloc.cpp +210 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_pk.cpp +166 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_ratchet.cpp +221 -0
- data/ext/ruby_olm/ext_lib_olm/olm/tests/test_session.cpp +144 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMAccount.h +51 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMAccount_Private.h +25 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMInboundGroupSession.h +38 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMKit.h +37 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMMessage.h +38 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMOutboundGroupSession.h +32 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMPkDecryption.h +71 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMPkEncryption.h +42 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMPkMessage.h +31 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMSerializable.h +29 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMSession.h +44 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMSession_Private.h +26 -0
- data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMUtility.h +49 -0
- data/ext/ruby_olm/ext_lib_olm/staging/account.cpp +380 -0
- data/ext/ruby_olm/ext_lib_olm/staging/aes.c +1073 -0
- data/ext/ruby_olm/ext_lib_olm/staging/base64.cpp +167 -0
- data/ext/ruby_olm/ext_lib_olm/staging/cipher.cpp +152 -0
- data/ext/ruby_olm/ext_lib_olm/staging/crypto.cpp +299 -0
- data/ext/ruby_olm/ext_lib_olm/staging/curve25519-donna.c +860 -0
- data/ext/ruby_olm/ext_lib_olm/staging/ed25519.c +22 -0
- data/ext/ruby_olm/ext_lib_olm/staging/error.c +44 -0
- data/ext/ruby_olm/ext_lib_olm/staging/inbound_group_session.c +524 -0
- data/ext/ruby_olm/ext_lib_olm/staging/megolm.c +150 -0
- data/ext/ruby_olm/ext_lib_olm/staging/memory.cpp +45 -0
- data/ext/ruby_olm/ext_lib_olm/staging/message.cpp +401 -0
- data/ext/ruby_olm/ext_lib_olm/staging/olm.cpp +738 -0
- data/ext/ruby_olm/ext_lib_olm/staging/outbound_group_session.c +363 -0
- data/ext/ruby_olm/ext_lib_olm/staging/pickle.cpp +242 -0
- data/ext/ruby_olm/ext_lib_olm/staging/pickle_encoding.c +92 -0
- data/ext/ruby_olm/ext_lib_olm/staging/pk.cpp +412 -0
- data/ext/ruby_olm/ext_lib_olm/staging/ratchet.cpp +625 -0
- data/ext/ruby_olm/ext_lib_olm/staging/session.cpp +461 -0
- data/ext/ruby_olm/ext_lib_olm/staging/sha256.c +159 -0
- data/ext/ruby_olm/ext_lib_olm/staging/utility.cpp +57 -0
- data/lib/ruby_olm/account.rb +42 -0
- data/lib/ruby_olm/message.rb +6 -0
- data/lib/ruby_olm/olm_error.rb +70 -0
- data/lib/ruby_olm/olm_message.rb +25 -0
- data/lib/ruby_olm/pre_key_message.rb +6 -0
- data/lib/ruby_olm/session.rb +16 -0
- data/lib/ruby_olm/version.rb +5 -0
- data/lib/ruby_olm.rb +10 -0
- data/rakefile +18 -0
- data/test/examples/test_bob_no_answer.rb +62 -0
- data/test/examples/test_exchange.rb +60 -0
- data/test/spec/test_account.rb +152 -0
- data/test/unit/test_account_methods.rb +85 -0
- metadata +282 -0
@@ -0,0 +1,72 @@
|
|
1
|
+
/* Copyright 2015-2016 OpenMarket Ltd
|
2
|
+
*
|
3
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
* you may not use this file except in compliance with the License.
|
5
|
+
* You may obtain a copy of the License at
|
6
|
+
*
|
7
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
*
|
9
|
+
* Unless required by applicable law or agreed to in writing, software
|
10
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
* See the License for the specific language governing permissions and
|
13
|
+
* limitations under the License.
|
14
|
+
*/
|
15
|
+
#ifndef OLM_ERROR_H_
|
16
|
+
#define OLM_ERROR_H_
|
17
|
+
|
18
|
+
#ifdef __cplusplus
|
19
|
+
extern "C" {
|
20
|
+
#endif
|
21
|
+
|
22
|
+
enum OlmErrorCode {
|
23
|
+
OLM_SUCCESS = 0, /*!< There wasn't an error */
|
24
|
+
OLM_NOT_ENOUGH_RANDOM = 1, /*!< Not enough entropy was supplied */
|
25
|
+
OLM_OUTPUT_BUFFER_TOO_SMALL = 2, /*!< Supplied output buffer is too small */
|
26
|
+
OLM_BAD_MESSAGE_VERSION = 3, /*!< The message version is unsupported */
|
27
|
+
OLM_BAD_MESSAGE_FORMAT = 4, /*!< The message couldn't be decoded */
|
28
|
+
OLM_BAD_MESSAGE_MAC = 5, /*!< The message couldn't be decrypted */
|
29
|
+
OLM_BAD_MESSAGE_KEY_ID = 6, /*!< The message references an unknown key id */
|
30
|
+
OLM_INVALID_BASE64 = 7, /*!< The input base64 was invalid */
|
31
|
+
OLM_BAD_ACCOUNT_KEY = 8, /*!< The supplied account key is invalid */
|
32
|
+
OLM_UNKNOWN_PICKLE_VERSION = 9, /*!< The pickled object is too new */
|
33
|
+
OLM_CORRUPTED_PICKLE = 10, /*!< The pickled object couldn't be decoded */
|
34
|
+
|
35
|
+
OLM_BAD_SESSION_KEY = 11, /*!< Attempt to initialise an inbound group
|
36
|
+
session from an invalid session key */
|
37
|
+
OLM_UNKNOWN_MESSAGE_INDEX = 12, /*!< Attempt to decode a message whose
|
38
|
+
* index is earlier than our earliest
|
39
|
+
* known session key.
|
40
|
+
*/
|
41
|
+
|
42
|
+
/**
|
43
|
+
* Attempt to unpickle an account which uses pickle version 1 (which did
|
44
|
+
* not save enough space for the Ed25519 key; the key should be considered
|
45
|
+
* compromised. We don't let the user reload the account.
|
46
|
+
*/
|
47
|
+
OLM_BAD_LEGACY_ACCOUNT_PICKLE = 13,
|
48
|
+
|
49
|
+
/**
|
50
|
+
* Received message had a bad signature
|
51
|
+
*/
|
52
|
+
OLM_BAD_SIGNATURE = 14,
|
53
|
+
|
54
|
+
OLM_INPUT_BUFFER_TOO_SMALL = 15,
|
55
|
+
|
56
|
+
// Not an error code, just here to pad out the enum past 16 because
|
57
|
+
// otherwise the compiler warns about a redunant check. If you're
|
58
|
+
// adding an error code, replace this one!
|
59
|
+
OLM_ERROR_NOT_INVENTED_YET = 16,
|
60
|
+
|
61
|
+
/* remember to update the list of string constants in error.c when updating
|
62
|
+
* this list. */
|
63
|
+
};
|
64
|
+
|
65
|
+
/** get a string representation of the given error code. */
|
66
|
+
const char * _olm_error_to_string(enum OlmErrorCode error);
|
67
|
+
|
68
|
+
#ifdef __cplusplus
|
69
|
+
} // extern "C"
|
70
|
+
#endif
|
71
|
+
|
72
|
+
#endif /* OLM_ERROR_H_ */
|
@@ -0,0 +1,235 @@
|
|
1
|
+
/* Copyright 2016 OpenMarket Ltd
|
2
|
+
*
|
3
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
* you may not use this file except in compliance with the License.
|
5
|
+
* You may obtain a copy of the License at
|
6
|
+
*
|
7
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
*
|
9
|
+
* Unless required by applicable law or agreed to in writing, software
|
10
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
* See the License for the specific language governing permissions and
|
13
|
+
* limitations under the License.
|
14
|
+
*/
|
15
|
+
#ifndef OLM_INBOUND_GROUP_SESSION_H_
|
16
|
+
#define OLM_INBOUND_GROUP_SESSION_H_
|
17
|
+
|
18
|
+
#include <stddef.h>
|
19
|
+
#include <stdint.h>
|
20
|
+
|
21
|
+
#ifdef __cplusplus
|
22
|
+
extern "C" {
|
23
|
+
#endif
|
24
|
+
|
25
|
+
typedef struct OlmInboundGroupSession OlmInboundGroupSession;
|
26
|
+
|
27
|
+
/** get the size of an inbound group session, in bytes. */
|
28
|
+
size_t olm_inbound_group_session_size(void);
|
29
|
+
|
30
|
+
/**
|
31
|
+
* Initialise an inbound group session object using the supplied memory
|
32
|
+
* The supplied memory should be at least olm_inbound_group_session_size()
|
33
|
+
* bytes.
|
34
|
+
*/
|
35
|
+
OlmInboundGroupSession * olm_inbound_group_session(
|
36
|
+
void *memory
|
37
|
+
);
|
38
|
+
|
39
|
+
/**
|
40
|
+
* A null terminated string describing the most recent error to happen to a
|
41
|
+
* group session */
|
42
|
+
const char *olm_inbound_group_session_last_error(
|
43
|
+
const OlmInboundGroupSession *session
|
44
|
+
);
|
45
|
+
|
46
|
+
/** Clears the memory used to back this group session */
|
47
|
+
size_t olm_clear_inbound_group_session(
|
48
|
+
OlmInboundGroupSession *session
|
49
|
+
);
|
50
|
+
|
51
|
+
/** Returns the number of bytes needed to store an inbound group session */
|
52
|
+
size_t olm_pickle_inbound_group_session_length(
|
53
|
+
const OlmInboundGroupSession *session
|
54
|
+
);
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Stores a group session as a base64 string. Encrypts the session using the
|
58
|
+
* supplied key. Returns the length of the session on success.
|
59
|
+
*
|
60
|
+
* Returns olm_error() on failure. If the pickle output buffer
|
61
|
+
* is smaller than olm_pickle_inbound_group_session_length() then
|
62
|
+
* olm_inbound_group_session_last_error() will be "OUTPUT_BUFFER_TOO_SMALL"
|
63
|
+
*/
|
64
|
+
size_t olm_pickle_inbound_group_session(
|
65
|
+
OlmInboundGroupSession *session,
|
66
|
+
void const * key, size_t key_length,
|
67
|
+
void * pickled, size_t pickled_length
|
68
|
+
);
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Loads a group session from a pickled base64 string. Decrypts the session
|
72
|
+
* using the supplied key.
|
73
|
+
*
|
74
|
+
* Returns olm_error() on failure. If the key doesn't match the one used to
|
75
|
+
* encrypt the account then olm_inbound_group_session_last_error() will be
|
76
|
+
* "BAD_ACCOUNT_KEY". If the base64 couldn't be decoded then
|
77
|
+
* olm_inbound_group_session_last_error() will be "INVALID_BASE64". The input
|
78
|
+
* pickled buffer is destroyed
|
79
|
+
*/
|
80
|
+
size_t olm_unpickle_inbound_group_session(
|
81
|
+
OlmInboundGroupSession *session,
|
82
|
+
void const * key, size_t key_length,
|
83
|
+
void * pickled, size_t pickled_length
|
84
|
+
);
|
85
|
+
|
86
|
+
|
87
|
+
/**
|
88
|
+
* Start a new inbound group session, from a key exported from
|
89
|
+
* olm_outbound_group_session_key
|
90
|
+
*
|
91
|
+
* Returns olm_error() on failure. On failure last_error will be set with an
|
92
|
+
* error code. The last_error will be:
|
93
|
+
*
|
94
|
+
* * OLM_INVALID_BASE64 if the session_key is not valid base64
|
95
|
+
* * OLM_BAD_SESSION_KEY if the session_key is invalid
|
96
|
+
*/
|
97
|
+
size_t olm_init_inbound_group_session(
|
98
|
+
OlmInboundGroupSession *session,
|
99
|
+
/* base64-encoded keys */
|
100
|
+
uint8_t const * session_key, size_t session_key_length
|
101
|
+
);
|
102
|
+
|
103
|
+
/**
|
104
|
+
* Import an inbound group session, from a previous export.
|
105
|
+
*
|
106
|
+
* Returns olm_error() on failure. On failure last_error will be set with an
|
107
|
+
* error code. The last_error will be:
|
108
|
+
*
|
109
|
+
* * OLM_INVALID_BASE64 if the session_key is not valid base64
|
110
|
+
* * OLM_BAD_SESSION_KEY if the session_key is invalid
|
111
|
+
*/
|
112
|
+
size_t olm_import_inbound_group_session(
|
113
|
+
OlmInboundGroupSession *session,
|
114
|
+
/* base64-encoded keys; note that it will be overwritten with the base64-decoded
|
115
|
+
data. */
|
116
|
+
uint8_t const * session_key, size_t session_key_length
|
117
|
+
);
|
118
|
+
|
119
|
+
|
120
|
+
/**
|
121
|
+
* Get an upper bound on the number of bytes of plain-text the decrypt method
|
122
|
+
* will write for a given input message length. The actual size could be
|
123
|
+
* different due to padding.
|
124
|
+
*
|
125
|
+
* The input message buffer is destroyed.
|
126
|
+
*
|
127
|
+
* Returns olm_error() on failure.
|
128
|
+
*/
|
129
|
+
size_t olm_group_decrypt_max_plaintext_length(
|
130
|
+
OlmInboundGroupSession *session,
|
131
|
+
uint8_t * message, size_t message_length
|
132
|
+
);
|
133
|
+
|
134
|
+
/**
|
135
|
+
* Decrypt a message.
|
136
|
+
*
|
137
|
+
* The input message buffer is destroyed.
|
138
|
+
*
|
139
|
+
* Returns the length of the decrypted plain-text, or olm_error() on failure.
|
140
|
+
*
|
141
|
+
* On failure last_error will be set with an error code. The last_error will
|
142
|
+
* be:
|
143
|
+
* * OLM_OUTPUT_BUFFER_TOO_SMALL if the plain-text buffer is too small
|
144
|
+
* * OLM_INVALID_BASE64 if the message is not valid base-64
|
145
|
+
* * OLM_BAD_MESSAGE_VERSION if the message was encrypted with an unsupported
|
146
|
+
* version of the protocol
|
147
|
+
* * OLM_BAD_MESSAGE_FORMAT if the message headers could not be decoded
|
148
|
+
* * OLM_BAD_MESSAGE_MAC if the message could not be verified
|
149
|
+
* * OLM_UNKNOWN_MESSAGE_INDEX if we do not have a session key corresponding to the
|
150
|
+
* message's index (ie, it was sent before the session key was shared with
|
151
|
+
* us)
|
152
|
+
*/
|
153
|
+
size_t olm_group_decrypt(
|
154
|
+
OlmInboundGroupSession *session,
|
155
|
+
|
156
|
+
/* input; note that it will be overwritten with the base64-decoded
|
157
|
+
message. */
|
158
|
+
uint8_t * message, size_t message_length,
|
159
|
+
|
160
|
+
/* output */
|
161
|
+
uint8_t * plaintext, size_t max_plaintext_length,
|
162
|
+
uint32_t * message_index
|
163
|
+
);
|
164
|
+
|
165
|
+
|
166
|
+
/**
|
167
|
+
* Get the number of bytes returned by olm_inbound_group_session_id()
|
168
|
+
*/
|
169
|
+
size_t olm_inbound_group_session_id_length(
|
170
|
+
const OlmInboundGroupSession *session
|
171
|
+
);
|
172
|
+
|
173
|
+
/**
|
174
|
+
* Get a base64-encoded identifier for this session.
|
175
|
+
*
|
176
|
+
* Returns the length of the session id on success or olm_error() on
|
177
|
+
* failure. On failure last_error will be set with an error code. The
|
178
|
+
* last_error will be OUTPUT_BUFFER_TOO_SMALL if the id buffer was too
|
179
|
+
* small.
|
180
|
+
*/
|
181
|
+
size_t olm_inbound_group_session_id(
|
182
|
+
OlmInboundGroupSession *session,
|
183
|
+
uint8_t * id, size_t id_length
|
184
|
+
);
|
185
|
+
|
186
|
+
/**
|
187
|
+
* Get the first message index we know how to decrypt.
|
188
|
+
*/
|
189
|
+
uint32_t olm_inbound_group_session_first_known_index(
|
190
|
+
const OlmInboundGroupSession *session
|
191
|
+
);
|
192
|
+
|
193
|
+
|
194
|
+
/**
|
195
|
+
* Check if the session has been verified as a valid session.
|
196
|
+
*
|
197
|
+
* (A session is verified either because the original session share was signed,
|
198
|
+
* or because we have subsequently successfully decrypted a message.)
|
199
|
+
*
|
200
|
+
* This is mainly intended for the unit tests, currently.
|
201
|
+
*/
|
202
|
+
int olm_inbound_group_session_is_verified(
|
203
|
+
const OlmInboundGroupSession *session
|
204
|
+
);
|
205
|
+
|
206
|
+
/**
|
207
|
+
* Get the number of bytes returned by olm_export_inbound_group_session()
|
208
|
+
*/
|
209
|
+
size_t olm_export_inbound_group_session_length(
|
210
|
+
const OlmInboundGroupSession *session
|
211
|
+
);
|
212
|
+
|
213
|
+
/**
|
214
|
+
* Export the base64-encoded ratchet key for this session, at the given index,
|
215
|
+
* in a format which can be used by olm_import_inbound_group_session
|
216
|
+
*
|
217
|
+
* Returns the length of the ratchet key on success or olm_error() on
|
218
|
+
* failure. On failure last_error will be set with an error code. The
|
219
|
+
* last_error will be:
|
220
|
+
* * OUTPUT_BUFFER_TOO_SMALL if the buffer was too small
|
221
|
+
* * OLM_UNKNOWN_MESSAGE_INDEX if we do not have a session key corresponding to the
|
222
|
+
* given index (ie, it was sent before the session key was shared with
|
223
|
+
* us)
|
224
|
+
*/
|
225
|
+
size_t olm_export_inbound_group_session(
|
226
|
+
OlmInboundGroupSession *session,
|
227
|
+
uint8_t * key, size_t key_length, uint32_t message_index
|
228
|
+
);
|
229
|
+
|
230
|
+
|
231
|
+
#ifdef __cplusplus
|
232
|
+
} // extern "C"
|
233
|
+
#endif
|
234
|
+
|
235
|
+
#endif /* OLM_INBOUND_GROUP_SESSION_H_ */
|
@@ -0,0 +1,119 @@
|
|
1
|
+
/* Copyright 2015 OpenMarket Ltd
|
2
|
+
*
|
3
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
* you may not use this file except in compliance with the License.
|
5
|
+
* You may obtain a copy of the License at
|
6
|
+
*
|
7
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
*
|
9
|
+
* Unless required by applicable law or agreed to in writing, software
|
10
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
* See the License for the specific language governing permissions and
|
13
|
+
* limitations under the License.
|
14
|
+
*/
|
15
|
+
#ifndef OLM_LIST_HH_
|
16
|
+
#define OLM_LIST_HH_
|
17
|
+
|
18
|
+
#include <cstddef>
|
19
|
+
|
20
|
+
namespace olm {
|
21
|
+
|
22
|
+
template<typename T, std::size_t max_size>
|
23
|
+
class List {
|
24
|
+
public:
|
25
|
+
List() : _end(_data) {}
|
26
|
+
|
27
|
+
typedef T * iterator;
|
28
|
+
typedef T const * const_iterator;
|
29
|
+
|
30
|
+
T * begin() { return _data; }
|
31
|
+
T * end() { return _end; }
|
32
|
+
T const * begin() const { return _data; }
|
33
|
+
T const * end() const { return _end; }
|
34
|
+
|
35
|
+
/**
|
36
|
+
* Is the list empty?
|
37
|
+
*/
|
38
|
+
bool empty() const { return _end == _data; }
|
39
|
+
|
40
|
+
/**
|
41
|
+
* The number of items in the list.
|
42
|
+
*/
|
43
|
+
std::size_t size() const { return _end - _data; }
|
44
|
+
|
45
|
+
T & operator[](std::size_t index) { return _data[index]; }
|
46
|
+
|
47
|
+
T const & operator[](std::size_t index) const { return _data[index]; }
|
48
|
+
|
49
|
+
/**
|
50
|
+
* Erase the item from the list at the given position.
|
51
|
+
*/
|
52
|
+
void erase(T * pos) {
|
53
|
+
--_end;
|
54
|
+
while (pos != _end) {
|
55
|
+
*pos = *(pos + 1);
|
56
|
+
++pos;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Make space for an item in the list at a given position.
|
62
|
+
* If inserting the item makes the list longer than max_size then
|
63
|
+
* the end of the list is discarded.
|
64
|
+
* Returns the where the item is inserted.
|
65
|
+
*/
|
66
|
+
T * insert(T * pos) {
|
67
|
+
if (_end != _data + max_size) {
|
68
|
+
++_end;
|
69
|
+
} else if (pos == _end) {
|
70
|
+
--pos;
|
71
|
+
}
|
72
|
+
T * tmp = _end - 1;
|
73
|
+
while (tmp != pos) {
|
74
|
+
*tmp = *(tmp - 1);
|
75
|
+
--tmp;
|
76
|
+
}
|
77
|
+
return pos;
|
78
|
+
}
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Make space for an item in the list at the start of the list
|
82
|
+
*/
|
83
|
+
T * insert() { return insert(begin()); }
|
84
|
+
|
85
|
+
/**
|
86
|
+
* Insert an item into the list at a given position.
|
87
|
+
* If inserting the item makes the list longer than max_size then
|
88
|
+
* the end of the list is discarded.
|
89
|
+
* Returns the where the item is inserted.
|
90
|
+
*/
|
91
|
+
T * insert(T * pos, T const & value) {
|
92
|
+
pos = insert(pos);
|
93
|
+
*pos = value;
|
94
|
+
return pos;
|
95
|
+
}
|
96
|
+
|
97
|
+
List<T, max_size> & operator=(List<T, max_size> const & other) {
|
98
|
+
if (this == &other) {
|
99
|
+
return *this;
|
100
|
+
}
|
101
|
+
T * this_pos = _data;
|
102
|
+
T * const other_pos = other._data;
|
103
|
+
while (other_pos != other._end) {
|
104
|
+
*this_pos = *other;
|
105
|
+
++this_pos;
|
106
|
+
++other_pos;
|
107
|
+
}
|
108
|
+
_end = this_pos;
|
109
|
+
return *this;
|
110
|
+
}
|
111
|
+
|
112
|
+
private:
|
113
|
+
T * _end;
|
114
|
+
T _data[max_size];
|
115
|
+
};
|
116
|
+
|
117
|
+
} // namespace olm
|
118
|
+
|
119
|
+
#endif /* OLM_LIST_HH_ */
|
@@ -0,0 +1,95 @@
|
|
1
|
+
/* Copyright 2016 OpenMarket Ltd
|
2
|
+
*
|
3
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
* you may not use this file except in compliance with the License.
|
5
|
+
* You may obtain a copy of the License at
|
6
|
+
*
|
7
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
*
|
9
|
+
* Unless required by applicable law or agreed to in writing, software
|
10
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
* See the License for the specific language governing permissions and
|
13
|
+
* limitations under the License.
|
14
|
+
*/
|
15
|
+
|
16
|
+
#ifndef OLM_MEGOLM_H_
|
17
|
+
#define OLM_MEGOLM_H_
|
18
|
+
|
19
|
+
/**
|
20
|
+
* implementation of the Megolm multi-part ratchet used in group chats.
|
21
|
+
*/
|
22
|
+
|
23
|
+
#include <stdint.h>
|
24
|
+
#include <stdlib.h>
|
25
|
+
|
26
|
+
#ifdef __cplusplus
|
27
|
+
extern "C" {
|
28
|
+
#endif
|
29
|
+
|
30
|
+
/**
|
31
|
+
* number of bytes in each part of the ratchet; this should be the same as
|
32
|
+
* the length of the hash function used in the HMAC (32 bytes for us, as we
|
33
|
+
* use HMAC-SHA-256)
|
34
|
+
*/
|
35
|
+
#define MEGOLM_RATCHET_PART_LENGTH 32 /* SHA256_OUTPUT_LENGTH */
|
36
|
+
|
37
|
+
/**
|
38
|
+
* number of parts in the ratchet; the advance() implementations rely on
|
39
|
+
* this being 4.
|
40
|
+
*/
|
41
|
+
#define MEGOLM_RATCHET_PARTS 4
|
42
|
+
|
43
|
+
#define MEGOLM_RATCHET_LENGTH (MEGOLM_RATCHET_PARTS * MEGOLM_RATCHET_PART_LENGTH)
|
44
|
+
|
45
|
+
typedef struct Megolm {
|
46
|
+
uint8_t data[MEGOLM_RATCHET_PARTS][MEGOLM_RATCHET_PART_LENGTH];
|
47
|
+
uint32_t counter;
|
48
|
+
} Megolm;
|
49
|
+
|
50
|
+
|
51
|
+
/**
|
52
|
+
* The cipher used in megolm-backed conversations
|
53
|
+
*
|
54
|
+
* (AES256 + SHA256, with keys based on an HKDF with info of MEGOLM_KEYS)
|
55
|
+
*/
|
56
|
+
extern const struct _olm_cipher *megolm_cipher;
|
57
|
+
|
58
|
+
/**
|
59
|
+
* initialize the megolm ratchet. random_data should be at least
|
60
|
+
* MEGOLM_RATCHET_LENGTH bytes of randomness.
|
61
|
+
*/
|
62
|
+
void megolm_init(Megolm *megolm, uint8_t const *random_data, uint32_t counter);
|
63
|
+
|
64
|
+
/** Returns the number of bytes needed to store a megolm */
|
65
|
+
size_t megolm_pickle_length(const Megolm *megolm);
|
66
|
+
|
67
|
+
/**
|
68
|
+
* Pickle the megolm. Returns a pointer to the next free space in the buffer.
|
69
|
+
*/
|
70
|
+
uint8_t * megolm_pickle(const Megolm *megolm, uint8_t *pos);
|
71
|
+
|
72
|
+
/**
|
73
|
+
* Unpickle the megolm. Returns a pointer to the next item in the buffer.
|
74
|
+
*/
|
75
|
+
const uint8_t * megolm_unpickle(Megolm *megolm, const uint8_t *pos,
|
76
|
+
const uint8_t *end);
|
77
|
+
|
78
|
+
|
79
|
+
/** advance the ratchet by one step */
|
80
|
+
void megolm_advance(Megolm *megolm);
|
81
|
+
|
82
|
+
/**
|
83
|
+
* get the key data in the ratchet. The returned data is
|
84
|
+
* MEGOLM_RATCHET_LENGTH bytes long.
|
85
|
+
*/
|
86
|
+
#define megolm_get_data(megolm) ((const uint8_t *)((megolm)->data))
|
87
|
+
|
88
|
+
/** advance the ratchet to a given count */
|
89
|
+
void megolm_advance_to(Megolm *megolm, uint32_t advance_to);
|
90
|
+
|
91
|
+
#ifdef __cplusplus
|
92
|
+
} // extern "C"
|
93
|
+
#endif
|
94
|
+
|
95
|
+
#endif /* OLM_MEGOLM_H_ */
|
@@ -0,0 +1,41 @@
|
|
1
|
+
/* Copyright 2015, 2016 OpenMarket Ltd
|
2
|
+
*
|
3
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
* you may not use this file except in compliance with the License.
|
5
|
+
* You may obtain a copy of the License at
|
6
|
+
*
|
7
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
*
|
9
|
+
* Unless required by applicable law or agreed to in writing, software
|
10
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
* See the License for the specific language governing permissions and
|
13
|
+
* limitations under the License.
|
14
|
+
*/
|
15
|
+
|
16
|
+
/* C bindings for memory functions */
|
17
|
+
|
18
|
+
|
19
|
+
#ifndef OLM_MEMORY_H_
|
20
|
+
#define OLM_MEMORY_H_
|
21
|
+
|
22
|
+
#include <stddef.h>
|
23
|
+
|
24
|
+
#ifdef __cplusplus
|
25
|
+
extern "C" {
|
26
|
+
#endif
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Clear the memory held in the buffer. This is more resilient to being
|
30
|
+
* optimised away than memset or bzero.
|
31
|
+
*/
|
32
|
+
void _olm_unset(
|
33
|
+
void volatile * buffer, size_t buffer_length
|
34
|
+
);
|
35
|
+
|
36
|
+
#ifdef __cplusplus
|
37
|
+
} // extern "C"
|
38
|
+
#endif
|
39
|
+
|
40
|
+
|
41
|
+
#endif /* OLM_MEMORY_H_ */
|
@@ -0,0 +1,90 @@
|
|
1
|
+
/* Copyright 2015, 2016 OpenMarket Ltd
|
2
|
+
*
|
3
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
* you may not use this file except in compliance with the License.
|
5
|
+
* You may obtain a copy of the License at
|
6
|
+
*
|
7
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
*
|
9
|
+
* Unless required by applicable law or agreed to in writing, software
|
10
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
* See the License for the specific language governing permissions and
|
13
|
+
* limitations under the License.
|
14
|
+
*/
|
15
|
+
#include <cstddef>
|
16
|
+
#include <cstdint>
|
17
|
+
#include <cstring>
|
18
|
+
#include <iomanip>
|
19
|
+
#include <iostream>
|
20
|
+
#include <sstream>
|
21
|
+
#include <type_traits>
|
22
|
+
|
23
|
+
namespace olm {
|
24
|
+
|
25
|
+
/** Clear the memory held in the buffer */
|
26
|
+
void unset(
|
27
|
+
void volatile * buffer, std::size_t buffer_length
|
28
|
+
);
|
29
|
+
|
30
|
+
/** Clear the memory backing an object */
|
31
|
+
template<typename T>
|
32
|
+
void unset(T & value) {
|
33
|
+
unset(reinterpret_cast<void volatile *>(&value), sizeof(T));
|
34
|
+
}
|
35
|
+
|
36
|
+
/** Check if two buffers are equal in constant time. */
|
37
|
+
bool is_equal(
|
38
|
+
std::uint8_t const * buffer_a,
|
39
|
+
std::uint8_t const * buffer_b,
|
40
|
+
std::size_t length
|
41
|
+
);
|
42
|
+
|
43
|
+
/** Check if two fixed size arrays are equals */
|
44
|
+
template<typename T>
|
45
|
+
bool array_equal(
|
46
|
+
T const & array_a,
|
47
|
+
T const & array_b
|
48
|
+
) {
|
49
|
+
static_assert(
|
50
|
+
std::is_array<T>::value
|
51
|
+
&& std::is_convertible<T, std::uint8_t *>::value
|
52
|
+
&& sizeof(T) > 0,
|
53
|
+
"Arguments to array_equal must be std::uint8_t arrays[]."
|
54
|
+
);
|
55
|
+
return is_equal(array_a, array_b, sizeof(T));
|
56
|
+
}
|
57
|
+
|
58
|
+
/** Copy into a fixed size array */
|
59
|
+
template<typename T>
|
60
|
+
std::uint8_t const * load_array(
|
61
|
+
T & destination,
|
62
|
+
std::uint8_t const * source
|
63
|
+
) {
|
64
|
+
static_assert(
|
65
|
+
std::is_array<T>::value
|
66
|
+
&& std::is_convertible<T, std::uint8_t *>::value
|
67
|
+
&& sizeof(T) > 0,
|
68
|
+
"The first argument to load_array must be a std::uint8_t array[]."
|
69
|
+
);
|
70
|
+
std::memcpy(destination, source, sizeof(T));
|
71
|
+
return source + sizeof(T);
|
72
|
+
}
|
73
|
+
|
74
|
+
/** Copy from a fixed size array */
|
75
|
+
template<typename T>
|
76
|
+
std::uint8_t * store_array(
|
77
|
+
std::uint8_t * destination,
|
78
|
+
T const & source
|
79
|
+
) {
|
80
|
+
static_assert(
|
81
|
+
std::is_array<T>::value
|
82
|
+
&& std::is_convertible<T, std::uint8_t *>::value
|
83
|
+
&& sizeof(T) > 0,
|
84
|
+
"The second argument to store_array must be a std::uint8_t array[]."
|
85
|
+
);
|
86
|
+
std::memcpy(destination, source, sizeof(T));
|
87
|
+
return destination + sizeof(T);
|
88
|
+
}
|
89
|
+
|
90
|
+
} // namespace olm
|