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.
Files changed (194) hide show
  1. checksums.yaml +7 -0
  2. data/ext/ruby_olm/ext_lib_olm/ext_account.c +274 -0
  3. data/ext/ruby_olm/ext_lib_olm/ext_lib_olm.c +51 -0
  4. data/ext/ruby_olm/ext_lib_olm/ext_lib_olm.h +13 -0
  5. data/ext/ruby_olm/ext_lib_olm/ext_session.c +363 -0
  6. data/ext/ruby_olm/ext_lib_olm/ext_utility.c +69 -0
  7. data/ext/ruby_olm/ext_lib_olm/extconf.rb +69 -0
  8. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_account.cpp +695 -0
  9. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_account.h +56 -0
  10. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_inbound_group_session.cpp +654 -0
  11. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_inbound_group_session.h +51 -0
  12. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_jni.h +81 -0
  13. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_jni_helper.cpp +224 -0
  14. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_jni_helper.h +30 -0
  15. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_manager.cpp +35 -0
  16. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_manager.h +36 -0
  17. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_outbound_group_session.cpp +563 -0
  18. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_outbound_group_session.h +49 -0
  19. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_pk.cpp +716 -0
  20. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_pk.h +48 -0
  21. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_session.cpp +977 -0
  22. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_session.h +59 -0
  23. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_utility.cpp +236 -0
  24. data/ext/ruby_olm/ext_lib_olm/olm/android/olm-sdk/src/main/jni/olm_utility.h +40 -0
  25. data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_decode_message.cpp +14 -0
  26. data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_decrypt.cpp +65 -0
  27. data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_group_decrypt.cpp +73 -0
  28. data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_unpickle_account.cpp +14 -0
  29. data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/fuzz_unpickle_session.cpp +14 -0
  30. data/ext/ruby_olm/ext_lib_olm/olm/fuzzers/include/fuzzing.hh +82 -0
  31. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/account.hh +160 -0
  32. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/base64.h +77 -0
  33. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/base64.hh +63 -0
  34. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/cipher.h +138 -0
  35. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/crypto.h +202 -0
  36. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/error.h +72 -0
  37. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/inbound_group_session.h +235 -0
  38. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/list.hh +119 -0
  39. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/megolm.h +95 -0
  40. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/memory.h +41 -0
  41. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/memory.hh +90 -0
  42. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/message.h +93 -0
  43. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/message.hh +138 -0
  44. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/olm.h +451 -0
  45. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/olm.hh +4 -0
  46. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/outbound_group_session.h +181 -0
  47. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pickle.h +90 -0
  48. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pickle.hh +149 -0
  49. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pickle_encoding.h +76 -0
  50. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/pk.h +214 -0
  51. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/ratchet.hh +184 -0
  52. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/session.hh +156 -0
  53. data/ext/ruby_olm/ext_lib_olm/olm/include/olm/utility.hh +61 -0
  54. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/aes.c +1073 -0
  55. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/aes.h +123 -0
  56. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/aes_test.c +276 -0
  57. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/arcfour.c +45 -0
  58. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/arcfour.h +30 -0
  59. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/arcfour_test.c +47 -0
  60. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/base64.c +135 -0
  61. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/base64.h +27 -0
  62. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/base64_test.c +54 -0
  63. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/blowfish.c +269 -0
  64. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/blowfish.h +32 -0
  65. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/blowfish_test.c +68 -0
  66. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/des.c +269 -0
  67. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/des.h +37 -0
  68. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/des_test.c +83 -0
  69. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md2.c +104 -0
  70. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md2.h +33 -0
  71. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md2_test.c +58 -0
  72. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md5.c +189 -0
  73. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md5.h +34 -0
  74. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/md5_test.c +60 -0
  75. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/rot-13.c +35 -0
  76. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/rot-13.h +20 -0
  77. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/rot-13_test.c +44 -0
  78. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha1.c +149 -0
  79. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha1.h +35 -0
  80. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha1_test.c +58 -0
  81. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha256.c +159 -0
  82. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha256.h +34 -0
  83. data/ext/ruby_olm/ext_lib_olm/olm/lib/crypto-algorithms/sha256_test.c +61 -0
  84. data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/contrib/Curve25519Donna.c +118 -0
  85. data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/contrib/Curve25519Donna.h +53 -0
  86. data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/curve25519-donna-c64.c +449 -0
  87. data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/curve25519-donna.c +860 -0
  88. data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/python-src/curve25519/curve25519module.c +105 -0
  89. data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/speed-curve25519.c +50 -0
  90. data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/test-curve25519.c +54 -0
  91. data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/test-noncanon.c +39 -0
  92. data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna/test-sc-curve25519.c +72 -0
  93. data/ext/ruby_olm/ext_lib_olm/olm/lib/curve25519-donna.h +18 -0
  94. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/add_scalar.c +56 -0
  95. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/ed25519.h +38 -0
  96. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/fe.c +1493 -0
  97. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/fe.h +41 -0
  98. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/fixedint.h +72 -0
  99. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/ge.c +467 -0
  100. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/ge.h +74 -0
  101. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/key_exchange.c +79 -0
  102. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/keypair.c +16 -0
  103. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/precomp_data.h +1391 -0
  104. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sc.c +814 -0
  105. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sc.h +12 -0
  106. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/seed.c +40 -0
  107. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sha512.c +275 -0
  108. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sha512.h +21 -0
  109. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/sign.c +31 -0
  110. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/src/verify.c +77 -0
  111. data/ext/ruby_olm/ext_lib_olm/olm/lib/ed25519/test.c +150 -0
  112. data/ext/ruby_olm/ext_lib_olm/olm/python/dummy/stddef.h +0 -0
  113. data/ext/ruby_olm/ext_lib_olm/olm/python/dummy/stdint.h +0 -0
  114. data/ext/ruby_olm/ext_lib_olm/olm/src/account.cpp +380 -0
  115. data/ext/ruby_olm/ext_lib_olm/olm/src/base64.cpp +167 -0
  116. data/ext/ruby_olm/ext_lib_olm/olm/src/cipher.cpp +152 -0
  117. data/ext/ruby_olm/ext_lib_olm/olm/src/crypto.cpp +299 -0
  118. data/ext/ruby_olm/ext_lib_olm/olm/src/ed25519.c +22 -0
  119. data/ext/ruby_olm/ext_lib_olm/olm/src/error.c +44 -0
  120. data/ext/ruby_olm/ext_lib_olm/olm/src/inbound_group_session.c +524 -0
  121. data/ext/ruby_olm/ext_lib_olm/olm/src/megolm.c +150 -0
  122. data/ext/ruby_olm/ext_lib_olm/olm/src/memory.cpp +45 -0
  123. data/ext/ruby_olm/ext_lib_olm/olm/src/message.cpp +401 -0
  124. data/ext/ruby_olm/ext_lib_olm/olm/src/olm.cpp +738 -0
  125. data/ext/ruby_olm/ext_lib_olm/olm/src/outbound_group_session.c +363 -0
  126. data/ext/ruby_olm/ext_lib_olm/olm/src/pickle.cpp +242 -0
  127. data/ext/ruby_olm/ext_lib_olm/olm/src/pickle_encoding.c +92 -0
  128. data/ext/ruby_olm/ext_lib_olm/olm/src/pk.cpp +412 -0
  129. data/ext/ruby_olm/ext_lib_olm/olm/src/ratchet.cpp +625 -0
  130. data/ext/ruby_olm/ext_lib_olm/olm/src/session.cpp +462 -0
  131. data/ext/ruby_olm/ext_lib_olm/olm/src/utility.cpp +57 -0
  132. data/ext/ruby_olm/ext_lib_olm/olm/tests/include/unittest.hh +107 -0
  133. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_base64.cpp +70 -0
  134. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_crypto.cpp +246 -0
  135. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_group_session.cpp +329 -0
  136. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_list.cpp +92 -0
  137. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_megolm.cpp +134 -0
  138. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_message.cpp +112 -0
  139. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm.cpp +405 -0
  140. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_decrypt.cpp +90 -0
  141. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_sha256.cpp +20 -0
  142. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_signature.cpp +81 -0
  143. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_olm_using_malloc.cpp +210 -0
  144. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_pk.cpp +166 -0
  145. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_ratchet.cpp +221 -0
  146. data/ext/ruby_olm/ext_lib_olm/olm/tests/test_session.cpp +144 -0
  147. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMAccount.h +51 -0
  148. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMAccount_Private.h +25 -0
  149. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMInboundGroupSession.h +38 -0
  150. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMKit.h +37 -0
  151. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMMessage.h +38 -0
  152. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMOutboundGroupSession.h +32 -0
  153. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMPkDecryption.h +71 -0
  154. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMPkEncryption.h +42 -0
  155. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMPkMessage.h +31 -0
  156. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMSerializable.h +29 -0
  157. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMSession.h +44 -0
  158. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMSession_Private.h +26 -0
  159. data/ext/ruby_olm/ext_lib_olm/olm/xcode/OLMKit/OLMUtility.h +49 -0
  160. data/ext/ruby_olm/ext_lib_olm/staging/account.cpp +380 -0
  161. data/ext/ruby_olm/ext_lib_olm/staging/aes.c +1073 -0
  162. data/ext/ruby_olm/ext_lib_olm/staging/base64.cpp +167 -0
  163. data/ext/ruby_olm/ext_lib_olm/staging/cipher.cpp +152 -0
  164. data/ext/ruby_olm/ext_lib_olm/staging/crypto.cpp +299 -0
  165. data/ext/ruby_olm/ext_lib_olm/staging/curve25519-donna.c +860 -0
  166. data/ext/ruby_olm/ext_lib_olm/staging/ed25519.c +22 -0
  167. data/ext/ruby_olm/ext_lib_olm/staging/error.c +44 -0
  168. data/ext/ruby_olm/ext_lib_olm/staging/inbound_group_session.c +524 -0
  169. data/ext/ruby_olm/ext_lib_olm/staging/megolm.c +150 -0
  170. data/ext/ruby_olm/ext_lib_olm/staging/memory.cpp +45 -0
  171. data/ext/ruby_olm/ext_lib_olm/staging/message.cpp +401 -0
  172. data/ext/ruby_olm/ext_lib_olm/staging/olm.cpp +738 -0
  173. data/ext/ruby_olm/ext_lib_olm/staging/outbound_group_session.c +363 -0
  174. data/ext/ruby_olm/ext_lib_olm/staging/pickle.cpp +242 -0
  175. data/ext/ruby_olm/ext_lib_olm/staging/pickle_encoding.c +92 -0
  176. data/ext/ruby_olm/ext_lib_olm/staging/pk.cpp +412 -0
  177. data/ext/ruby_olm/ext_lib_olm/staging/ratchet.cpp +625 -0
  178. data/ext/ruby_olm/ext_lib_olm/staging/session.cpp +461 -0
  179. data/ext/ruby_olm/ext_lib_olm/staging/sha256.c +159 -0
  180. data/ext/ruby_olm/ext_lib_olm/staging/utility.cpp +57 -0
  181. data/lib/ruby_olm/account.rb +42 -0
  182. data/lib/ruby_olm/message.rb +6 -0
  183. data/lib/ruby_olm/olm_error.rb +70 -0
  184. data/lib/ruby_olm/olm_message.rb +25 -0
  185. data/lib/ruby_olm/pre_key_message.rb +6 -0
  186. data/lib/ruby_olm/session.rb +16 -0
  187. data/lib/ruby_olm/version.rb +5 -0
  188. data/lib/ruby_olm.rb +10 -0
  189. data/rakefile +18 -0
  190. data/test/examples/test_bob_no_answer.rb +62 -0
  191. data/test/examples/test_exchange.rb +60 -0
  192. data/test/spec/test_account.rb +152 -0
  193. data/test/unit/test_account_methods.rb +85 -0
  194. metadata +282 -0
