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,42 @@
1
+ module RubyOlm
2
+
3
+ class Account
4
+
5
+ # @param pickle [String] pickled state
6
+ # @param password [String] password used to encrypt pickled state
7
+ # @return [Account]
8
+ def self.from_pickle(pickle, password="")
9
+ Account.new(pickle: pickle, password: password)
10
+ end
11
+
12
+ # @param [type] defaults to 'curve25519'
13
+ # @return [String]
14
+ def ik(type='curve25519')
15
+ raise RangeError unless identity_keys[type]
16
+ identity_keys[type]
17
+ end
18
+
19
+ # @param [type] defaults to 'curve25519'
20
+ # @param [value] return only the key values and not the ids
21
+ #
22
+ # @return [Array<Hash>] if !values
23
+ # @return [Array<String>] if values
24
+ def otk(values=true, type='curve25519')
25
+ if values
26
+ one_time_keys[type].values
27
+ else
28
+ one_time_keys[type]
29
+ end
30
+ end
31
+
32
+ def gen_otk(number=1)
33
+ generate_one_time_keys(number)
34
+ end
35
+
36
+ alias_method :mark_otk, :mark_keys_as_published
37
+ alias_method :max_otk, :max_number_of_one_time_keys
38
+ alias_method :update_otk, :remove_one_time_keys
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,6 @@
1
+ module RubyOlm
2
+
3
+ class Message < OlmMessage
4
+ end
5
+
6
+ end
@@ -0,0 +1,70 @@
1
+ module RubyOlm
2
+
3
+ module OlmError
4
+
5
+ class SUCCESS < StandardError
6
+ end
7
+
8
+ class NOT_ENOUGH_RANDOM < StandardError
9
+ end
10
+
11
+ class OUTPUT_BUFFER_TOO_SMALL < StandardError
12
+ end
13
+
14
+ class BAD_MESSAGE_VERSION < StandardError
15
+ end
16
+
17
+ class BAD_MESSAGE_FORMAT < StandardError
18
+ end
19
+
20
+ class BAD_MESSAGE_MAC < StandardError
21
+ end
22
+
23
+ class BAD_MESSAGE_KEY_ID < StandardError
24
+ end
25
+
26
+ class INVALID_BASE64 < StandardError
27
+ end
28
+
29
+ class BAD_ACCOUNT_KEY < StandardError
30
+ end
31
+
32
+ class UNKNOWN_PICKLE_VERSION < StandardError
33
+ end
34
+
35
+ class CORRUPTED_PICKLE < StandardError
36
+ end
37
+
38
+ class BAD_SESSION_KEY < StandardError
39
+ end
40
+
41
+ class UNKNOWN_MESSAGE_INDEX < StandardError
42
+ end
43
+
44
+ class BAD_LEGACY_ACCOUNT_PICKLE < StandardError
45
+ end
46
+
47
+ class BAD_SIGNATURE < StandardError
48
+ end
49
+
50
+ class OLM_INPUT_BUFFER_TOO_SMALL < StandardError
51
+ end
52
+
53
+ class UnknownError < StandardError
54
+ end
55
+
56
+ def self.from_string(str)
57
+ begin
58
+ OlmError.const_get(str)
59
+ rescue NameError
60
+ UnknownError.new str
61
+ end
62
+ end
63
+
64
+ def self.raise_from_string(str)
65
+ raise from_string(str)
66
+ end
67
+
68
+ end
69
+
70
+ end
@@ -0,0 +1,25 @@
1
+ require 'base64'
2
+
3
+ module RubyOlm
4
+
5
+ class OlmMessage
6
+
7
+ # @param msg [String] base64 or bytes
8
+ def initialize(msg)
9
+ raise "abstract class" if self.class == OlmMessage
10
+ @value = msg
11
+ end
12
+
13
+ # @return [String] bytes
14
+ def to_bytes
15
+ Base64.decode64(value)
16
+ end
17
+
18
+ # @return [String] base64
19
+ def to_s
20
+ @value.dup
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,6 @@
1
+ module RubyOlm
2
+
3
+ class PreKeyMessage < OlmMessage
4
+ end
5
+
6
+ end
@@ -0,0 +1,16 @@
1
+ module RubyOlm
2
+
3
+ class Session
4
+
5
+ # @param pickle [String] pickled state
6
+ # @param password [String] password used to encrypt pickled state
7
+ # @return [Session]
8
+ def self.from_pickle(pickle, password="")
9
+ Session.new(pickle, password)
10
+ end
11
+
12
+ alias_method :has_received?, :has_received_message
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,5 @@
1
+ module RubyOlm
2
+
3
+ VERSION="0.1.1"
4
+
5
+ end
data/lib/ruby_olm.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'ruby_olm/version'
2
+ require 'ruby_olm/ext_lib_olm'
3
+ require 'ruby_olm/account'
4
+ require 'ruby_olm/session'
5
+ require 'ruby_olm/olm_message'
6
+ require 'ruby_olm/message'
7
+ require 'ruby_olm/pre_key_message'
8
+
9
+ module RubyOlm
10
+ end
data/rakefile ADDED
@@ -0,0 +1,18 @@
1
+ require 'rake/testtask'
2
+ require 'rake/extensiontask'
3
+
4
+ Rake::ExtensionTask.new do |ext|
5
+ ext.name = "ext_lib_olm"
6
+ ext.ext_dir = "ext/ruby_olm/ext_lib_olm"
7
+ ext.lib_dir = "lib/ruby_olm"
8
+ end
9
+
10
+ task :test => :compile
11
+
12
+ Rake::TestTask.new do |t|
13
+ t.name = :test
14
+ t.libs << "lib"
15
+ t.test_files = FileList["test/**/test_*.rb"]
16
+ end
17
+
18
+ task :default => :test
@@ -0,0 +1,62 @@
1
+ require 'minitest/autorun'
2
+ require 'ruby_olm'
3
+
4
+ class TestExchange < Minitest::Test
5
+
6
+ include RubyOlm
7
+
8
+ # Alice -> Bob
9
+ # Alice -> Bob
10
+ #
11
+ def test_bob_no_answer
12
+
13
+ alice = Account.new
14
+ bob = Account.new
15
+
16
+ # Alice wants to send a message to Bob
17
+ alice_msg = "hi bob"
18
+
19
+ # Bob generates a one-time-key
20
+ bob.gen_otk
21
+
22
+ # Alice must have Bob's identity and one-time-key to make a session
23
+ alice_session = alice.outbound_session(bob.ik, bob.otk.first)
24
+
25
+ # Bob marks all one-time-keys as published
26
+ bob.mark_otk
27
+
28
+ # Alice can encrypt
29
+ encrypted = alice_session.encrypt(alice_msg)
30
+ assert_instance_of PreKeyMessage, encrypted
31
+
32
+ # Bob can create a session from this first message
33
+ bob_session = bob.inbound_session(encrypted)
34
+
35
+ # Bob can now update his list of marked otk (since he knows one has been used)
36
+ bob.update_otk(bob_session)
37
+
38
+ # Bob can decrypt Alice's message
39
+ bob_msg = bob_session.decrypt(encrypted)
40
+
41
+ assert_equal alice_msg, bob_msg
42
+
43
+ # At this point Bob has received but Alice hasn't
44
+ assert bob_session.has_received?
45
+ refute alice_session.has_received?
46
+
47
+ ###
48
+
49
+ # Alice sends another message before reply from Bob
50
+ alice_msg = "BOB!"
51
+
52
+ encrypted = alice_session.encrypt(alice_msg)
53
+ assert_instance_of PreKeyMessage, encrypted
54
+
55
+ # Bob needs to check if this is the same session or a new one
56
+ same_session = bob_session.will_receive? encrypted
57
+
58
+ assert same_session
59
+
60
+ end
61
+
62
+ end
@@ -0,0 +1,60 @@
1
+ require 'minitest/autorun'
2
+ require 'ruby_olm'
3
+
4
+ class TestExchange < Minitest::Test
5
+
6
+ include RubyOlm
7
+
8
+ # Alice -> Bob
9
+ # Alice <- Bob
10
+ def test_exchange
11
+
12
+ alice = Account.new
13
+ bob = Account.new
14
+
15
+ # Alice wants to send a message to Bob
16
+ alice_msg = "hi bob"
17
+
18
+ # Bob generates a one-time-key
19
+ bob.gen_otk
20
+
21
+ # Alice must have Bob's identity and one-time-key to make a session
22
+ alice_session = alice.outbound_session(bob.ik, bob.otk.first)
23
+
24
+ # Bob marks all one-time-keys as published
25
+ bob.mark_otk
26
+
27
+ # Alice can encrypt
28
+ encrypted = alice_session.encrypt(alice_msg)
29
+ assert_instance_of PreKeyMessage, encrypted
30
+
31
+ # Bob can create a session from this first message
32
+ bob_session = bob.inbound_session(encrypted)
33
+
34
+ # Bob can now update his list of marked otk (since he knows one has been used)
35
+ bob.update_otk(bob_session)
36
+
37
+ # Bob can decrypt Alice's message
38
+ bob_msg = bob_session.decrypt(encrypted)
39
+
40
+ assert_equal alice_msg, bob_msg
41
+
42
+ # At this point Bob has received but Alice hasn't
43
+ assert bob_session.has_received?
44
+ refute alice_session.has_received?
45
+
46
+ ####
47
+
48
+ # Bob can send messages back to Alice
49
+ bob_msg = "hi alice"
50
+
51
+ encrypted = bob_session.encrypt(bob_msg)
52
+ assert_instance_of Message, encrypted
53
+
54
+ alice_msg = alice_session.decrypt(encrypted)
55
+
56
+ assert_equal alice_msg, bob_msg
57
+
58
+ end
59
+
60
+ end
@@ -0,0 +1,152 @@
1
+ require 'minitest/autorun'
2
+ require 'ruby_olm'
3
+
4
+ describe "Account" do
5
+
6
+ let(:account){ RubyOlm::Account.new }
7
+
8
+ # returns curve2599 identity key
9
+ #
10
+ describe "#ik" do
11
+
12
+ let(:rv){ account.ik }
13
+
14
+ it("returns a String"){ rv.must_be_instance_of String }
15
+
16
+ end
17
+
18
+ describe "#identity_keys" do
19
+
20
+ let(:rv){ account.identity_keys }
21
+
22
+ it("returns a Hash"){ rv.must_be_instance_of Hash }
23
+
24
+ end
25
+
26
+ # returns the maximum number of one-time-keys able to be
27
+ # cached by account
28
+ #
29
+ describe "#max_otk" do
30
+
31
+ let(:rv){ account.max_otk }
32
+
33
+ it("returns an unsigned integer") do
34
+ rv.must_be_kind_of Integer
35
+ rv.must_be :'>=', 0
36
+ end
37
+
38
+ end
39
+
40
+ # generates zero or more one-time-keys which will then be cached
41
+ # by account until such time they are:
42
+ #
43
+ # - overwritten by future calls to #generate_otk
44
+ # - removed by session establishment
45
+ #
46
+ describe "#gen_otk" do
47
+
48
+ it("returns self"){ account.gen_otk.must_equal account }
49
+
50
+ end
51
+
52
+ # marks one-time-keys as published
53
+ #
54
+ describe "#mark_otk" do
55
+
56
+ it("returns self"){ account.mark_otk.must_equal account }
57
+
58
+ end
59
+
60
+ # returns cached one-time-keys which have not yet been marked as published
61
+ #
62
+ describe "#otk" do
63
+
64
+ let(:rv){ account.otk }
65
+
66
+ it("returns an Array"){ rv.must_be_kind_of Array }
67
+
68
+ describe "return value" do
69
+
70
+ describe "before #gen_otk" do
71
+
72
+ describe "before #mark_otk" do
73
+
74
+ it("is empty"){ rv.size.must_equal 0 }
75
+
76
+ end
77
+
78
+ describe "after #mark_otk" do
79
+
80
+ before{ account.mark_otk }
81
+
82
+ it("is empty"){ rv.size.must_equal 0 }
83
+
84
+ end
85
+
86
+ end
87
+
88
+ describe "after #gen_otk" do
89
+
90
+ let(:max){ account.max_otk }
91
+ let(:n){ rand(0..max) }
92
+
93
+ before{ account.gen_otk(n) }
94
+
95
+ describe "before #mark_otk" do
96
+
97
+ it("has n keys"){ rv.size.must_equal n }
98
+
99
+ end
100
+
101
+ describe "after #mark_otk" do
102
+
103
+ before{ account.mark_otk }
104
+
105
+ it("is empty"){ rv.size.must_equal 0 }
106
+
107
+ end
108
+
109
+ end
110
+
111
+ end
112
+
113
+ end
114
+
115
+ # creates inbound and outbound sessions
116
+ #
117
+ describe "session factory" do
118
+
119
+ let(:remote){ RubyOlm::Account.new }
120
+
121
+ before do
122
+ remote.gen_otk
123
+ account.gen_otk
124
+ end
125
+
126
+ describe "#outbound_session" do
127
+
128
+ it("creates session") { account.outbound_session(remote.ik, remote.otk.first).must_be_kind_of RubyOlm::Session }
129
+
130
+ end
131
+
132
+ describe "#inbound_session" do
133
+
134
+ let(:remote_session){ remote.outbound_session(account.ik, account.otk.first) }
135
+ let(:remote_message){ remote_session.encrypt("hello") }
136
+
137
+ it("creates session") { account.inbound_session(remote_message).must_be_kind_of RubyOlm::Session }
138
+
139
+ end
140
+
141
+ describe "#inbound_session from known remote" do
142
+
143
+ let(:remote_session){ remote.outbound_session(account.ik, account.otk.first) }
144
+ let(:remote_message){ remote_session.encrypt("hello") }
145
+
146
+ it("creates session") { account.inbound_session(remote_message, remote.ik).must_be_kind_of RubyOlm::Session }
147
+
148
+ end
149
+
150
+ end
151
+
152
+ end
@@ -0,0 +1,85 @@
1
+ require 'minitest/autorun'
2
+ require 'ruby_olm'
3
+
4
+ class TestAccount < Minitest::Test
5
+
6
+ include RubyOlm
7
+
8
+ def setup
9
+ @state = Account.new
10
+ end
11
+
12
+ def test_identity_keys
13
+ assert_instance_of Hash, @state.identity_keys
14
+ end
15
+
16
+ def test_ik_default
17
+ assert_equal @state.identity_keys['curve25519'], @state.ik
18
+ end
19
+
20
+ def test_one_time_keys
21
+ assert_instance_of Hash, @state.one_time_keys
22
+ end
23
+
24
+ def test_otk_default
25
+ assert_instance_of Array, @state.otk
26
+ assert_equal @state.one_time_keys['curve25519'].values, @state.otk
27
+ end
28
+
29
+ def test_generate_one_time_keys
30
+ assert_equal @state, @state.generate_one_time_keys(rand(1..10))
31
+ end
32
+
33
+ def test_gen_otk
34
+ test_generate_one_time_keys
35
+ end
36
+
37
+ def test_last_error
38
+ assert_equal OlmError::SUCCESS, @state.last_error
39
+ end
40
+
41
+ def test_sign
42
+ assert_instance_of String, @state.sign("hello")
43
+ end
44
+
45
+ def test_mark_keys_as_published
46
+ assert_equal @state, @state.mark_keys_as_published
47
+ end
48
+
49
+ def test_mark_otk
50
+ test_mark_keys_as_published
51
+ end
52
+
53
+ def test_max_number_of_one_time_keys
54
+ assert_kind_of Integer, @state.max_number_of_one_time_keys
55
+ end
56
+
57
+ def test_max_otk
58
+ test_max_number_of_one_time_keys
59
+ end
60
+
61
+ def test_to_pickle
62
+ assert_kind_of String, @state.to_pickle
63
+ end
64
+
65
+ def test_from_pickle
66
+ Account.from_pickle(@state.to_pickle)
67
+ end
68
+
69
+ def test_from_pickle_with_key
70
+ Account.from_pickle(@state.to_pickle("hey"), "hey")
71
+ end
72
+
73
+ def test_from_pickle_invalid
74
+ assert_raises OlmError::BAD_ACCOUNT_KEY do
75
+ Account.from_pickle("")
76
+ end
77
+ end
78
+
79
+ def test_from_pickle_bad_key
80
+ assert_raises OlmError::BAD_ACCOUNT_KEY do
81
+ Account.from_pickle(@state.to_pickle, "hey")
82
+ end
83
+ end
84
+
85
+ end