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,105 @@
1
+ /* tell python that PyArg_ParseTuple(t#) means Py_ssize_t, not int */
2
+ #define PY_SSIZE_T_CLEAN
3
+ #include <Python.h>
4
+ #if (PY_VERSION_HEX < 0x02050000)
5
+ typedef int Py_ssize_t;
6
+ #endif
7
+
8
+ /* This is required for compatibility with Python 2. */
9
+ #if PY_MAJOR_VERSION >= 3
10
+ #include <bytesobject.h>
11
+ #define y "y"
12
+ #else
13
+ #define PyBytes_FromStringAndSize PyString_FromStringAndSize
14
+ #define y "t"
15
+ #endif
16
+
17
+ int curve25519_donna(char *mypublic,
18
+ const char *secret, const char *basepoint);
19
+
20
+ static PyObject *
21
+ pycurve25519_makeprivate(PyObject *self, PyObject *args)
22
+ {
23
+ char *in1;
24
+ Py_ssize_t in1len;
25
+ if (!PyArg_ParseTuple(args, y"#:clamp", &in1, &in1len))
26
+ return NULL;
27
+ if (in1len != 32) {
28
+ PyErr_SetString(PyExc_ValueError, "input must be 32-byte string");
29
+ return NULL;
30
+ }
31
+ in1[0] &= 248;
32
+ in1[31] &= 127;
33
+ in1[31] |= 64;
34
+ return PyBytes_FromStringAndSize((char *)in1, 32);
35
+ }
36
+
37
+ static PyObject *
38
+ pycurve25519_makepublic(PyObject *self, PyObject *args)
39
+ {
40
+ const char *private;
41
+ char mypublic[32];
42
+ char basepoint[32] = {9};
43
+ Py_ssize_t privatelen;
44
+ if (!PyArg_ParseTuple(args, y"#:makepublic", &private, &privatelen))
45
+ return NULL;
46
+ if (privatelen != 32) {
47
+ PyErr_SetString(PyExc_ValueError, "input must be 32-byte string");
48
+ return NULL;
49
+ }
50
+ curve25519_donna(mypublic, private, basepoint);
51
+ return PyBytes_FromStringAndSize((char *)mypublic, 32);
52
+ }
53
+
54
+ static PyObject *
55
+ pycurve25519_makeshared(PyObject *self, PyObject *args)
56
+ {
57
+ const char *myprivate, *theirpublic;
58
+ char shared_key[32];
59
+ Py_ssize_t myprivatelen, theirpubliclen;
60
+ if (!PyArg_ParseTuple(args, y"#"y"#:generate",
61
+ &myprivate, &myprivatelen, &theirpublic, &theirpubliclen))
62
+ return NULL;
63
+ if (myprivatelen != 32) {
64
+ PyErr_SetString(PyExc_ValueError, "input must be 32-byte string");
65
+ return NULL;
66
+ }
67
+ if (theirpubliclen != 32) {
68
+ PyErr_SetString(PyExc_ValueError, "input must be 32-byte string");
69
+ return NULL;
70
+ }
71
+ curve25519_donna(shared_key, myprivate, theirpublic);
72
+ return PyBytes_FromStringAndSize((char *)shared_key, 32);
73
+ }
74
+
75
+
76
+ static PyMethodDef
77
+ curve25519_functions[] = {
78
+ {"make_private", pycurve25519_makeprivate, METH_VARARGS, "data->private"},
79
+ {"make_public", pycurve25519_makepublic, METH_VARARGS, "private->public"},
80
+ {"make_shared", pycurve25519_makeshared, METH_VARARGS, "private+public->shared"},
81
+ {NULL, NULL, 0, NULL},
82
+ };
83
+
84
+ #if PY_MAJOR_VERSION >= 3
85
+ static struct PyModuleDef
86
+ curve25519_module = {
87
+ PyModuleDef_HEAD_INIT,
88
+ "_curve25519",
89
+ NULL,
90
+ NULL,
91
+ curve25519_functions,
92
+ };
93
+
94
+ PyObject *
95
+ PyInit__curve25519(void)
96
+ {
97
+ return PyModule_Create(&curve25519_module);
98
+ }
99
+ #else
100
+ PyMODINIT_FUNC
101
+ init_curve25519(void)
102
+ {
103
+ (void)Py_InitModule("_curve25519", curve25519_functions);
104
+ }
105
+ #endif
@@ -0,0 +1,50 @@
1
+ #include <stdio.h>
2
+ #include <string.h>
3
+ #include <sys/time.h>
4
+ #include <time.h>
5
+ #include <stdint.h>
6
+
7
+ typedef uint8_t u8;
8
+
9
+ extern void curve25519_donna(u8 *output, const u8 *secret, const u8 *bp);
10
+
11
+ static uint64_t
12
+ time_now() {
13
+ struct timeval tv;
14
+ uint64_t ret;
15
+
16
+ gettimeofday(&tv, NULL);
17
+ ret = tv.tv_sec;
18
+ ret *= 1000000;
19
+ ret += tv.tv_usec;
20
+
21
+ return ret;
22
+ }
23
+
24
+ int
25
+ main() {
26
+ static const unsigned char basepoint[32] = {9};
27
+ unsigned char mysecret[32], mypublic[32];
28
+ unsigned i;
29
+ uint64_t start, end;
30
+
31
+ memset(mysecret, 42, 32);
32
+ mysecret[0] &= 248;
33
+ mysecret[31] &= 127;
34
+ mysecret[31] |= 64;
35
+
36
+ // Load the caches
37
+ for (i = 0; i < 1000; ++i) {
38
+ curve25519_donna(mypublic, mysecret, basepoint);
39
+ }
40
+
41
+ start = time_now();
42
+ for (i = 0; i < 30000; ++i) {
43
+ curve25519_donna(mypublic, mysecret, basepoint);
44
+ }
45
+ end = time_now();
46
+
47
+ printf("%luus\n", (unsigned long) ((end - start) / 30000));
48
+
49
+ return 0;
50
+ }
@@ -0,0 +1,54 @@
1
+ /*
2
+ test-curve25519 version 20050915
3
+ D. J. Bernstein
4
+ Public domain.
5
+
6
+ Tiny modifications by agl
7
+ */
8
+
9
+ #include <stdio.h>
10
+
11
+ extern void curve25519_donna(unsigned char *output, const unsigned char *a,
12
+ const unsigned char *b);
13
+ void doit(unsigned char *ek,unsigned char *e,unsigned char *k);
14
+
15
+ void doit(unsigned char *ek,unsigned char *e,unsigned char *k)
16
+ {
17
+ int i;
18
+
19
+ for (i = 0;i < 32;++i) printf("%02x",(unsigned int) e[i]); printf(" ");
20
+ for (i = 0;i < 32;++i) printf("%02x",(unsigned int) k[i]); printf(" ");
21
+ curve25519_donna(ek,e,k);
22
+ for (i = 0;i < 32;++i) printf("%02x",(unsigned int) ek[i]); printf("\n");
23
+ }
24
+
25
+ unsigned char e1k[32];
26
+ unsigned char e2k[32];
27
+ unsigned char e1e2k[32];
28
+ unsigned char e2e1k[32];
29
+ unsigned char e1[32] = {3};
30
+ unsigned char e2[32] = {5};
31
+ unsigned char k[32] = {9};
32
+
33
+ int
34
+ main()
35
+ {
36
+ int loop;
37
+ int i;
38
+
39
+ for (loop = 0;loop < 10000;++loop) {
40
+ doit(e1k,e1,k);
41
+ doit(e2e1k,e2,e1k);
42
+ doit(e2k,e2,k);
43
+ doit(e1e2k,e1,e2k);
44
+ for (i = 0;i < 32;++i) if (e1e2k[i] != e2e1k[i]) {
45
+ printf("fail\n");
46
+ return 1;
47
+ }
48
+ for (i = 0;i < 32;++i) e1[i] ^= e2k[i];
49
+ for (i = 0;i < 32;++i) e2[i] ^= e1k[i];
50
+ for (i = 0;i < 32;++i) k[i] ^= e1e2k[i];
51
+ }
52
+
53
+ return 0;
54
+ }
@@ -0,0 +1,39 @@
1
+ /* This file can be used to test whether the code handles non-canonical curve
2
+ * points (i.e. points with the 256th bit set) in the same way as the reference
3
+ * implementation. */
4
+
5
+ #include <stdint.h>
6
+ #include <stdio.h>
7
+ #include <string.h>
8
+
9
+ extern void curve25519_donna(unsigned char *output, const unsigned char *a,
10
+ const unsigned char *b);
11
+ int
12
+ main()
13
+ {
14
+ static const uint8_t point1[32] = {
15
+ 0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
16
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
17
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
19
+ };
20
+ static const uint8_t point2[32] = {
21
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
22
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
23
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
24
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
25
+ };
26
+ static const uint8_t scalar[32] = { 1 };
27
+ uint8_t out1[32], out2[32];
28
+
29
+ curve25519_donna(out1, scalar, point1);
30
+ curve25519_donna(out2, scalar, point2);
31
+
32
+ if (0 == memcmp(out1, out2, sizeof(out1))) {
33
+ fprintf(stderr, "Top bit not ignored.\n");
34
+ return 1;
35
+ }
36
+
37
+ fprintf(stderr, "Top bit correctly ignored.\n");
38
+ return 0;
39
+ }
@@ -0,0 +1,72 @@
1
+ #define _GNU_SOURCE
2
+
3
+ #include <stdio.h>
4
+ #include <string.h>
5
+ #include <stdint.h>
6
+ #include <math.h>
7
+
8
+ extern void curve25519_donna(uint8_t *, const uint8_t *, const uint8_t *);
9
+ extern uint64_t tsc_read();
10
+
11
+ int
12
+ main(int argc, char **argv) {
13
+ uint8_t private_key[32], public[32], peer1[32], peer2[32], output[32];
14
+ static const uint8_t basepoint[32] = {9};
15
+ unsigned i;
16
+ uint64_t sum = 0, sum_squares = 0, skipped = 0, mean;
17
+ static const unsigned count = 200000;
18
+
19
+ memset(private_key, 42, sizeof(private_key));
20
+
21
+ private_key[0] &= 248;
22
+ private_key[31] &= 127;
23
+ private_key[31] |= 64;
24
+
25
+ curve25519_donna(public, private_key, basepoint);
26
+ memset(peer1, 0, sizeof(peer1));
27
+ memset(peer2, 255, sizeof(peer2));
28
+
29
+ for (i = 0; i < count; ++i) {
30
+ const uint64_t start = tsc_read();
31
+ curve25519_donna(output, peer1, public);
32
+ const uint64_t end = tsc_read();
33
+ const uint64_t delta = end - start;
34
+ if (delta > 650000) {
35
+ // something terrible happened (task switch etc)
36
+ skipped++;
37
+ continue;
38
+ }
39
+ sum += delta;
40
+ sum_squares += (delta * delta);
41
+ }
42
+
43
+ mean = sum / ((uint64_t) count);
44
+ printf("all 0: mean:%lu sd:%f skipped:%lu\n",
45
+ mean,
46
+ sqrt((double)(sum_squares/((uint64_t) count) - mean*mean)),
47
+ skipped);
48
+
49
+ sum = sum_squares = skipped = 0;
50
+
51
+ for (i = 0; i < count; ++i) {
52
+ const uint64_t start = tsc_read();
53
+ curve25519_donna(output, peer2, public);
54
+ const uint64_t end = tsc_read();
55
+ const uint64_t delta = end - start;
56
+ if (delta > 650000) {
57
+ // something terrible happened (task switch etc)
58
+ skipped++;
59
+ continue;
60
+ }
61
+ sum += delta;
62
+ sum_squares += (delta * delta);
63
+ }
64
+
65
+ mean = sum / ((uint64_t) count);
66
+ printf("all 1: mean:%lu sd:%f skipped:%lu\n",
67
+ mean,
68
+ sqrt((double)(sum_squares/((uint64_t) count) - mean*mean)),
69
+ skipped);
70
+
71
+ return 0;
72
+ }
@@ -0,0 +1,18 @@
1
+ /* header file for the curve25519-donna implementation, because the
2
+ * authors of that project don't supply one.
3
+ */
4
+ #ifndef CURVE25519_DONNA_H
5
+ #define CURVE25519_DONNA_H
6
+
7
+ #ifdef __cplusplus
8
+ extern "C" {
9
+ #endif
10
+
11
+ extern int curve25519_donna(unsigned char *output, const unsigned char *a,
12
+ const unsigned char *b);
13
+
14
+ #ifdef __cplusplus
15
+ }
16
+ #endif
17
+
18
+ #endif
@@ -0,0 +1,56 @@
1
+ #include "ed25519.h"
2
+ #include "ge.h"
3
+ #include "sc.h"
4
+
5
+
6
+ /* see http://crypto.stackexchange.com/a/6215/4697 */
7
+ void ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, const unsigned char *scalar) {
8
+ const unsigned char SC_1[32] = {1}; /* scalar with value 1 */
9
+
10
+ unsigned char n[32];
11
+ ge_p3 nB;
12
+ ge_p1p1 A_p1p1;
13
+ ge_p3 A;
14
+ ge_p3 public_key_unpacked;
15
+ ge_cached T;
16
+
17
+ int i;
18
+
19
+ /* copy the scalar and clear highest bit */
20
+ for (i = 0; i < 31; ++i) {
21
+ n[i] = scalar[i];
22
+ }
23
+ n[31] = scalar[31] & 127;
24
+
25
+ /* private key: a = n + t */
26
+ if (private_key) {
27
+ sc_muladd(private_key, SC_1, n, private_key);
28
+ }
29
+
30
+ /* public key: A = nB + T */
31
+ if (public_key) {
32
+ /* if we know the private key we don't need a point addition, which is faster */
33
+ /* using a "timing attack" you could find out wether or not we know the private
34
+ key, but this information seems rather useless - if this is important pass
35
+ public_key and private_key seperately in 2 function calls */
36
+ if (private_key) {
37
+ ge_scalarmult_base(&A, private_key);
38
+ } else {
39
+ /* unpack public key into T */
40
+ ge_frombytes_negate_vartime(&public_key_unpacked, public_key);
41
+ fe_neg(public_key_unpacked.X, public_key_unpacked.X); /* undo negate */
42
+ fe_neg(public_key_unpacked.T, public_key_unpacked.T); /* undo negate */
43
+ ge_p3_to_cached(&T, &public_key_unpacked);
44
+
45
+ /* calculate n*B */
46
+ ge_scalarmult_base(&nB, n);
47
+
48
+ /* A = n*B + T */
49
+ ge_add(&A_p1p1, &nB, &T);
50
+ ge_p1p1_to_p3(&A, &A_p1p1);
51
+ }
52
+
53
+ /* pack public key */
54
+ ge_p3_tobytes(public_key, &A);
55
+ }
56
+ }
@@ -0,0 +1,38 @@
1
+ #ifndef ED25519_H
2
+ #define ED25519_H
3
+
4
+ #include <stddef.h>
5
+
6
+ #if defined(_WIN32)
7
+ #if defined(ED25519_BUILD_DLL)
8
+ #define ED25519_DECLSPEC __declspec(dllexport)
9
+ #elif defined(ED25519_DLL)
10
+ #define ED25519_DECLSPEC __declspec(dllimport)
11
+ #else
12
+ #define ED25519_DECLSPEC
13
+ #endif
14
+ #else
15
+ #define ED25519_DECLSPEC
16
+ #endif
17
+
18
+
19
+ #ifdef __cplusplus
20
+ extern "C" {
21
+ #endif
22
+
23
+ #ifndef ED25519_NO_SEED
24
+ int ED25519_DECLSPEC ed25519_create_seed(unsigned char *seed);
25
+ #endif
26
+
27
+ void ED25519_DECLSPEC ed25519_create_keypair(unsigned char *public_key, unsigned char *private_key, const unsigned char *seed);
28
+ void ED25519_DECLSPEC ed25519_sign(unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key, const unsigned char *private_key);
29
+ int ED25519_DECLSPEC ed25519_verify(const unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key);
30
+ void ED25519_DECLSPEC ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, const unsigned char *scalar);
31
+ void ED25519_DECLSPEC ed25519_key_exchange(unsigned char *shared_secret, const unsigned char *public_key, const unsigned char *private_key);
32
+
33
+
34
+ #ifdef __cplusplus
35
+ }
36
+ #endif
37
+
38
+ #endif