@@ -0,0 +1,181 @@
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_OUTBOUND_GROUP_SESSION_H_
16
+ #define OLM_OUTBOUND_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 OlmOutboundGroupSession OlmOutboundGroupSession;
26
+
27
+ /** get the size of an outbound group session, in bytes. */
28
+ size_t olm_outbound_group_session_size(void);
29
+
30
+ /**
31
+ * Initialise an outbound group session object using the supplied memory
32
+ * The supplied memory should be at least olm_outbound_group_session_size()
33
+ * bytes.
34
+ */
35
+ OlmOutboundGroupSession * olm_outbound_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_outbound_group_session_last_error(
43
+ const OlmOutboundGroupSession *session
44
+ );
45
+
46
+ /** Clears the memory used to back this group session */
47
+ size_t olm_clear_outbound_group_session(
48
+ OlmOutboundGroupSession *session
49
+ );
50
+
51
+ /** Returns the number of bytes needed to store an outbound group session */
52
+ size_t olm_pickle_outbound_group_session_length(
53
+ const OlmOutboundGroupSession *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_outbound_group_session_length() then
62
+ * olm_outbound_group_session_last_error() will be "OUTPUT_BUFFER_TOO_SMALL"
63
+ */
64
+ size_t olm_pickle_outbound_group_session(
65
+ OlmOutboundGroupSession *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_outbound_group_session_last_error() will be
76
+ * "BAD_ACCOUNT_KEY". If the base64 couldn't be decoded then
77
+ * olm_outbound_group_session_last_error() will be "INVALID_BASE64". The input
78
+ * pickled buffer is destroyed
79
+ */
80
+ size_t olm_unpickle_outbound_group_session(
81
+ OlmOutboundGroupSession *session,
82
+ void const * key, size_t key_length,
83
+ void * pickled, size_t pickled_length
84
+ );
85
+
86
+
87
+ /** The number of random bytes needed to create an outbound group session */
88
+ size_t olm_init_outbound_group_session_random_length(
89
+ const OlmOutboundGroupSession *session
90
+ );
91
+
92
+ /**
93
+ * Start a new outbound group session. Returns olm_error() on failure. On
94
+ * failure last_error will be set with an error code. The last_error will be
95
+ * NOT_ENOUGH_RANDOM if the number of random bytes was too small.
96
+ */
97
+ size_t olm_init_outbound_group_session(
98
+ OlmOutboundGroupSession *session,
99
+ uint8_t *random, size_t random_length
100
+ );
101
+
102
+ /**
103
+ * The number of bytes that will be created by encrypting a message
104
+ */
105
+ size_t olm_group_encrypt_message_length(
106
+ OlmOutboundGroupSession *session,
107
+ size_t plaintext_length
108
+ );
109
+
110
+ /**
111
+ * Encrypt some plain-text. Returns the length of the encrypted message or
112
+ * olm_error() on failure. On failure last_error will be set with an
113
+ * error code. The last_error will be OUTPUT_BUFFER_TOO_SMALL if the output
114
+ * buffer is too small.
115
+ */
116
+ size_t olm_group_encrypt(
117
+ OlmOutboundGroupSession *session,
118
+ uint8_t const * plaintext, size_t plaintext_length,
119
+ uint8_t * message, size_t message_length
120
+ );
121
+
122
+
123
+ /**
124
+ * Get the number of bytes returned by olm_outbound_group_session_id()
125
+ */
126
+ size_t olm_outbound_group_session_id_length(
127
+ const OlmOutboundGroupSession *session
128
+ );
129
+
130
+ /**
131
+ * Get a base64-encoded identifier for this session.
132
+ *
133
+ * Returns the length of the session id on success or olm_error() on
134
+ * failure. On failure last_error will be set with an error code. The
135
+ * last_error will be OUTPUT_BUFFER_TOO_SMALL if the id buffer was too
136
+ * small.
137
+ */
138
+ size_t olm_outbound_group_session_id(
139
+ OlmOutboundGroupSession *session,
140
+ uint8_t * id, size_t id_length
141
+ );
142
+
143
+ /**
144
+ * Get the current message index for this session.
145
+ *
146
+ * Each message is sent with an increasing index; this returns the index for
147
+ * the next message.
148
+ */
149
+ uint32_t olm_outbound_group_session_message_index(
150
+ OlmOutboundGroupSession *session
151
+ );
152
+
153
+ /**
154
+ * Get the number of bytes returned by olm_outbound_group_session_key()
155
+ */
156
+ size_t olm_outbound_group_session_key_length(
157
+ const OlmOutboundGroupSession *session
158
+ );
159
+
160
+ /**
161
+ * Get the base64-encoded current ratchet key for this session.
162
+ *
163
+ * Each message is sent with a different ratchet key. This function returns the
164
+ * ratchet key that will be used for the next message.
165
+ *
166
+ * Returns the length of the ratchet key on success or olm_error() on
167
+ * failure. On failure last_error will be set with an error code. The
168
+ * last_error will be OUTPUT_BUFFER_TOO_SMALL if the buffer was too small.
169
+ */
170
+ size_t olm_outbound_group_session_key(
171
+ OlmOutboundGroupSession *session,
172
+ uint8_t * key, size_t key_length
173
+ );
174
+
175
+
176
+
177
+ #ifdef __cplusplus
178
+ } // extern "C"
179
+ #endif
180
+
181
+ #endif /* OLM_OUTBOUND_GROUP_SESSION_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
+ #ifndef OLM_PICKLE_H_
16
+ #define OLM_PICKLE_H_
17
+
18
+ #include <stdint.h>
19
+
20
+ #ifdef __cplusplus
21
+ extern "C" {
22
+ #endif
23
+
24
+ struct _olm_ed25519_public_key;
25
+ struct _olm_ed25519_key_pair;
26
+
27
+
28
+ #define _olm_pickle_uint32_length(value) 4
29
+ uint8_t * _olm_pickle_uint32(uint8_t * pos, uint32_t value);
30
+ uint8_t const * _olm_unpickle_uint32(
31
+ uint8_t const * pos, uint8_t const * end,
32
+ uint32_t *value
33
+ );
34
+
35
+
36
+ #define _olm_pickle_bool_length(value) 1
37
+ uint8_t * _olm_pickle_bool(uint8_t * pos, int value);
38
+ uint8_t const * _olm_unpickle_bool(
39
+ uint8_t const * pos, uint8_t const * end,
40
+ int *value
41
+ );
42
+
43
+ #define _olm_pickle_bytes_length(bytes, bytes_length) (bytes_length)
44
+ uint8_t * _olm_pickle_bytes(uint8_t * pos, uint8_t const * bytes,
45
+ size_t bytes_length);
46
+ uint8_t const * _olm_unpickle_bytes(uint8_t const * pos, uint8_t const * end,
47
+ uint8_t * bytes, size_t bytes_length);
48
+
49
+
50
+ /** Get the number of bytes needed to pickle an ed25519 public key */
51
+ size_t _olm_pickle_ed25519_public_key_length(
52
+ const struct _olm_ed25519_public_key * value
53
+ );
54
+
55
+ /** Pickle the ed25519 public key. Returns a pointer to the next free space in
56
+ * the buffer. */
57
+ uint8_t * _olm_pickle_ed25519_public_key(
58
+ uint8_t *pos, const struct _olm_ed25519_public_key * value
59
+ );
60
+
61
+ /** Unpickle the ed25519 public key. Returns a pointer to the next item in the
62
+ * buffer. */
63
+ const uint8_t * _olm_unpickle_ed25519_public_key(
64
+ const uint8_t *pos, const uint8_t *end,
65
+ struct _olm_ed25519_public_key * value
66
+ );
67
+
68
+ /** Get the number of bytes needed to pickle an ed25519 key pair */
69
+ size_t _olm_pickle_ed25519_key_pair_length(
70
+ const struct _olm_ed25519_key_pair * value
71
+ );
72
+
73
+ /** Pickle the ed25519 key pair. Returns a pointer to the next free space in
74
+ * the buffer. */
75
+ uint8_t * _olm_pickle_ed25519_key_pair(
76
+ uint8_t *pos, const struct _olm_ed25519_key_pair * value
77
+ );
78
+
79
+ /** Unpickle the ed25519 key pair. Returns a pointer to the next item in the
80
+ * buffer. */
81
+ const uint8_t * _olm_unpickle_ed25519_key_pair(
82
+ const uint8_t *pos, const uint8_t *end,
83
+ struct _olm_ed25519_key_pair * value
84
+ );
85
+
86
+ #ifdef __cplusplus
87
+ } // extern "C"
88
+ #endif
89
+
90
+ #endif /* OLM_PICKLE_H */
@@ -0,0 +1,149 @@
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_PICKLE_HH_
16
+ #define OLM_PICKLE_HH_
17
+
18
+ #include "olm/list.hh"
19
+ #include "olm/crypto.h"
20
+
21
+ #include <cstring>
22
+ #include <cstdint>
23
+
24
+ namespace olm {
25
+
26
+ inline std::size_t pickle_length(
27
+ const std::uint32_t & value
28
+ ) {
29
+ return 4;
30
+ }
31
+
32
+ std::uint8_t * pickle(
33
+ std::uint8_t * pos,
34
+ std::uint32_t value
35
+ );
36
+
37
+ std::uint8_t const * unpickle(
38
+ std::uint8_t const * pos, std::uint8_t const * end,
39
+ std::uint32_t & value
40
+ );
41
+
42
+
43
+ inline std::size_t pickle_length(
44
+ const bool & value
45
+ ) {
46
+ return 1;
47
+ }
48
+
49
+ std::uint8_t * pickle(
50
+ std::uint8_t * pos,
51
+ bool value
52
+ );
53
+
54
+ std::uint8_t const * unpickle(
55
+ std::uint8_t const * pos, std::uint8_t const * end,
56
+ bool & value
57
+ );
58
+
59
+
60
+ template<typename T, std::size_t max_size>
61
+ std::size_t pickle_length(
62
+ olm::List<T, max_size> const & list
63
+ ) {
64
+ std::size_t length = pickle_length(std::uint32_t(list.size()));
65
+ for (auto const & value : list) {
66
+ length += pickle_length(value);
67
+ }
68
+ return length;
69
+ }
70
+
71
+
72
+ template<typename T, std::size_t max_size>
73
+ std::uint8_t * pickle(
74
+ std::uint8_t * pos,
75
+ olm::List<T, max_size> const & list
76
+ ) {
77
+ pos = pickle(pos, std::uint32_t(list.size()));
78
+ for (auto const & value : list) {
79
+ pos = pickle(pos, value);
80
+ }
81
+ return pos;
82
+ }
83
+
84
+
85
+ template<typename T, std::size_t max_size>
86
+ std::uint8_t const * unpickle(
87
+ std::uint8_t const * pos, std::uint8_t const * end,
88
+ olm::List<T, max_size> & list
89
+ ) {
90
+ std::uint32_t size;
91
+ pos = unpickle(pos, end, size);
92
+ while (size-- && pos != end) {
93
+ T * value = list.insert(list.end());
94
+ pos = unpickle(pos, end, *value);
95
+ }
96
+ return pos;
97
+ }
98
+
99
+
100
+ std::uint8_t * pickle_bytes(
101
+ std::uint8_t * pos,
102
+ std::uint8_t const * bytes, std::size_t bytes_length
103
+ );
104
+
105
+ std::uint8_t const * unpickle_bytes(
106
+ std::uint8_t const * pos, std::uint8_t const * end,
107
+ std::uint8_t * bytes, std::size_t bytes_length
108
+ );
109
+
110
+
111
+ std::size_t pickle_length(
112
+ const _olm_curve25519_public_key & value
113
+ );
114
+
115
+
116
+ std::uint8_t * pickle(
117
+ std::uint8_t * pos,
118
+ const _olm_curve25519_public_key & value
119
+ );
120
+
121
+
122
+ std::uint8_t const * unpickle(
123
+ std::uint8_t const * pos, std::uint8_t const * end,
124
+ _olm_curve25519_public_key & value
125
+ );
126
+
127
+
128
+ std::size_t pickle_length(
129
+ const _olm_curve25519_key_pair & value
130
+ );
131
+
132
+
133
+ std::uint8_t * pickle(
134
+ std::uint8_t * pos,
135
+ const _olm_curve25519_key_pair & value
136
+ );
137
+
138
+
139
+ std::uint8_t const * unpickle(
140
+ std::uint8_t const * pos, std::uint8_t const * end,
141
+ _olm_curve25519_key_pair & value
142
+ );
143
+
144
+ } // namespace olm
145
+
146
+
147
+
148
+
149
+ #endif /* OLM_PICKLE_HH */
@@ -0,0 +1,76 @@
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
+ /* functions for encrypting and decrypting pickled representations of objects */
17
+
18
+ #ifndef OLM_PICKLE_ENCODING_H_
19
+ #define OLM_PICKLE_ENCODING_H_
20
+
21
+ #include <stddef.h>
22
+ #include <stdint.h>
23
+
24
+ #include "olm/error.h"
25
+
26
+ #ifdef __cplusplus
27
+ extern "C" {
28
+ #endif
29
+
30
+
31
+ /**
32
+ * Get the number of bytes needed to encode a pickle of the length given
33
+ */
34
+ size_t _olm_enc_output_length(size_t raw_length);
35
+
36
+ /**
37
+ * Get the point in the output buffer that the raw pickle should be written to.
38
+ *
39
+ * In order that we can use the same buffer for the raw pickle, and the encoded
40
+ * pickle, the raw pickle needs to be written at the end of the buffer. (The
41
+ * base-64 encoding would otherwise overwrite the end of the input before it
42
+ * was encoded.)
43
+ */
44
+ uint8_t *_olm_enc_output_pos(uint8_t * output, size_t raw_length);
45
+
46
+ /**
47
+ * Encrypt and encode the given pickle in-situ.
48
+ *
49
+ * The raw pickle should have been written to enc_output_pos(pickle,
50
+ * raw_length).
51
+ *
52
+ * Returns the number of bytes in the encoded pickle.
53
+ */
54
+ size_t _olm_enc_output(
55
+ uint8_t const * key, size_t key_length,
56
+ uint8_t *pickle, size_t raw_length
57
+ );
58
+
59
+ /**
60
+ * Decode and decrypt the given pickle in-situ.
61
+ *
62
+ * Returns the number of bytes in the decoded pickle, or olm_error() on error,
63
+ * in which case *last_error will be updated, if last_error is non-NULL.
64
+ */
65
+ size_t _olm_enc_input(
66
+ uint8_t const * key, size_t key_length,
67
+ uint8_t * input, size_t b64_length,
68
+ enum OlmErrorCode * last_error
69
+ );
70
+
71
+
72
+ #ifdef __cplusplus
73
+ } // extern "C"
74
+ #endif
75
+
76
+ #endif /* OLM_PICKLE_ENCODING_H_ */
@@ -0,0 +1,214 @@
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
+
16
+ #ifndef OLM_PK_H_
17
+ #define OLM_PK_H_
18
+
19
+ #include <stddef.h>
20
+ #include <stdint.h>
21
+
22
+ #ifdef __cplusplus
23
+ extern "C" {
24
+ #endif
25
+
26
+ typedef struct OlmPkEncryption OlmPkEncryption;
27
+
28
+ /* The size of an encryption object in bytes */
29
+ size_t olm_pk_encryption_size(void);
30
+
31
+ /** Initialise an encryption object using the supplied memory
32
+ * The supplied memory must be at least olm_pk_encryption_size() bytes */
33
+ OlmPkEncryption *olm_pk_encryption(
34
+ void * memory
35
+ );
36
+
37
+ /** A null terminated string describing the most recent error to happen to an
38
+ * encryption object */
39
+ const char * olm_pk_encryption_last_error(
40
+ OlmPkEncryption * encryption
41
+ );
42
+
43
+ /** Clears the memory used to back this encryption object */
44
+ size_t olm_clear_pk_encryption(
45
+ OlmPkEncryption *encryption
46
+ );
47
+
48
+ /** Set the recipient's public key for encrypting to */
49
+ size_t olm_pk_encryption_set_recipient_key(
50
+ OlmPkEncryption *encryption,
51
+ void const *public_key, size_t public_key_length
52
+ );
53
+
54
+ /** Get the length of the ciphertext that will correspond to a plaintext of the
55
+ * given length. */
56
+ size_t olm_pk_ciphertext_length(
57
+ OlmPkEncryption *encryption,
58
+ size_t plaintext_length
59
+ );
60
+
61
+ /** Get the length of the message authentication code. */
62
+ size_t olm_pk_mac_length(
63
+ OlmPkEncryption *encryption
64
+ );
65
+
66
+ /** Get the length of a public or ephemeral key */
67
+ size_t olm_pk_key_length(void);
68
+
69
+ /** The number of random bytes needed to encrypt a message. */
70
+ size_t olm_pk_encrypt_random_length(
71
+ OlmPkEncryption *encryption
72
+ );
73
+
74
+ /** Encrypt a plaintext for the recipient set using
75
+ * olm_pk_encryption_set_recipient_key. Writes to the ciphertext, mac, and
76
+ * ephemeral_key buffers, whose values should be sent to the recipient. mac is
77
+ * a Message Authentication Code to ensure that the data is received and
78
+ * decrypted properly. ephemeral_key is the public part of the ephemeral key
79
+ * used (together with the recipient's key) to generate a symmetric encryption
80
+ * key. Returns olm_error() on failure. If the ciphertext, mac, or
81
+ * ephemeral_key buffers were too small then olm_pk_encryption_last_error()
82
+ * will be "OUTPUT_BUFFER_TOO_SMALL". If there weren't enough random bytes then
83
+ * olm_pk_encryption_last_error() will be "OLM_INPUT_BUFFER_TOO_SMALL". */
84
+ size_t olm_pk_encrypt(
85
+ OlmPkEncryption *encryption,
86
+ void const * plaintext, size_t plaintext_length,
87
+ void * ciphertext, size_t ciphertext_length,
88
+ void * mac, size_t mac_length,
89
+ void * ephemeral_key, size_t ephemeral_key_size,
90
+ void * random, size_t random_length
91
+ );
92
+
93
+ typedef struct OlmPkDecryption OlmPkDecryption;
94
+
95
+ /* The size of a decryption object in bytes */
96
+ size_t olm_pk_decryption_size(void);
97
+
98
+ /** Initialise a decryption object using the supplied memory
99
+ * The supplied memory must be at least olm_pk_decryption_size() bytes */
100
+ OlmPkDecryption *olm_pk_decryption(
101
+ void * memory
102
+ );
103
+
104
+ /** A null terminated string describing the most recent error to happen to a
105
+ * decription object */
106
+ const char * olm_pk_decryption_last_error(
107
+ OlmPkDecryption * decryption
108
+ );
109
+
110
+ /** Clears the memory used to back this decryption object */
111
+ size_t olm_clear_pk_decryption(
112
+ OlmPkDecryption *decryption
113
+ );
114
+
115
+ /** Get the number of bytes required to store an olm private key
116
+ */
117
+ size_t olm_pk_private_key_length(void);
118
+
119
+ /** DEPRECATED: Use olm_pk_private_key_length()
120
+ */
121
+ size_t olm_pk_generate_key_random_length(void);
122
+
123
+ /** Initialise the key from the private part of a key as returned by
124
+ * olm_pk_get_private_key(). The associated public key will be written to the
125
+ * pubkey buffer. Returns olm_error() on failure. If the pubkey buffer is too
126
+ * small then olm_pk_decryption_last_error() will be "OUTPUT_BUFFER_TOO_SMALL".
127
+ * If the private key was not long enough then olm_pk_decryption_last_error()
128
+ * will be "OLM_INPUT_BUFFER_TOO_SMALL".
129
+ *
130
+ * Note that the pubkey is a base64 encoded string, but the private key is
131
+ * an unencoded byte array
132
+ */
133
+ size_t olm_pk_key_from_private(
134
+ OlmPkDecryption * decryption,
135
+ void * pubkey, size_t pubkey_length,
136
+ void * privkey, size_t privkey_length
137
+ );
138
+
139
+ /** DEPRECATED: Use olm_pk_key_from_private
140
+ */
141
+ size_t olm_pk_generate_key(
142
+ OlmPkDecryption * decryption,
143
+ void * pubkey, size_t pubkey_length,
144
+ void * privkey, size_t privkey_length
145
+ );
146
+
147
+ /** Returns the number of bytes needed to store a decryption object. */
148
+ size_t olm_pickle_pk_decryption_length(
149
+ OlmPkDecryption * decryption
150
+ );
151
+
152
+ /** Stores decryption object as a base64 string. Encrypts the object using the
153
+ * supplied key. Returns the length of the pickled object on success.
154
+ * Returns olm_error() on failure. If the pickle output buffer
155
+ * is smaller than olm_pickle_account_length() then
156
+ * olm_pk_decryption_last_error() will be "OUTPUT_BUFFER_TOO_SMALL" */
157
+ size_t olm_pickle_pk_decryption(
158
+ OlmPkDecryption * decryption,
159
+ void const * key, size_t key_length,
160
+ void *pickled, size_t pickled_length
161
+ );
162
+
163
+ /** Loads a decryption object from a pickled base64 string. The associated
164
+ * public key will be written to the pubkey buffer. Decrypts the object using
165
+ * the supplied key. Returns olm_error() on failure. If the key doesn't
166
+ * match the one used to encrypt the account then olm_pk_decryption_last_error()
167
+ * will be "BAD_ACCOUNT_KEY". If the base64 couldn't be decoded then
168
+ * olm_pk_decryption_last_error() will be "INVALID_BASE64". The input pickled
169
+ * buffer is destroyed */
170
+ size_t olm_unpickle_pk_decryption(
171
+ OlmPkDecryption * decryption,
172
+ void const * key, size_t key_length,
173
+ void *pickled, size_t pickled_length,
174
+ void *pubkey, size_t pubkey_length
175
+ );
176
+
177
+ /** Get the length of the plaintext that will correspond to a ciphertext of the
178
+ * given length. */
179
+ size_t olm_pk_max_plaintext_length(
180
+ OlmPkDecryption * decryption,
181
+ size_t ciphertext_length
182
+ );
183
+
184
+ /** Decrypt a ciphertext. The input ciphertext buffer is destroyed. See the
185
+ * olm_pk_encrypt function for descriptions of the ephemeral_key and mac
186
+ * arguments. Returns the length of the plaintext on success. Returns
187
+ * olm_error() on failure. If the plaintext buffer is too small then
188
+ * olm_pk_encryption_last_error() will be "OUTPUT_BUFFER_TOO_SMALL". */
189
+ size_t olm_pk_decrypt(
190
+ OlmPkDecryption * decryption,
191
+ void const * ephemeral_key, size_t ephemeral_key_length,
192
+ void const * mac, size_t mac_length,
193
+ void * ciphertext, size_t ciphertext_length,
194
+ void * plaintext, size_t max_plaintext_length
195
+ );
196
+
197
+ /**
198
+ * Get the private key for an OlmDecryption object as an unencoded byte array
199
+ * private_key must be a pointer to a buffer of at least
200
+ * olm_pk_private_key_length() bytes and this length must be passed in
201
+ * private_key_length. If the given buffer is too small, returns olm_error()
202
+ * and olm_pk_encryption_last_error() will be "OUTPUT_BUFFER_TOO_SMALL".
203
+ * Returns the number of bytes written.
204
+ */
205
+ size_t olm_pk_get_private_key(
206
+ OlmPkDecryption * decryption,
207
+ void *private_key, size_t private_key_length
208
+ );
209
+
210
+ #ifdef __cplusplus
211
+ }
212
+ #endif
213
+
214
+ #endif /* OLM_PK_H_ */