ruby_olm 0.1.1
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/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,134 @@
|
|
|
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
|
+
#include "olm/megolm.h"
|
|
16
|
+
#include "olm/memory.hh"
|
|
17
|
+
|
|
18
|
+
#include "unittest.hh"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
int main() {
|
|
22
|
+
|
|
23
|
+
std::uint8_t random_bytes[] =
|
|
24
|
+
"0123456789ABCDEF0123456789ABCDEF"
|
|
25
|
+
"0123456789ABCDEF0123456789ABCDEF"
|
|
26
|
+
"0123456789ABCDEF0123456789ABCDEF"
|
|
27
|
+
"0123456789ABCDEF0123456789ABCDEF";
|
|
28
|
+
|
|
29
|
+
{
|
|
30
|
+
TestCase test_case("Megolm::advance");
|
|
31
|
+
|
|
32
|
+
Megolm mr;
|
|
33
|
+
|
|
34
|
+
megolm_init(&mr, random_bytes, 0);
|
|
35
|
+
// single-step advance
|
|
36
|
+
megolm_advance(&mr);
|
|
37
|
+
const std::uint8_t expected1[] = {
|
|
38
|
+
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
|
|
39
|
+
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
|
|
40
|
+
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
|
|
41
|
+
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
|
|
42
|
+
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
|
|
43
|
+
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
|
|
44
|
+
0xba, 0x9c, 0xd9, 0x55, 0x74, 0x1d, 0x1c, 0x16, 0x23, 0x23, 0xec, 0x82, 0x5e, 0x7c, 0x5c, 0xe8,
|
|
45
|
+
0x89, 0xbb, 0xb4, 0x23, 0xa1, 0x8f, 0x23, 0x82, 0x8f, 0xb2, 0x09, 0x0d, 0x6e, 0x2a, 0xf8, 0x6a
|
|
46
|
+
};
|
|
47
|
+
assert_equals(1U, mr.counter);
|
|
48
|
+
assert_equals(expected1, megolm_get_data(&mr), MEGOLM_RATCHET_LENGTH);
|
|
49
|
+
|
|
50
|
+
// repeat with complex advance
|
|
51
|
+
megolm_init(&mr, random_bytes, 0);
|
|
52
|
+
megolm_advance_to(&mr, 1);
|
|
53
|
+
assert_equals(1U, mr.counter);
|
|
54
|
+
assert_equals(expected1, megolm_get_data(&mr), MEGOLM_RATCHET_LENGTH);
|
|
55
|
+
|
|
56
|
+
megolm_advance_to(&mr, 0x1000000);
|
|
57
|
+
const std::uint8_t expected2[] = {
|
|
58
|
+
0x54, 0x02, 0x2d, 0x7d, 0xc0, 0x29, 0x8e, 0x16, 0x37, 0xe2, 0x1c, 0x97, 0x15, 0x30, 0x92, 0xf9,
|
|
59
|
+
0x33, 0xc0, 0x56, 0xff, 0x74, 0xfe, 0x1b, 0x92, 0x2d, 0x97, 0x1f, 0x24, 0x82, 0xc2, 0x85, 0x9c,
|
|
60
|
+
0x70, 0x04, 0xc0, 0x1e, 0xe4, 0x9b, 0xd6, 0xef, 0xe0, 0x07, 0x35, 0x25, 0xaf, 0x9b, 0x16, 0x32,
|
|
61
|
+
0xc5, 0xbe, 0x72, 0x6d, 0x12, 0x34, 0x9c, 0xc5, 0xbd, 0x47, 0x2b, 0xdc, 0x2d, 0xf6, 0x54, 0x0f,
|
|
62
|
+
0x31, 0x12, 0x59, 0x11, 0x94, 0xfd, 0xa6, 0x17, 0xe5, 0x68, 0xc6, 0x83, 0x10, 0x1e, 0xae, 0xcd,
|
|
63
|
+
0x7e, 0xdd, 0xd6, 0xde, 0x1f, 0xbc, 0x07, 0x67, 0xae, 0x34, 0xda, 0x1a, 0x09, 0xa5, 0x4e, 0xab,
|
|
64
|
+
0xba, 0x9c, 0xd9, 0x55, 0x74, 0x1d, 0x1c, 0x16, 0x23, 0x23, 0xec, 0x82, 0x5e, 0x7c, 0x5c, 0xe8,
|
|
65
|
+
0x89, 0xbb, 0xb4, 0x23, 0xa1, 0x8f, 0x23, 0x82, 0x8f, 0xb2, 0x09, 0x0d, 0x6e, 0x2a, 0xf8, 0x6a,
|
|
66
|
+
};
|
|
67
|
+
assert_equals(0x1000000U, mr.counter);
|
|
68
|
+
assert_equals(expected2, megolm_get_data(&mr), MEGOLM_RATCHET_LENGTH);
|
|
69
|
+
|
|
70
|
+
megolm_advance_to(&mr, 0x1041506);
|
|
71
|
+
const std::uint8_t expected3[] = {
|
|
72
|
+
0x54, 0x02, 0x2d, 0x7d, 0xc0, 0x29, 0x8e, 0x16, 0x37, 0xe2, 0x1c, 0x97, 0x15, 0x30, 0x92, 0xf9,
|
|
73
|
+
0x33, 0xc0, 0x56, 0xff, 0x74, 0xfe, 0x1b, 0x92, 0x2d, 0x97, 0x1f, 0x24, 0x82, 0xc2, 0x85, 0x9c,
|
|
74
|
+
0x55, 0x58, 0x8d, 0xf5, 0xb7, 0xa4, 0x88, 0x78, 0x42, 0x89, 0x27, 0x86, 0x81, 0x64, 0x58, 0x9f,
|
|
75
|
+
0x36, 0x63, 0x44, 0x7b, 0x51, 0xed, 0xc3, 0x59, 0x5b, 0x03, 0x6c, 0xa6, 0x04, 0xc4, 0x6d, 0xcd,
|
|
76
|
+
0x5c, 0x54, 0x85, 0x0b, 0xfa, 0x98, 0xa1, 0xfd, 0x79, 0xa9, 0xdf, 0x1c, 0xbe, 0x8f, 0xc5, 0x68,
|
|
77
|
+
0x19, 0x37, 0xd3, 0x0c, 0x85, 0xc8, 0xc3, 0x1f, 0x7b, 0xb8, 0x28, 0x81, 0x6c, 0xf9, 0xff, 0x3b,
|
|
78
|
+
0x95, 0x6c, 0xbf, 0x80, 0x7e, 0x65, 0x12, 0x6a, 0x49, 0x55, 0x8d, 0x45, 0xc8, 0x4a, 0x2e, 0x4c,
|
|
79
|
+
0xd5, 0x6f, 0x03, 0xe2, 0x44, 0x16, 0xb9, 0x8e, 0x1c, 0xfd, 0x97, 0xc2, 0x06, 0xaa, 0x90, 0x7a
|
|
80
|
+
};
|
|
81
|
+
assert_equals(0x1041506U, mr.counter);
|
|
82
|
+
assert_equals(expected3, megolm_get_data(&mr), MEGOLM_RATCHET_LENGTH);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
{
|
|
86
|
+
TestCase test_case("Megolm::advance wraparound");
|
|
87
|
+
|
|
88
|
+
Megolm mr1, mr2;
|
|
89
|
+
|
|
90
|
+
megolm_init(&mr1, random_bytes, 0xffffffffUL);
|
|
91
|
+
megolm_advance_to(&mr1, 0x1000000);
|
|
92
|
+
assert_equals(0x1000000U, mr1.counter);
|
|
93
|
+
|
|
94
|
+
megolm_init(&mr2, random_bytes, 0);
|
|
95
|
+
megolm_advance_to(&mr2, 0x2000000);
|
|
96
|
+
assert_equals(0x2000000U, mr2.counter);
|
|
97
|
+
|
|
98
|
+
assert_equals(megolm_get_data(&mr2), megolm_get_data(&mr1), MEGOLM_RATCHET_LENGTH);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
{
|
|
102
|
+
TestCase test_case("Megolm::advance overflow by one");
|
|
103
|
+
|
|
104
|
+
Megolm mr1, mr2;
|
|
105
|
+
|
|
106
|
+
megolm_init(&mr1, random_bytes, 0xffffffffUL);
|
|
107
|
+
megolm_advance_to(&mr1, 0x0);
|
|
108
|
+
assert_equals(0x0U, mr1.counter);
|
|
109
|
+
|
|
110
|
+
megolm_init(&mr2, random_bytes, 0xffffffffUL);
|
|
111
|
+
megolm_advance(&mr2);
|
|
112
|
+
assert_equals(0x0U, mr2.counter);
|
|
113
|
+
|
|
114
|
+
assert_equals(megolm_get_data(&mr2), megolm_get_data(&mr1), MEGOLM_RATCHET_LENGTH);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
{
|
|
118
|
+
TestCase test_case("Megolm::advance overflow");
|
|
119
|
+
|
|
120
|
+
Megolm mr1, mr2;
|
|
121
|
+
|
|
122
|
+
megolm_init(&mr1, random_bytes, 0x1UL);
|
|
123
|
+
megolm_advance_to(&mr1, 0x80000000UL);
|
|
124
|
+
megolm_advance_to(&mr1, 0x0);
|
|
125
|
+
assert_equals(0x0U, mr1.counter);
|
|
126
|
+
|
|
127
|
+
megolm_init(&mr2, random_bytes, 0x1UL);
|
|
128
|
+
megolm_advance_to(&mr2, 0x0UL);
|
|
129
|
+
assert_equals(0x0U, mr2.counter);
|
|
130
|
+
|
|
131
|
+
assert_equals(megolm_get_data(&mr2), megolm_get_data(&mr1), MEGOLM_RATCHET_LENGTH);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
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 "olm/message.hh"
|
|
16
|
+
#include "unittest.hh"
|
|
17
|
+
|
|
18
|
+
int main() {
|
|
19
|
+
|
|
20
|
+
std::uint8_t message1[36] = "\x03\x10\x01\n\nratchetkey\"\nciphertexthmacsha2";
|
|
21
|
+
std::uint8_t message2[36] = "\x03\n\nratchetkey\x10\x01\"\nciphertexthmacsha2";
|
|
22
|
+
std::uint8_t ratchetkey[11] = "ratchetkey";
|
|
23
|
+
std::uint8_t ciphertext[11] = "ciphertext";
|
|
24
|
+
std::uint8_t hmacsha2[9] = "hmacsha2";
|
|
25
|
+
|
|
26
|
+
{ /* Message decode test */
|
|
27
|
+
|
|
28
|
+
TestCase test_case("Message decode test");
|
|
29
|
+
|
|
30
|
+
olm::MessageReader reader;
|
|
31
|
+
olm::decode_message(reader, message1, 35, 8);
|
|
32
|
+
|
|
33
|
+
assert_equals(std::uint8_t(3), reader.version);
|
|
34
|
+
assert_equals(true, reader.has_counter);
|
|
35
|
+
assert_equals(std::uint32_t(1), reader.counter);
|
|
36
|
+
assert_equals(std::size_t(10), reader.ratchet_key_length);
|
|
37
|
+
assert_equals(std::size_t(10), reader.ciphertext_length);
|
|
38
|
+
|
|
39
|
+
assert_equals(ratchetkey, reader.ratchet_key, 10);
|
|
40
|
+
assert_equals(ciphertext, reader.ciphertext, 10);
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
} /* Message decode test */
|
|
44
|
+
|
|
45
|
+
{ /* Message encode test */
|
|
46
|
+
|
|
47
|
+
TestCase test_case("Message encode test");
|
|
48
|
+
|
|
49
|
+
std::size_t length = olm::encode_message_length(1, 10, 10, 8);
|
|
50
|
+
assert_equals(std::size_t(35), length);
|
|
51
|
+
|
|
52
|
+
std::uint8_t output[length];
|
|
53
|
+
|
|
54
|
+
olm::MessageWriter writer;
|
|
55
|
+
olm::encode_message(writer, 3, 1, 10, 10, output);
|
|
56
|
+
|
|
57
|
+
std::memcpy(writer.ratchet_key, ratchetkey, 10);
|
|
58
|
+
std::memcpy(writer.ciphertext, ciphertext, 10);
|
|
59
|
+
std::memcpy(output + length - 8, hmacsha2, 8);
|
|
60
|
+
|
|
61
|
+
assert_equals(message2, output, 35);
|
|
62
|
+
|
|
63
|
+
} /* Message encode test */
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
{ /* group message encode test */
|
|
67
|
+
|
|
68
|
+
TestCase test_case("Group message encode test");
|
|
69
|
+
|
|
70
|
+
size_t length = _olm_encode_group_message_length(200, 10, 8, 64);
|
|
71
|
+
size_t expected_length = 1 + (1+2) + (2+10) + 8 + 64;
|
|
72
|
+
assert_equals(expected_length, length);
|
|
73
|
+
|
|
74
|
+
uint8_t output[50];
|
|
75
|
+
uint8_t *ciphertext_ptr;
|
|
76
|
+
|
|
77
|
+
_olm_encode_group_message(
|
|
78
|
+
3,
|
|
79
|
+
200, // counter
|
|
80
|
+
10, // ciphertext length
|
|
81
|
+
output,
|
|
82
|
+
&ciphertext_ptr
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
uint8_t expected[] =
|
|
86
|
+
"\x03"
|
|
87
|
+
"\x08\xC8\x01"
|
|
88
|
+
"\x12\x0A";
|
|
89
|
+
|
|
90
|
+
assert_equals(expected, output, sizeof(expected)-1);
|
|
91
|
+
assert_equals(output+sizeof(expected)-1, ciphertext_ptr);
|
|
92
|
+
} /* group message encode test */
|
|
93
|
+
|
|
94
|
+
{
|
|
95
|
+
TestCase test_case("Group message decode test");
|
|
96
|
+
|
|
97
|
+
struct _OlmDecodeGroupMessageResults results;
|
|
98
|
+
std::uint8_t message[] =
|
|
99
|
+
"\x03"
|
|
100
|
+
"\x08\xC8\x01"
|
|
101
|
+
"\x12\x0A" "ciphertext"
|
|
102
|
+
"hmacsha2"
|
|
103
|
+
"ed25519signature";
|
|
104
|
+
|
|
105
|
+
_olm_decode_group_message(message, sizeof(message)-1, 8, 16, &results);
|
|
106
|
+
assert_equals(std::uint8_t(3), results.version);
|
|
107
|
+
assert_equals(1, results.has_message_index);
|
|
108
|
+
assert_equals(std::uint32_t(200), results.message_index);
|
|
109
|
+
assert_equals(std::size_t(10), results.ciphertext_length);
|
|
110
|
+
assert_equals(ciphertext, results.ciphertext, 10);
|
|
111
|
+
} /* group message decode test */
|
|
112
|
+
}
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
#include "olm/olm.h"
|
|
2
|
+
#include "unittest.hh"
|
|
3
|
+
|
|
4
|
+
#include <cstddef>
|
|
5
|
+
#include <cstdint>
|
|
6
|
+
#include <cstring>
|
|
7
|
+
|
|
8
|
+
struct MockRandom {
|
|
9
|
+
MockRandom(std::uint8_t tag, std::uint8_t offset = 0)
|
|
10
|
+
: tag(tag), current(offset) {}
|
|
11
|
+
void operator()(
|
|
12
|
+
std::uint8_t * bytes, std::size_t length
|
|
13
|
+
) {
|
|
14
|
+
while (length > 32) {
|
|
15
|
+
bytes[0] = tag;
|
|
16
|
+
std::memset(bytes + 1, current, 31);
|
|
17
|
+
length -= 32;
|
|
18
|
+
bytes += 32;
|
|
19
|
+
current += 1;
|
|
20
|
+
}
|
|
21
|
+
if (length) {
|
|
22
|
+
bytes[0] = tag;
|
|
23
|
+
std::memset(bytes + 1, current, length - 1);
|
|
24
|
+
current += 1;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
std::uint8_t tag;
|
|
28
|
+
std::uint8_t current;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
int main() {
|
|
32
|
+
|
|
33
|
+
{ /** Pickle account test */
|
|
34
|
+
|
|
35
|
+
TestCase test_case("Pickle account test");
|
|
36
|
+
MockRandom mock_random('P');
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
std::uint8_t account_buffer[::olm_account_size()];
|
|
40
|
+
::OlmAccount *account = ::olm_account(account_buffer);
|
|
41
|
+
std::uint8_t random[::olm_create_account_random_length(account)];
|
|
42
|
+
mock_random(random, sizeof(random));
|
|
43
|
+
::olm_create_account(account, random, sizeof(random));
|
|
44
|
+
std::uint8_t ot_random[::olm_account_generate_one_time_keys_random_length(
|
|
45
|
+
account, 42
|
|
46
|
+
)];
|
|
47
|
+
mock_random(ot_random, sizeof(ot_random));
|
|
48
|
+
::olm_account_generate_one_time_keys(account, 42, ot_random, sizeof(ot_random));
|
|
49
|
+
|
|
50
|
+
std::size_t pickle_length = ::olm_pickle_account_length(account);
|
|
51
|
+
std::uint8_t pickle1[pickle_length];
|
|
52
|
+
std::size_t res = ::olm_pickle_account(account, "secret_key", 10, pickle1, pickle_length);
|
|
53
|
+
assert_equals(pickle_length, res);
|
|
54
|
+
|
|
55
|
+
std::uint8_t pickle2[pickle_length];
|
|
56
|
+
std::memcpy(pickle2, pickle1, pickle_length);
|
|
57
|
+
|
|
58
|
+
std::uint8_t account_buffer2[::olm_account_size()];
|
|
59
|
+
::OlmAccount *account2 = ::olm_account(account_buffer2);
|
|
60
|
+
assert_not_equals(std::size_t(-1), ::olm_unpickle_account(
|
|
61
|
+
account2, "secret_key", 10, pickle2, pickle_length
|
|
62
|
+
));
|
|
63
|
+
assert_equals(pickle_length, ::olm_pickle_account_length(account2));
|
|
64
|
+
res = ::olm_pickle_account(account2, "secret_key", 10, pickle2, pickle_length);
|
|
65
|
+
assert_equals(pickle_length, res);
|
|
66
|
+
|
|
67
|
+
assert_equals(pickle1, pickle2, pickle_length);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
{
|
|
72
|
+
TestCase test_case("Old account unpickle test");
|
|
73
|
+
|
|
74
|
+
// this uses the old pickle format, which did not use enough space
|
|
75
|
+
// for the Ed25519 key. We should reject it.
|
|
76
|
+
std::uint8_t pickle[] =
|
|
77
|
+
"x3h9er86ygvq56pM1yesdAxZou4ResPQC9Rszk/fhEL9JY/umtZ2N/foL/SUgVXS"
|
|
78
|
+
"v0IxHHZTafYjDdzJU9xr8dQeBoOTGfV9E/lCqDGBnIlu7SZndqjEKXtzGyQr4sP4"
|
|
79
|
+
"K/A/8TOu9iK2hDFszy6xETiousHnHgh2ZGbRUh4pQx+YMm8ZdNZeRnwFGLnrWyf9"
|
|
80
|
+
"O5TmXua1FcU";
|
|
81
|
+
|
|
82
|
+
std::uint8_t account_buffer[::olm_account_size()];
|
|
83
|
+
::OlmAccount *account = ::olm_account(account_buffer);
|
|
84
|
+
assert_equals(
|
|
85
|
+
std::size_t(-1),
|
|
86
|
+
::olm_unpickle_account(
|
|
87
|
+
account, "", 0, pickle, sizeof(pickle)-1
|
|
88
|
+
)
|
|
89
|
+
);
|
|
90
|
+
assert_equals(
|
|
91
|
+
std::string("BAD_LEGACY_ACCOUNT_PICKLE"),
|
|
92
|
+
std::string(::olm_account_last_error(account))
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
{ /** Pickle session test */
|
|
98
|
+
|
|
99
|
+
TestCase test_case("Pickle session test");
|
|
100
|
+
MockRandom mock_random('P');
|
|
101
|
+
|
|
102
|
+
std::uint8_t account_buffer[::olm_account_size()];
|
|
103
|
+
::OlmAccount *account = ::olm_account(account_buffer);
|
|
104
|
+
std::uint8_t random[::olm_create_account_random_length(account)];
|
|
105
|
+
mock_random(random, sizeof(random));
|
|
106
|
+
::olm_create_account(account, random, sizeof(random));
|
|
107
|
+
|
|
108
|
+
std::uint8_t session_buffer[::olm_session_size()];
|
|
109
|
+
::OlmSession *session = ::olm_session(session_buffer);
|
|
110
|
+
std::uint8_t identity_key[32];
|
|
111
|
+
std::uint8_t one_time_key[32];
|
|
112
|
+
mock_random(identity_key, sizeof(identity_key));
|
|
113
|
+
mock_random(one_time_key, sizeof(one_time_key));
|
|
114
|
+
std::uint8_t random2[::olm_create_outbound_session_random_length(session)];
|
|
115
|
+
mock_random(random2, sizeof(random2));
|
|
116
|
+
|
|
117
|
+
::olm_create_outbound_session(
|
|
118
|
+
session, account,
|
|
119
|
+
identity_key, sizeof(identity_key),
|
|
120
|
+
one_time_key, sizeof(one_time_key),
|
|
121
|
+
random2, sizeof(random2)
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
std::size_t pickle_length = ::olm_pickle_session_length(session);
|
|
126
|
+
std::uint8_t pickle1[pickle_length];
|
|
127
|
+
std::size_t res = ::olm_pickle_session(session, "secret_key", 10, pickle1, pickle_length);
|
|
128
|
+
assert_equals(pickle_length, res);
|
|
129
|
+
|
|
130
|
+
std::uint8_t pickle2[pickle_length];
|
|
131
|
+
std::memcpy(pickle2, pickle1, pickle_length);
|
|
132
|
+
|
|
133
|
+
std::uint8_t session_buffer2[::olm_session_size()];
|
|
134
|
+
::OlmSession *session2 = ::olm_session(session_buffer2);
|
|
135
|
+
assert_not_equals(std::size_t(-1), ::olm_unpickle_session(
|
|
136
|
+
session2, "secret_key", 10, pickle2, pickle_length
|
|
137
|
+
));
|
|
138
|
+
assert_equals(pickle_length, ::olm_pickle_session_length(session2));
|
|
139
|
+
res = ::olm_pickle_session(session2, "secret_key", 10, pickle2, pickle_length);
|
|
140
|
+
assert_equals(pickle_length, res);
|
|
141
|
+
|
|
142
|
+
assert_equals(pickle1, pickle2, pickle_length);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
{ /** Loopback test */
|
|
146
|
+
|
|
147
|
+
TestCase test_case("Loopback test");
|
|
148
|
+
MockRandom mock_random_a('A', 0x00);
|
|
149
|
+
MockRandom mock_random_b('B', 0x80);
|
|
150
|
+
|
|
151
|
+
std::uint8_t a_account_buffer[::olm_account_size()];
|
|
152
|
+
::OlmAccount *a_account = ::olm_account(a_account_buffer);
|
|
153
|
+
std::uint8_t a_random[::olm_create_account_random_length(a_account)];
|
|
154
|
+
mock_random_a(a_random, sizeof(a_random));
|
|
155
|
+
::olm_create_account(a_account, a_random, sizeof(a_random));
|
|
156
|
+
|
|
157
|
+
std::uint8_t b_account_buffer[::olm_account_size()];
|
|
158
|
+
::OlmAccount *b_account = ::olm_account(b_account_buffer);
|
|
159
|
+
std::uint8_t b_random[::olm_create_account_random_length(b_account)];
|
|
160
|
+
mock_random_b(b_random, sizeof(b_random));
|
|
161
|
+
::olm_create_account(b_account, b_random, sizeof(b_random));
|
|
162
|
+
std::uint8_t o_random[::olm_account_generate_one_time_keys_random_length(
|
|
163
|
+
b_account, 42
|
|
164
|
+
)];
|
|
165
|
+
mock_random_b(o_random, sizeof(o_random));
|
|
166
|
+
::olm_account_generate_one_time_keys(b_account, 42, o_random, sizeof(o_random));
|
|
167
|
+
|
|
168
|
+
std::uint8_t a_id_keys[::olm_account_identity_keys_length(a_account)];
|
|
169
|
+
::olm_account_identity_keys(a_account, a_id_keys, sizeof(a_id_keys));
|
|
170
|
+
|
|
171
|
+
std::uint8_t b_id_keys[::olm_account_identity_keys_length(b_account)];
|
|
172
|
+
std::uint8_t b_ot_keys[::olm_account_one_time_keys_length(b_account)];
|
|
173
|
+
::olm_account_identity_keys(b_account, b_id_keys, sizeof(b_id_keys));
|
|
174
|
+
::olm_account_one_time_keys(b_account, b_ot_keys, sizeof(b_ot_keys));
|
|
175
|
+
|
|
176
|
+
std::uint8_t a_session_buffer[::olm_session_size()];
|
|
177
|
+
::OlmSession *a_session = ::olm_session(a_session_buffer);
|
|
178
|
+
std::uint8_t a_rand[::olm_create_outbound_session_random_length(a_session)];
|
|
179
|
+
mock_random_a(a_rand, sizeof(a_rand));
|
|
180
|
+
assert_not_equals(std::size_t(-1), ::olm_create_outbound_session(
|
|
181
|
+
a_session, a_account,
|
|
182
|
+
b_id_keys + 15, 43, // B's curve25519 identity key
|
|
183
|
+
b_ot_keys + 25, 43, // B's curve25519 one time key
|
|
184
|
+
a_rand, sizeof(a_rand)
|
|
185
|
+
));
|
|
186
|
+
|
|
187
|
+
std::uint8_t plaintext[] = "Hello, World";
|
|
188
|
+
std::uint8_t message_1[::olm_encrypt_message_length(a_session, 12)];
|
|
189
|
+
std::uint8_t a_message_random[::olm_encrypt_random_length(a_session)];
|
|
190
|
+
mock_random_a(a_message_random, sizeof(a_message_random));
|
|
191
|
+
assert_equals(std::size_t(0), ::olm_encrypt_message_type(a_session));
|
|
192
|
+
assert_not_equals(std::size_t(-1), ::olm_encrypt(
|
|
193
|
+
a_session,
|
|
194
|
+
plaintext, 12,
|
|
195
|
+
a_message_random, sizeof(a_message_random),
|
|
196
|
+
message_1, sizeof(message_1)
|
|
197
|
+
));
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
std::uint8_t tmp_message_1[sizeof(message_1)];
|
|
201
|
+
std::memcpy(tmp_message_1, message_1, sizeof(message_1));
|
|
202
|
+
std::uint8_t b_session_buffer[::olm_account_size()];
|
|
203
|
+
::OlmSession *b_session = ::olm_session(b_session_buffer);
|
|
204
|
+
::olm_create_inbound_session(
|
|
205
|
+
b_session, b_account, tmp_message_1, sizeof(message_1)
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
// Check that the inbound session matches the message it was created from.
|
|
209
|
+
std::memcpy(tmp_message_1, message_1, sizeof(message_1));
|
|
210
|
+
assert_equals(std::size_t(1), ::olm_matches_inbound_session(
|
|
211
|
+
b_session,
|
|
212
|
+
tmp_message_1, sizeof(message_1)
|
|
213
|
+
));
|
|
214
|
+
|
|
215
|
+
// Check that the inbound session matches the key this message is supposed
|
|
216
|
+
// to be from.
|
|
217
|
+
std::memcpy(tmp_message_1, message_1, sizeof(message_1));
|
|
218
|
+
assert_equals(std::size_t(1), ::olm_matches_inbound_session_from(
|
|
219
|
+
b_session,
|
|
220
|
+
a_id_keys + 15, 43, // A's curve125519 identity key.
|
|
221
|
+
tmp_message_1, sizeof(message_1)
|
|
222
|
+
));
|
|
223
|
+
|
|
224
|
+
// Check that the inbound session isn't from a different user.
|
|
225
|
+
std::memcpy(tmp_message_1, message_1, sizeof(message_1));
|
|
226
|
+
assert_equals(std::size_t(0), ::olm_matches_inbound_session_from(
|
|
227
|
+
b_session,
|
|
228
|
+
b_id_keys + 15, 43, // B's curve25519 identity key.
|
|
229
|
+
tmp_message_1, sizeof(message_1)
|
|
230
|
+
));
|
|
231
|
+
|
|
232
|
+
// Check that we can decrypt the message.
|
|
233
|
+
std::memcpy(tmp_message_1, message_1, sizeof(message_1));
|
|
234
|
+
std::uint8_t plaintext_1[::olm_decrypt_max_plaintext_length(
|
|
235
|
+
b_session, 0, tmp_message_1, sizeof(message_1)
|
|
236
|
+
)];
|
|
237
|
+
std::memcpy(tmp_message_1, message_1, sizeof(message_1));
|
|
238
|
+
assert_equals(std::size_t(12), ::olm_decrypt(
|
|
239
|
+
b_session, 0,
|
|
240
|
+
tmp_message_1, sizeof(message_1),
|
|
241
|
+
plaintext_1, sizeof(plaintext_1)
|
|
242
|
+
));
|
|
243
|
+
|
|
244
|
+
assert_equals(plaintext, plaintext_1, 12);
|
|
245
|
+
|
|
246
|
+
std::uint8_t message_2[::olm_encrypt_message_length(b_session, 12)];
|
|
247
|
+
std::uint8_t b_message_random[::olm_encrypt_random_length(b_session)];
|
|
248
|
+
mock_random_b(b_message_random, sizeof(b_message_random));
|
|
249
|
+
assert_equals(std::size_t(1), ::olm_encrypt_message_type(b_session));
|
|
250
|
+
assert_not_equals(std::size_t(-1), ::olm_encrypt(
|
|
251
|
+
b_session,
|
|
252
|
+
plaintext, 12,
|
|
253
|
+
b_message_random, sizeof(b_message_random),
|
|
254
|
+
message_2, sizeof(message_2)
|
|
255
|
+
));
|
|
256
|
+
|
|
257
|
+
std::uint8_t tmp_message_2[sizeof(message_2)];
|
|
258
|
+
std::memcpy(tmp_message_2, message_2, sizeof(message_2));
|
|
259
|
+
std::uint8_t plaintext_2[::olm_decrypt_max_plaintext_length(
|
|
260
|
+
a_session, 1, tmp_message_2, sizeof(message_2)
|
|
261
|
+
)];
|
|
262
|
+
std::memcpy(tmp_message_2, message_2, sizeof(message_2));
|
|
263
|
+
assert_equals(std::size_t(12), ::olm_decrypt(
|
|
264
|
+
a_session, 1,
|
|
265
|
+
tmp_message_2, sizeof(message_2),
|
|
266
|
+
plaintext_2, sizeof(plaintext_2)
|
|
267
|
+
));
|
|
268
|
+
|
|
269
|
+
assert_equals(plaintext, plaintext_2, 12);
|
|
270
|
+
|
|
271
|
+
std::memcpy(tmp_message_2, message_2, sizeof(message_2));
|
|
272
|
+
assert_equals(std::size_t(-1), ::olm_decrypt(
|
|
273
|
+
a_session, 1,
|
|
274
|
+
tmp_message_2, sizeof(message_2),
|
|
275
|
+
plaintext_2, sizeof(plaintext_2)
|
|
276
|
+
));
|
|
277
|
+
|
|
278
|
+
std::uint8_t a_session_id[::olm_session_id_length(a_session)];
|
|
279
|
+
assert_not_equals(std::size_t(-1), ::olm_session_id(
|
|
280
|
+
a_session, a_session_id, sizeof(a_session_id)
|
|
281
|
+
));
|
|
282
|
+
|
|
283
|
+
std::uint8_t b_session_id[::olm_session_id_length(b_session)];
|
|
284
|
+
assert_not_equals(std::size_t(-1), ::olm_session_id(
|
|
285
|
+
b_session, b_session_id, sizeof(b_session_id)
|
|
286
|
+
));
|
|
287
|
+
|
|
288
|
+
assert_equals(sizeof(a_session_id), sizeof(b_session_id));
|
|
289
|
+
assert_equals(a_session_id, b_session_id, sizeof(b_session_id));
|
|
290
|
+
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
{ /** More messages test */
|
|
294
|
+
|
|
295
|
+
TestCase test_case("More messages test");
|
|
296
|
+
MockRandom mock_random_a('A', 0x00);
|
|
297
|
+
MockRandom mock_random_b('B', 0x80);
|
|
298
|
+
|
|
299
|
+
std::uint8_t a_account_buffer[::olm_account_size()];
|
|
300
|
+
::OlmAccount *a_account = ::olm_account(a_account_buffer);
|
|
301
|
+
std::uint8_t a_random[::olm_create_account_random_length(a_account)];
|
|
302
|
+
mock_random_a(a_random, sizeof(a_random));
|
|
303
|
+
::olm_create_account(a_account, a_random, sizeof(a_random));
|
|
304
|
+
|
|
305
|
+
std::uint8_t b_account_buffer[::olm_account_size()];
|
|
306
|
+
::OlmAccount *b_account = ::olm_account(b_account_buffer);
|
|
307
|
+
std::uint8_t b_random[::olm_create_account_random_length(b_account)];
|
|
308
|
+
mock_random_b(b_random, sizeof(b_random));
|
|
309
|
+
::olm_create_account(b_account, b_random, sizeof(b_random));
|
|
310
|
+
std::uint8_t o_random[::olm_account_generate_one_time_keys_random_length(
|
|
311
|
+
b_account, 42
|
|
312
|
+
)];
|
|
313
|
+
mock_random_b(o_random, sizeof(o_random));
|
|
314
|
+
::olm_account_generate_one_time_keys(b_account, 42, o_random, sizeof(o_random));
|
|
315
|
+
|
|
316
|
+
std::uint8_t b_id_keys[::olm_account_identity_keys_length(b_account)];
|
|
317
|
+
std::uint8_t b_ot_keys[::olm_account_one_time_keys_length(b_account)];
|
|
318
|
+
::olm_account_identity_keys(b_account, b_id_keys, sizeof(b_id_keys));
|
|
319
|
+
::olm_account_one_time_keys(b_account, b_ot_keys, sizeof(b_ot_keys));
|
|
320
|
+
|
|
321
|
+
std::uint8_t a_session_buffer[::olm_session_size()];
|
|
322
|
+
::OlmSession *a_session = ::olm_session(a_session_buffer);
|
|
323
|
+
std::uint8_t a_rand[::olm_create_outbound_session_random_length(a_session)];
|
|
324
|
+
mock_random_a(a_rand, sizeof(a_rand));
|
|
325
|
+
assert_not_equals(std::size_t(-1), ::olm_create_outbound_session(
|
|
326
|
+
a_session, a_account,
|
|
327
|
+
b_id_keys + 15, 43,
|
|
328
|
+
b_ot_keys + 25, 43,
|
|
329
|
+
a_rand, sizeof(a_rand)
|
|
330
|
+
));
|
|
331
|
+
|
|
332
|
+
std::uint8_t plaintext[] = "Hello, World";
|
|
333
|
+
std::uint8_t message_1[::olm_encrypt_message_length(a_session, 12)];
|
|
334
|
+
std::uint8_t a_message_random[::olm_encrypt_random_length(a_session)];
|
|
335
|
+
mock_random_a(a_message_random, sizeof(a_message_random));
|
|
336
|
+
assert_equals(std::size_t(0), ::olm_encrypt_message_type(a_session));
|
|
337
|
+
assert_not_equals(std::size_t(-1), ::olm_encrypt(
|
|
338
|
+
a_session,
|
|
339
|
+
plaintext, 12,
|
|
340
|
+
a_message_random, sizeof(a_message_random),
|
|
341
|
+
message_1, sizeof(message_1)
|
|
342
|
+
));
|
|
343
|
+
|
|
344
|
+
std::uint8_t tmp_message_1[sizeof(message_1)];
|
|
345
|
+
std::memcpy(tmp_message_1, message_1, sizeof(message_1));
|
|
346
|
+
std::uint8_t b_session_buffer[::olm_account_size()];
|
|
347
|
+
::OlmSession *b_session = ::olm_session(b_session_buffer);
|
|
348
|
+
::olm_create_inbound_session(
|
|
349
|
+
b_session, b_account, tmp_message_1, sizeof(message_1)
|
|
350
|
+
);
|
|
351
|
+
|
|
352
|
+
std::memcpy(tmp_message_1, message_1, sizeof(message_1));
|
|
353
|
+
std::uint8_t plaintext_1[::olm_decrypt_max_plaintext_length(
|
|
354
|
+
b_session, 0, tmp_message_1, sizeof(message_1)
|
|
355
|
+
)];
|
|
356
|
+
std::memcpy(tmp_message_1, message_1, sizeof(message_1));
|
|
357
|
+
assert_equals(std::size_t(12), ::olm_decrypt(
|
|
358
|
+
b_session, 0,
|
|
359
|
+
tmp_message_1, sizeof(message_1),
|
|
360
|
+
plaintext_1, sizeof(plaintext_1)
|
|
361
|
+
));
|
|
362
|
+
|
|
363
|
+
for (unsigned i = 0; i < 8; ++i) {
|
|
364
|
+
{
|
|
365
|
+
std::uint8_t msg_a[::olm_encrypt_message_length(a_session, 12)];
|
|
366
|
+
std::uint8_t rnd_a[::olm_encrypt_random_length(a_session)];
|
|
367
|
+
mock_random_a(rnd_a, sizeof(rnd_a));
|
|
368
|
+
std::size_t type_a = ::olm_encrypt_message_type(a_session);
|
|
369
|
+
assert_not_equals(std::size_t(-1), ::olm_encrypt(
|
|
370
|
+
a_session, plaintext, 12, rnd_a, sizeof(rnd_a), msg_a, sizeof(msg_a)
|
|
371
|
+
));
|
|
372
|
+
|
|
373
|
+
std::uint8_t tmp_a[sizeof(msg_a)];
|
|
374
|
+
std::memcpy(tmp_a, msg_a, sizeof(msg_a));
|
|
375
|
+
std::uint8_t out_a[::olm_decrypt_max_plaintext_length(
|
|
376
|
+
b_session, type_a, tmp_a, sizeof(tmp_a)
|
|
377
|
+
)];
|
|
378
|
+
std::memcpy(tmp_a, msg_a, sizeof(msg_a));
|
|
379
|
+
assert_equals(std::size_t(12), ::olm_decrypt(
|
|
380
|
+
b_session, type_a, msg_a, sizeof(msg_a), out_a, sizeof(out_a)
|
|
381
|
+
));
|
|
382
|
+
}
|
|
383
|
+
{
|
|
384
|
+
std::uint8_t msg_b[::olm_encrypt_message_length(b_session, 12)];
|
|
385
|
+
std::uint8_t rnd_b[::olm_encrypt_random_length(b_session)];
|
|
386
|
+
mock_random_b(rnd_b, sizeof(rnd_b));
|
|
387
|
+
std::size_t type_b = ::olm_encrypt_message_type(b_session);
|
|
388
|
+
assert_not_equals(std::size_t(-1), ::olm_encrypt(
|
|
389
|
+
b_session, plaintext, 12, rnd_b, sizeof(rnd_b), msg_b, sizeof(msg_b)
|
|
390
|
+
));
|
|
391
|
+
|
|
392
|
+
std::uint8_t tmp_b[sizeof(msg_b)];
|
|
393
|
+
std::memcpy(tmp_b, msg_b, sizeof(msg_b));
|
|
394
|
+
std::uint8_t out_b[::olm_decrypt_max_plaintext_length(
|
|
395
|
+
a_session, type_b, tmp_b, sizeof(tmp_b)
|
|
396
|
+
)];
|
|
397
|
+
std::memcpy(tmp_b, msg_b, sizeof(msg_b));
|
|
398
|
+
assert_equals(std::size_t(12), ::olm_decrypt(
|
|
399
|
+
a_session, type_b, msg_b, sizeof(msg_b), out_b, sizeof(out_b)
|
|
400
|
+
));
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
}
|