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,412 @@
|
|
|
1
|
+
/* Copyright 2018 New Vector 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/pk.h"
|
|
16
|
+
#include "olm/cipher.h"
|
|
17
|
+
#include "olm/crypto.h"
|
|
18
|
+
#include "olm/ratchet.hh"
|
|
19
|
+
#include "olm/error.h"
|
|
20
|
+
#include "olm/memory.hh"
|
|
21
|
+
#include "olm/base64.hh"
|
|
22
|
+
#include "olm/pickle_encoding.h"
|
|
23
|
+
#include "olm/pickle.hh"
|
|
24
|
+
|
|
25
|
+
static const std::size_t MAC_LENGTH = 8;
|
|
26
|
+
|
|
27
|
+
const struct _olm_cipher_aes_sha_256 olm_pk_cipher_aes_sha256 =
|
|
28
|
+
OLM_CIPHER_INIT_AES_SHA_256("");
|
|
29
|
+
const struct _olm_cipher *olm_pk_cipher =
|
|
30
|
+
OLM_CIPHER_BASE(&olm_pk_cipher_aes_sha256);
|
|
31
|
+
|
|
32
|
+
extern "C" {
|
|
33
|
+
|
|
34
|
+
struct OlmPkEncryption {
|
|
35
|
+
OlmErrorCode last_error;
|
|
36
|
+
_olm_curve25519_public_key recipient_key;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const char * olm_pk_encryption_last_error(
|
|
40
|
+
OlmPkEncryption * encryption
|
|
41
|
+
) {
|
|
42
|
+
auto error = encryption->last_error;
|
|
43
|
+
return _olm_error_to_string(error);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
size_t olm_pk_encryption_size(void) {
|
|
47
|
+
return sizeof(OlmPkEncryption);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
OlmPkEncryption *olm_pk_encryption(
|
|
51
|
+
void * memory
|
|
52
|
+
) {
|
|
53
|
+
olm::unset(memory, sizeof(OlmPkEncryption));
|
|
54
|
+
return new(memory) OlmPkEncryption;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
size_t olm_clear_pk_encryption(
|
|
58
|
+
OlmPkEncryption *encryption
|
|
59
|
+
) {
|
|
60
|
+
/* Clear the memory backing the encryption */
|
|
61
|
+
olm::unset(encryption, sizeof(OlmPkEncryption));
|
|
62
|
+
/* Initialise a fresh encryption object in case someone tries to use it */
|
|
63
|
+
new(encryption) OlmPkEncryption();
|
|
64
|
+
return sizeof(OlmPkEncryption);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
size_t olm_pk_encryption_set_recipient_key (
|
|
68
|
+
OlmPkEncryption *encryption,
|
|
69
|
+
void const * key, size_t key_length
|
|
70
|
+
) {
|
|
71
|
+
if (key_length < olm_pk_key_length()) {
|
|
72
|
+
encryption->last_error =
|
|
73
|
+
OlmErrorCode::OLM_INPUT_BUFFER_TOO_SMALL;
|
|
74
|
+
return std::size_t(-1);
|
|
75
|
+
}
|
|
76
|
+
olm::decode_base64(
|
|
77
|
+
(const uint8_t*)key,
|
|
78
|
+
olm_pk_key_length(),
|
|
79
|
+
(uint8_t *)encryption->recipient_key.public_key
|
|
80
|
+
);
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
size_t olm_pk_ciphertext_length(
|
|
85
|
+
OlmPkEncryption *encryption,
|
|
86
|
+
size_t plaintext_length
|
|
87
|
+
) {
|
|
88
|
+
return olm::encode_base64_length(
|
|
89
|
+
_olm_cipher_aes_sha_256_ops.encrypt_ciphertext_length(olm_pk_cipher, plaintext_length)
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
size_t olm_pk_mac_length(
|
|
94
|
+
OlmPkEncryption *encryption
|
|
95
|
+
) {
|
|
96
|
+
return olm::encode_base64_length(_olm_cipher_aes_sha_256_ops.mac_length(olm_pk_cipher));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
size_t olm_pk_encrypt_random_length(
|
|
100
|
+
OlmPkEncryption *encryption
|
|
101
|
+
) {
|
|
102
|
+
return CURVE25519_KEY_LENGTH;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
size_t olm_pk_encrypt(
|
|
106
|
+
OlmPkEncryption *encryption,
|
|
107
|
+
void const * plaintext, size_t plaintext_length,
|
|
108
|
+
void * ciphertext, size_t ciphertext_length,
|
|
109
|
+
void * mac, size_t mac_length,
|
|
110
|
+
void * ephemeral_key, size_t ephemeral_key_size,
|
|
111
|
+
void * random, size_t random_length
|
|
112
|
+
) {
|
|
113
|
+
if (ciphertext_length
|
|
114
|
+
< olm_pk_ciphertext_length(encryption, plaintext_length)
|
|
115
|
+
|| mac_length
|
|
116
|
+
< _olm_cipher_aes_sha_256_ops.mac_length(olm_pk_cipher)
|
|
117
|
+
|| ephemeral_key_size
|
|
118
|
+
< olm_pk_key_length()) {
|
|
119
|
+
encryption->last_error =
|
|
120
|
+
OlmErrorCode::OLM_OUTPUT_BUFFER_TOO_SMALL;
|
|
121
|
+
return std::size_t(-1);
|
|
122
|
+
}
|
|
123
|
+
if (random_length < olm_pk_encrypt_random_length(encryption)) {
|
|
124
|
+
encryption->last_error =
|
|
125
|
+
OlmErrorCode::OLM_NOT_ENOUGH_RANDOM;
|
|
126
|
+
return std::size_t(-1);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
_olm_curve25519_key_pair ephemeral_keypair;
|
|
130
|
+
_olm_crypto_curve25519_generate_key((uint8_t *) random, &ephemeral_keypair);
|
|
131
|
+
olm::encode_base64(
|
|
132
|
+
(const uint8_t *)ephemeral_keypair.public_key.public_key,
|
|
133
|
+
CURVE25519_KEY_LENGTH,
|
|
134
|
+
(uint8_t *)ephemeral_key
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
olm::SharedKey secret;
|
|
138
|
+
_olm_crypto_curve25519_shared_secret(&ephemeral_keypair, &encryption->recipient_key, secret);
|
|
139
|
+
size_t raw_ciphertext_length =
|
|
140
|
+
_olm_cipher_aes_sha_256_ops.encrypt_ciphertext_length(olm_pk_cipher, plaintext_length);
|
|
141
|
+
uint8_t *ciphertext_pos = (uint8_t *) ciphertext + ciphertext_length - raw_ciphertext_length;
|
|
142
|
+
uint8_t raw_mac[MAC_LENGTH];
|
|
143
|
+
size_t result = _olm_cipher_aes_sha_256_ops.encrypt(
|
|
144
|
+
olm_pk_cipher,
|
|
145
|
+
secret, sizeof(secret),
|
|
146
|
+
(const uint8_t *) plaintext, plaintext_length,
|
|
147
|
+
(uint8_t *) ciphertext_pos, raw_ciphertext_length,
|
|
148
|
+
(uint8_t *) raw_mac, MAC_LENGTH
|
|
149
|
+
);
|
|
150
|
+
if (result != std::size_t(-1)) {
|
|
151
|
+
olm::encode_base64(raw_mac, MAC_LENGTH, (uint8_t *)mac);
|
|
152
|
+
olm::encode_base64(ciphertext_pos, raw_ciphertext_length, (uint8_t *)ciphertext);
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
struct OlmPkDecryption {
|
|
158
|
+
OlmErrorCode last_error;
|
|
159
|
+
_olm_curve25519_key_pair key_pair;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
const char * olm_pk_decryption_last_error(
|
|
163
|
+
OlmPkDecryption * decryption
|
|
164
|
+
) {
|
|
165
|
+
auto error = decryption->last_error;
|
|
166
|
+
return _olm_error_to_string(error);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
size_t olm_pk_decryption_size(void) {
|
|
170
|
+
return sizeof(OlmPkDecryption);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
OlmPkDecryption *olm_pk_decryption(
|
|
174
|
+
void * memory
|
|
175
|
+
) {
|
|
176
|
+
olm::unset(memory, sizeof(OlmPkDecryption));
|
|
177
|
+
return new(memory) OlmPkDecryption;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
size_t olm_clear_pk_decryption(
|
|
181
|
+
OlmPkDecryption *decryption
|
|
182
|
+
) {
|
|
183
|
+
/* Clear the memory backing the decryption */
|
|
184
|
+
olm::unset(decryption, sizeof(OlmPkDecryption));
|
|
185
|
+
/* Initialise a fresh decryption object in case someone tries to use it */
|
|
186
|
+
new(decryption) OlmPkDecryption();
|
|
187
|
+
return sizeof(OlmPkDecryption);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
size_t olm_pk_private_key_length(void) {
|
|
191
|
+
return CURVE25519_KEY_LENGTH;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
size_t olm_pk_generate_key_random_length(void) {
|
|
195
|
+
return olm_pk_private_key_length();
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
size_t olm_pk_key_length(void) {
|
|
199
|
+
return olm::encode_base64_length(CURVE25519_KEY_LENGTH);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
size_t olm_pk_key_from_private(
|
|
203
|
+
OlmPkDecryption * decryption,
|
|
204
|
+
void * pubkey, size_t pubkey_length,
|
|
205
|
+
void * privkey, size_t privkey_length
|
|
206
|
+
) {
|
|
207
|
+
if (pubkey_length < olm_pk_key_length()) {
|
|
208
|
+
decryption->last_error =
|
|
209
|
+
OlmErrorCode::OLM_OUTPUT_BUFFER_TOO_SMALL;
|
|
210
|
+
return std::size_t(-1);
|
|
211
|
+
}
|
|
212
|
+
if (privkey_length < olm_pk_private_key_length()) {
|
|
213
|
+
decryption->last_error =
|
|
214
|
+
OlmErrorCode::OLM_INPUT_BUFFER_TOO_SMALL;
|
|
215
|
+
return std::size_t(-1);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
_olm_crypto_curve25519_generate_key((uint8_t *) privkey, &decryption->key_pair);
|
|
219
|
+
olm::encode_base64(
|
|
220
|
+
(const uint8_t *)decryption->key_pair.public_key.public_key,
|
|
221
|
+
CURVE25519_KEY_LENGTH,
|
|
222
|
+
(uint8_t *)pubkey
|
|
223
|
+
);
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
size_t olm_pk_generate_key(
|
|
228
|
+
OlmPkDecryption * decryption,
|
|
229
|
+
void * pubkey, size_t pubkey_length,
|
|
230
|
+
void * privkey, size_t privkey_length
|
|
231
|
+
) {
|
|
232
|
+
return olm_pk_key_from_private(decryption, pubkey, pubkey_length, privkey, privkey_length);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
namespace {
|
|
236
|
+
static const std::uint32_t PK_DECRYPTION_PICKLE_VERSION = 1;
|
|
237
|
+
|
|
238
|
+
static std::size_t pickle_length(
|
|
239
|
+
OlmPkDecryption const & value
|
|
240
|
+
) {
|
|
241
|
+
std::size_t length = 0;
|
|
242
|
+
length += olm::pickle_length(PK_DECRYPTION_PICKLE_VERSION);
|
|
243
|
+
length += olm::pickle_length(value.key_pair);
|
|
244
|
+
return length;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
static std::uint8_t * pickle(
|
|
249
|
+
std::uint8_t * pos,
|
|
250
|
+
OlmPkDecryption const & value
|
|
251
|
+
) {
|
|
252
|
+
pos = olm::pickle(pos, PK_DECRYPTION_PICKLE_VERSION);
|
|
253
|
+
pos = olm::pickle(pos, value.key_pair);
|
|
254
|
+
return pos;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
static std::uint8_t const * unpickle(
|
|
259
|
+
std::uint8_t const * pos, std::uint8_t const * end,
|
|
260
|
+
OlmPkDecryption & value
|
|
261
|
+
) {
|
|
262
|
+
uint32_t pickle_version;
|
|
263
|
+
pos = olm::unpickle(pos, end, pickle_version);
|
|
264
|
+
|
|
265
|
+
switch (pickle_version) {
|
|
266
|
+
case 1:
|
|
267
|
+
break;
|
|
268
|
+
|
|
269
|
+
default:
|
|
270
|
+
value.last_error = OlmErrorCode::OLM_UNKNOWN_PICKLE_VERSION;
|
|
271
|
+
return end;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
pos = olm::unpickle(pos, end, value.key_pair);
|
|
275
|
+
return pos;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
size_t olm_pickle_pk_decryption_length(
|
|
280
|
+
OlmPkDecryption * decryption
|
|
281
|
+
) {
|
|
282
|
+
return _olm_enc_output_length(pickle_length(*decryption));
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
size_t olm_pickle_pk_decryption(
|
|
286
|
+
OlmPkDecryption * decryption,
|
|
287
|
+
void const * key, size_t key_length,
|
|
288
|
+
void *pickled, size_t pickled_length
|
|
289
|
+
) {
|
|
290
|
+
OlmPkDecryption & object = *decryption;
|
|
291
|
+
std::size_t raw_length = pickle_length(object);
|
|
292
|
+
if (pickled_length < _olm_enc_output_length(raw_length)) {
|
|
293
|
+
object.last_error = OlmErrorCode::OLM_OUTPUT_BUFFER_TOO_SMALL;
|
|
294
|
+
return std::size_t(-1);
|
|
295
|
+
}
|
|
296
|
+
pickle(_olm_enc_output_pos(reinterpret_cast<std::uint8_t *>(pickled), raw_length), object);
|
|
297
|
+
return _olm_enc_output(
|
|
298
|
+
reinterpret_cast<std::uint8_t const *>(key), key_length,
|
|
299
|
+
reinterpret_cast<std::uint8_t *>(pickled), raw_length
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
size_t olm_unpickle_pk_decryption(
|
|
304
|
+
OlmPkDecryption * decryption,
|
|
305
|
+
void const * key, size_t key_length,
|
|
306
|
+
void *pickled, size_t pickled_length,
|
|
307
|
+
void *pubkey, size_t pubkey_length
|
|
308
|
+
) {
|
|
309
|
+
OlmPkDecryption & object = *decryption;
|
|
310
|
+
if (pubkey != NULL && pubkey_length < olm_pk_key_length()) {
|
|
311
|
+
object.last_error = OlmErrorCode::OLM_OUTPUT_BUFFER_TOO_SMALL;
|
|
312
|
+
return std::size_t(-1);
|
|
313
|
+
}
|
|
314
|
+
std::uint8_t * const pos = reinterpret_cast<std::uint8_t *>(pickled);
|
|
315
|
+
std::size_t raw_length = _olm_enc_input(
|
|
316
|
+
reinterpret_cast<std::uint8_t const *>(key), key_length,
|
|
317
|
+
pos, pickled_length, &object.last_error
|
|
318
|
+
);
|
|
319
|
+
if (raw_length == std::size_t(-1)) {
|
|
320
|
+
return std::size_t(-1);
|
|
321
|
+
}
|
|
322
|
+
std::uint8_t * const end = pos + raw_length;
|
|
323
|
+
/* On success unpickle will return (pos + raw_length). If unpickling
|
|
324
|
+
* terminates too soon then it will return a pointer before
|
|
325
|
+
* (pos + raw_length). On error unpickle will return (pos + raw_length + 1).
|
|
326
|
+
*/
|
|
327
|
+
if (end != unpickle(pos, end + 1, object)) {
|
|
328
|
+
if (object.last_error == OlmErrorCode::OLM_SUCCESS) {
|
|
329
|
+
object.last_error = OlmErrorCode::OLM_CORRUPTED_PICKLE;
|
|
330
|
+
}
|
|
331
|
+
return std::size_t(-1);
|
|
332
|
+
}
|
|
333
|
+
if (pubkey != NULL) {
|
|
334
|
+
olm::encode_base64(
|
|
335
|
+
(const uint8_t *)object.key_pair.public_key.public_key,
|
|
336
|
+
CURVE25519_KEY_LENGTH,
|
|
337
|
+
(uint8_t *)pubkey
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
return pickled_length;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
size_t olm_pk_max_plaintext_length(
|
|
344
|
+
OlmPkDecryption * decryption,
|
|
345
|
+
size_t ciphertext_length
|
|
346
|
+
) {
|
|
347
|
+
return _olm_cipher_aes_sha_256_ops.decrypt_max_plaintext_length(
|
|
348
|
+
olm_pk_cipher, olm::decode_base64_length(ciphertext_length)
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
size_t olm_pk_decrypt(
|
|
353
|
+
OlmPkDecryption * decryption,
|
|
354
|
+
void const * ephemeral_key, size_t ephemeral_key_length,
|
|
355
|
+
void const * mac, size_t mac_length,
|
|
356
|
+
void * ciphertext, size_t ciphertext_length,
|
|
357
|
+
void * plaintext, size_t max_plaintext_length
|
|
358
|
+
) {
|
|
359
|
+
if (max_plaintext_length
|
|
360
|
+
< olm_pk_max_plaintext_length(decryption, ciphertext_length)) {
|
|
361
|
+
decryption->last_error =
|
|
362
|
+
OlmErrorCode::OLM_OUTPUT_BUFFER_TOO_SMALL;
|
|
363
|
+
return std::size_t(-1);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
struct _olm_curve25519_public_key ephemeral;
|
|
367
|
+
olm::decode_base64(
|
|
368
|
+
(const uint8_t*)ephemeral_key, ephemeral_key_length,
|
|
369
|
+
(uint8_t *)ephemeral.public_key
|
|
370
|
+
);
|
|
371
|
+
olm::SharedKey secret;
|
|
372
|
+
_olm_crypto_curve25519_shared_secret(&decryption->key_pair, &ephemeral, secret);
|
|
373
|
+
uint8_t raw_mac[MAC_LENGTH];
|
|
374
|
+
olm::decode_base64((const uint8_t*)mac, olm::encode_base64_length(MAC_LENGTH), raw_mac);
|
|
375
|
+
size_t raw_ciphertext_length = olm::decode_base64_length(ciphertext_length);
|
|
376
|
+
olm::decode_base64((const uint8_t *)ciphertext, ciphertext_length, (uint8_t *)ciphertext);
|
|
377
|
+
size_t result = _olm_cipher_aes_sha_256_ops.decrypt(
|
|
378
|
+
olm_pk_cipher,
|
|
379
|
+
secret, sizeof(secret),
|
|
380
|
+
(uint8_t *) raw_mac, MAC_LENGTH,
|
|
381
|
+
(const uint8_t *) ciphertext, raw_ciphertext_length,
|
|
382
|
+
(uint8_t *) plaintext, max_plaintext_length
|
|
383
|
+
);
|
|
384
|
+
if (result == std::size_t(-1)) {
|
|
385
|
+
// we already checked the buffer sizes, so the only error that decrypt
|
|
386
|
+
// will return is if the MAC is incorrect
|
|
387
|
+
decryption->last_error =
|
|
388
|
+
OlmErrorCode::OLM_BAD_MESSAGE_MAC;
|
|
389
|
+
return std::size_t(-1);
|
|
390
|
+
} else {
|
|
391
|
+
return result;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
size_t olm_pk_get_private_key(
|
|
396
|
+
OlmPkDecryption * decryption,
|
|
397
|
+
void *private_key, size_t private_key_length
|
|
398
|
+
) {
|
|
399
|
+
if (private_key_length < olm_pk_private_key_length()) {
|
|
400
|
+
decryption->last_error =
|
|
401
|
+
OlmErrorCode::OLM_OUTPUT_BUFFER_TOO_SMALL;
|
|
402
|
+
return std::size_t(-1);
|
|
403
|
+
}
|
|
404
|
+
std::memcpy(
|
|
405
|
+
private_key,
|
|
406
|
+
decryption->key_pair.private_key.private_key,
|
|
407
|
+
olm_pk_private_key_length()
|
|
408
|
+
);
|
|
409
|
+
return olm_pk_private_key_length();
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
}
|