ruby_olm 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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,123 @@
1
+ /*********************************************************************
2
+ * Filename: aes.h
3
+ * Author: Brad Conte (brad AT bradconte.com)
4
+ * Copyright:
5
+ * Disclaimer: This code is presented "as is" without any guarantees.
6
+ * Details: Defines the API for the corresponding AES implementation.
7
+ *********************************************************************/
8
+
9
+ #ifndef AES_H
10
+ #define AES_H
11
+
12
+ /*************************** HEADER FILES ***************************/
13
+ #include <stddef.h>
14
+
15
+ /****************************** MACROS ******************************/
16
+ #define AES_BLOCK_SIZE 16 // AES operates on 16 bytes at a time
17
+
18
+ /**************************** DATA TYPES ****************************/
19
+ typedef unsigned char BYTE; // 8-bit byte
20
+ typedef unsigned int WORD; // 32-bit word, change to "long" for 16-bit machines
21
+
22
+ /*********************** FUNCTION DECLARATIONS **********************/
23
+ ///////////////////
24
+ // AES
25
+ ///////////////////
26
+ // Key setup must be done before any AES en/de-cryption functions can be used.
27
+ void aes_key_setup(const BYTE key[], // The key, must be 128, 192, or 256 bits
28
+ WORD w[], // Output key schedule to be used later
29
+ int keysize); // Bit length of the key, 128, 192, or 256
30
+
31
+ void aes_encrypt(const BYTE in[], // 16 bytes of plaintext
32
+ BYTE out[], // 16 bytes of ciphertext
33
+ const WORD key[], // From the key setup
34
+ int keysize); // Bit length of the key, 128, 192, or 256
35
+
36
+ void aes_decrypt(const BYTE in[], // 16 bytes of ciphertext
37
+ BYTE out[], // 16 bytes of plaintext
38
+ const WORD key[], // From the key setup
39
+ int keysize); // Bit length of the key, 128, 192, or 256
40
+
41
+ ///////////////////
42
+ // AES - CBC
43
+ ///////////////////
44
+ int aes_encrypt_cbc(const BYTE in[], // Plaintext
45
+ size_t in_len, // Must be a multiple of AES_BLOCK_SIZE
46
+ BYTE out[], // Ciphertext, same length as plaintext
47
+ const WORD key[], // From the key setup
48
+ int keysize, // Bit length of the key, 128, 192, or 256
49
+ const BYTE iv[]); // IV, must be AES_BLOCK_SIZE bytes long
50
+
51
+ // Only output the CBC-MAC of the input.
52
+ int aes_encrypt_cbc_mac(const BYTE in[], // plaintext
53
+ size_t in_len, // Must be a multiple of AES_BLOCK_SIZE
54
+ BYTE out[], // Output MAC
55
+ const WORD key[], // From the key setup
56
+ int keysize, // Bit length of the key, 128, 192, or 256
57
+ const BYTE iv[]); // IV, must be AES_BLOCK_SIZE bytes long
58
+
59
+ ///////////////////
60
+ // AES - CTR
61
+ ///////////////////
62
+ void increment_iv(BYTE iv[], // Must be a multiple of AES_BLOCK_SIZE
63
+ int counter_size); // Bytes of the IV used for counting (low end)
64
+
65
+ void aes_encrypt_ctr(const BYTE in[], // Plaintext
66
+ size_t in_len, // Any byte length
67
+ BYTE out[], // Ciphertext, same length as plaintext
68
+ const WORD key[], // From the key setup
69
+ int keysize, // Bit length of the key, 128, 192, or 256
70
+ const BYTE iv[]); // IV, must be AES_BLOCK_SIZE bytes long
71
+
72
+ void aes_decrypt_ctr(const BYTE in[], // Ciphertext
73
+ size_t in_len, // Any byte length
74
+ BYTE out[], // Plaintext, same length as ciphertext
75
+ const WORD key[], // From the key setup
76
+ int keysize, // Bit length of the key, 128, 192, or 256
77
+ const BYTE iv[]); // IV, must be AES_BLOCK_SIZE bytes long
78
+
79
+ ///////////////////
80
+ // AES - CCM
81
+ ///////////////////
82
+ // Returns True if the input parameters do not violate any constraint.
83
+ int aes_encrypt_ccm(const BYTE plaintext[], // IN - Plaintext.
84
+ WORD plaintext_len, // IN - Plaintext length.
85
+ const BYTE associated_data[], // IN - Associated Data included in authentication, but not encryption.
86
+ unsigned short associated_data_len, // IN - Associated Data length in bytes.
87
+ const BYTE nonce[], // IN - The Nonce to be used for encryption.
88
+ unsigned short nonce_len, // IN - Nonce length in bytes.
89
+ BYTE ciphertext[], // OUT - Ciphertext, a concatination of the plaintext and the MAC.
90
+ WORD *ciphertext_len, // OUT - The length of the ciphertext, always plaintext_len + mac_len.
91
+ WORD mac_len, // IN - The desired length of the MAC, must be 4, 6, 8, 10, 12, 14, or 16.
92
+ const BYTE key[], // IN - The AES key for encryption.
93
+ int keysize); // IN - The length of the key in bits. Valid values are 128, 192, 256.
94
+
95
+ // Returns True if the input parameters do not violate any constraint.
96
+ // Use mac_auth to ensure decryption/validation was preformed correctly.
97
+ // If authentication does not succeed, the plaintext is zeroed out. To overwride
98
+ // this, call with mac_auth = NULL. The proper proceedure is to decrypt with
99
+ // authentication enabled (mac_auth != NULL) and make a second call to that
100
+ // ignores authentication explicitly if the first call failes.
101
+ int aes_decrypt_ccm(const BYTE ciphertext[], // IN - Ciphertext, the concatination of encrypted plaintext and MAC.
102
+ WORD ciphertext_len, // IN - Ciphertext length in bytes.
103
+ const BYTE assoc[], // IN - The Associated Data, required for authentication.
104
+ unsigned short assoc_len, // IN - Associated Data length in bytes.
105
+ const BYTE nonce[], // IN - The Nonce to use for decryption, same one as for encryption.
106
+ unsigned short nonce_len, // IN - Nonce length in bytes.
107
+ BYTE plaintext[], // OUT - The plaintext that was decrypted. Will need to be large enough to hold ciphertext_len - mac_len.
108
+ WORD *plaintext_len, // OUT - Length in bytes of the output plaintext, always ciphertext_len - mac_len .
109
+ WORD mac_len, // IN - The length of the MAC that was calculated.
110
+ int *mac_auth, // OUT - TRUE if authentication succeeded, FALSE if it did not. NULL pointer will ignore the authentication.
111
+ const BYTE key[], // IN - The AES key for decryption.
112
+ int keysize); // IN - The length of the key in BITS. Valid values are 128, 192, 256.
113
+
114
+ ///////////////////
115
+ // Test functions
116
+ ///////////////////
117
+ int aes_test();
118
+ int aes_ecb_test();
119
+ int aes_cbc_test();
120
+ int aes_ctr_test();
121
+ int aes_ccm_test();
122
+
123
+ #endif // AES_H
@@ -0,0 +1,276 @@
1
+ /*********************************************************************
2
+ * Filename: aes_test.c
3
+ * Author: Brad Conte (brad AT bradconte.com)
4
+ * Copyright:
5
+ * Disclaimer: This code is presented "as is" without any guarantees.
6
+ * Details: Performs known-answer tests on the corresponding AES
7
+ implementation. These tests do not encompass the full
8
+ range of available test vectors and are not sufficient
9
+ for FIPS-140 certification. However, if the tests pass
10
+ it is very, very likely that the code is correct and was
11
+ compiled properly. This code also serves as
12
+ example usage of the functions.
13
+ *********************************************************************/
14
+
15
+ /*************************** HEADER FILES ***************************/
16
+ #include <stdio.h>
17
+ #include <memory.h>
18
+ #include "aes.h"
19
+
20
+ /*********************** FUNCTION DEFINITIONS ***********************/
21
+ void print_hex(BYTE str[], int len)
22
+ {
23
+ int idx;
24
+
25
+ for(idx = 0; idx < len; idx++)
26
+ printf("%02x", str[idx]);
27
+ }
28
+
29
+ int aes_ecb_test()
30
+ {
31
+ WORD key_schedule[60], idx;
32
+ BYTE enc_buf[128];
33
+ BYTE plaintext[2][16] = {
34
+ {0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a},
35
+ {0xae,0x2d,0x8a,0x57,0x1e,0x03,0xac,0x9c,0x9e,0xb7,0x6f,0xac,0x45,0xaf,0x8e,0x51}
36
+ };
37
+ BYTE ciphertext[2][16] = {
38
+ {0xf3,0xee,0xd1,0xbd,0xb5,0xd2,0xa0,0x3c,0x06,0x4b,0x5a,0x7e,0x3d,0xb1,0x81,0xf8},
39
+ {0x59,0x1c,0xcb,0x10,0xd4,0x10,0xed,0x26,0xdc,0x5b,0xa7,0x4a,0x31,0x36,0x28,0x70}
40
+ };
41
+ BYTE key[1][32] = {
42
+ {0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4}
43
+ };
44
+ int pass = 1;
45
+
46
+ // Raw ECB mode.
47
+ //printf("* ECB mode:\n");
48
+ aes_key_setup(key[0], key_schedule, 256);
49
+ //printf( "Key : ");
50
+ //print_hex(key[0], 32);
51
+
52
+ for(idx = 0; idx < 2; idx++) {
53
+ aes_encrypt(plaintext[idx], enc_buf, key_schedule, 256);
54
+ //printf("\nPlaintext : ");
55
+ //print_hex(plaintext[idx], 16);
56
+ //printf("\n-encrypted to: ");
57
+ //print_hex(enc_buf, 16);
58
+ pass = pass && !memcmp(enc_buf, ciphertext[idx], 16);
59
+
60
+ aes_decrypt(ciphertext[idx], enc_buf, key_schedule, 256);
61
+ //printf("\nCiphertext : ");
62
+ //print_hex(ciphertext[idx], 16);
63
+ //printf("\n-decrypted to: ");
64
+ //print_hex(enc_buf, 16);
65
+ pass = pass && !memcmp(enc_buf, plaintext[idx], 16);
66
+
67
+ //printf("\n\n");
68
+ }
69
+
70
+ return(pass);
71
+ }
72
+
73
+ int aes_cbc_test()
74
+ {
75
+ WORD key_schedule[60];
76
+ BYTE enc_buf[128];
77
+ BYTE plaintext[1][32] = {
78
+ {0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a,0xae,0x2d,0x8a,0x57,0x1e,0x03,0xac,0x9c,0x9e,0xb7,0x6f,0xac,0x45,0xaf,0x8e,0x51}
79
+ };
80
+ BYTE ciphertext[2][32] = {
81
+ {0xf5,0x8c,0x4c,0x04,0xd6,0xe5,0xf1,0xba,0x77,0x9e,0xab,0xfb,0x5f,0x7b,0xfb,0xd6,0x9c,0xfc,0x4e,0x96,0x7e,0xdb,0x80,0x8d,0x67,0x9f,0x77,0x7b,0xc6,0x70,0x2c,0x7d}
82
+ };
83
+ BYTE iv[1][16] = {
84
+ {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}
85
+ };
86
+ BYTE key[1][32] = {
87
+ {0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4}
88
+ };
89
+ int pass = 1;
90
+
91
+ //printf("* CBC mode:\n");
92
+ aes_key_setup(key[0], key_schedule, 256);
93
+
94
+ //printf( "Key : ");
95
+ //print_hex(key[0], 32);
96
+ //printf("\nIV : ");
97
+ //print_hex(iv[0], 16);
98
+
99
+ aes_encrypt_cbc(plaintext[0], 32, enc_buf, key_schedule, 256, iv[0]);
100
+ //printf("\nPlaintext : ");
101
+ //print_hex(plaintext[0], 32);
102
+ //printf("\n-encrypted to: ");
103
+ //print_hex(enc_buf, 32);
104
+ //printf("\nCiphertext : ");
105
+ //print_hex(ciphertext[0], 32);
106
+ pass = pass && !memcmp(enc_buf, ciphertext[0], 32);
107
+
108
+ //printf("\n\n");
109
+ return(pass);
110
+ }
111
+
112
+ int aes_ctr_test()
113
+ {
114
+ WORD key_schedule[60];
115
+ BYTE enc_buf[128];
116
+ BYTE plaintext[1][32] = {
117
+ {0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a,0xae,0x2d,0x8a,0x57,0x1e,0x03,0xac,0x9c,0x9e,0xb7,0x6f,0xac,0x45,0xaf,0x8e,0x51}
118
+ };
119
+ BYTE ciphertext[1][32] = {
120
+ {0x60,0x1e,0xc3,0x13,0x77,0x57,0x89,0xa5,0xb7,0xa7,0xf5,0x04,0xbb,0xf3,0xd2,0x28,0xf4,0x43,0xe3,0xca,0x4d,0x62,0xb5,0x9a,0xca,0x84,0xe9,0x90,0xca,0xca,0xf5,0xc5}
121
+ };
122
+ BYTE iv[1][16] = {
123
+ {0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff},
124
+ };
125
+ BYTE key[1][32] = {
126
+ {0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4}
127
+ };
128
+ int pass = 1;
129
+
130
+ //printf("* CTR mode:\n");
131
+ aes_key_setup(key[0], key_schedule, 256);
132
+
133
+ //printf( "Key : ");
134
+ //print_hex(key[0], 32);
135
+ //printf("\nIV : ");
136
+ //print_hex(iv[0], 16);
137
+
138
+ aes_encrypt_ctr(plaintext[0], 32, enc_buf, key_schedule, 256, iv[0]);
139
+ //printf("\nPlaintext : ");
140
+ //print_hex(plaintext[0], 32);
141
+ //printf("\n-encrypted to: ");
142
+ //print_hex(enc_buf, 32);
143
+ pass = pass && !memcmp(enc_buf, ciphertext[0], 32);
144
+
145
+ aes_decrypt_ctr(ciphertext[0], 32, enc_buf, key_schedule, 256, iv[0]);
146
+ //printf("\nCiphertext : ");
147
+ //print_hex(ciphertext[0], 32);
148
+ //printf("\n-decrypted to: ");
149
+ //print_hex(enc_buf, 32);
150
+ pass = pass && !memcmp(enc_buf, plaintext[0], 32);
151
+
152
+ //printf("\n\n");
153
+ return(pass);
154
+ }
155
+
156
+ int aes_ccm_test()
157
+ {
158
+ int mac_auth;
159
+ WORD enc_buf_len;
160
+ BYTE enc_buf[128];
161
+ BYTE plaintext[3][32] = {
162
+ {0x20,0x21,0x22,0x23},
163
+ {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f},
164
+ {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37}
165
+ };
166
+ BYTE assoc[3][32] = {
167
+ {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07},
168
+ {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f},
169
+ {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13}
170
+ };
171
+ BYTE ciphertext[3][32 + 16] = {
172
+ {0x71,0x62,0x01,0x5b,0x4d,0xac,0x25,0x5d},
173
+ {0xd2,0xa1,0xf0,0xe0,0x51,0xea,0x5f,0x62,0x08,0x1a,0x77,0x92,0x07,0x3d,0x59,0x3d,0x1f,0xc6,0x4f,0xbf,0xac,0xcd},
174
+ {0xe3,0xb2,0x01,0xa9,0xf5,0xb7,0x1a,0x7a,0x9b,0x1c,0xea,0xec,0xcd,0x97,0xe7,0x0b,0x61,0x76,0xaa,0xd9,0xa4,0x42,0x8a,0xa5,0x48,0x43,0x92,0xfb,0xc1,0xb0,0x99,0x51}
175
+ };
176
+ BYTE iv[3][16] = {
177
+ {0x10,0x11,0x12,0x13,0x14,0x15,0x16},
178
+ {0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17},
179
+ {0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b}
180
+ };
181
+ BYTE key[1][32] = {
182
+ {0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f}
183
+ };
184
+ int pass = 1;
185
+
186
+ //printf("* CCM mode:\n");
187
+ //printf("Key : ");
188
+ //print_hex(key[0], 16);
189
+
190
+ //print_hex(plaintext[0], 4);
191
+ //print_hex(assoc[0], 8);
192
+ //print_hex(ciphertext[0], 8);
193
+ //print_hex(iv[0], 7);
194
+ //print_hex(key[0], 16);
195
+
196
+ aes_encrypt_ccm(plaintext[0], 4, assoc[0], 8, iv[0], 7, enc_buf, &enc_buf_len, 4, key[0], 128);
197
+ //printf("\nNONCE : ");
198
+ //print_hex(iv[0], 7);
199
+ //printf("\nAssoc. Data : ");
200
+ //print_hex(assoc[0], 8);
201
+ //printf("\nPayload : ");
202
+ //print_hex(plaintext[0], 4);
203
+ //printf("\n-encrypted to: ");
204
+ //print_hex(enc_buf, enc_buf_len);
205
+ pass = pass && !memcmp(enc_buf, ciphertext[0], enc_buf_len);
206
+
207
+ aes_decrypt_ccm(ciphertext[0], 8, assoc[0], 8, iv[0], 7, enc_buf, &enc_buf_len, 4, &mac_auth, key[0], 128);
208
+ //printf("\n-Ciphertext : ");
209
+ //print_hex(ciphertext[0], 8);
210
+ //printf("\n-decrypted to: ");
211
+ //print_hex(enc_buf, enc_buf_len);
212
+ //printf("\nAuthenticated: %d ", mac_auth);
213
+ pass = pass && !memcmp(enc_buf, plaintext[0], enc_buf_len) && mac_auth;
214
+
215
+
216
+ aes_encrypt_ccm(plaintext[1], 16, assoc[1], 16, iv[1], 8, enc_buf, &enc_buf_len, 6, key[0], 128);
217
+ //printf("\n\nNONCE : ");
218
+ //print_hex(iv[1], 8);
219
+ //printf("\nAssoc. Data : ");
220
+ //print_hex(assoc[1], 16);
221
+ //printf("\nPayload : ");
222
+ //print_hex(plaintext[1], 16);
223
+ //printf("\n-encrypted to: ");
224
+ //print_hex(enc_buf, enc_buf_len);
225
+ pass = pass && !memcmp(enc_buf, ciphertext[1], enc_buf_len);
226
+
227
+ aes_decrypt_ccm(ciphertext[1], 22, assoc[1], 16, iv[1], 8, enc_buf, &enc_buf_len, 6, &mac_auth, key[0], 128);
228
+ //printf("\n-Ciphertext : ");
229
+ //print_hex(ciphertext[1], 22);
230
+ //printf("\n-decrypted to: ");
231
+ //print_hex(enc_buf, enc_buf_len);
232
+ //printf("\nAuthenticated: %d ", mac_auth);
233
+ pass = pass && !memcmp(enc_buf, plaintext[1], enc_buf_len) && mac_auth;
234
+
235
+
236
+ aes_encrypt_ccm(plaintext[2], 24, assoc[2], 20, iv[2], 12, enc_buf, &enc_buf_len, 8, key[0], 128);
237
+ //printf("\n\nNONCE : ");
238
+ //print_hex(iv[2], 12);
239
+ //printf("\nAssoc. Data : ");
240
+ //print_hex(assoc[2], 20);
241
+ //printf("\nPayload : ");
242
+ //print_hex(plaintext[2], 24);
243
+ //printf("\n-encrypted to: ");
244
+ //print_hex(enc_buf, enc_buf_len);
245
+ pass = pass && !memcmp(enc_buf, ciphertext[2], enc_buf_len);
246
+
247
+ aes_decrypt_ccm(ciphertext[2], 32, assoc[2], 20, iv[2], 12, enc_buf, &enc_buf_len, 8, &mac_auth, key[0], 128);
248
+ //printf("\n-Ciphertext : ");
249
+ //print_hex(ciphertext[2], 32);
250
+ //printf("\n-decrypted to: ");
251
+ //print_hex(enc_buf, enc_buf_len);
252
+ //printf("\nAuthenticated: %d ", mac_auth);
253
+ pass = pass && !memcmp(enc_buf, plaintext[2], enc_buf_len) && mac_auth;
254
+
255
+ //printf("\n\n");
256
+ return(pass);
257
+ }
258
+
259
+ int aes_test()
260
+ {
261
+ int pass = 1;
262
+
263
+ pass = pass && aes_ecb_test();
264
+ pass = pass && aes_cbc_test();
265
+ pass = pass && aes_ctr_test();
266
+ pass = pass && aes_ccm_test();
267
+
268
+ return(pass);
269
+ }
270
+
271
+ int main(int argc, char *argv[])
272
+ {
273
+ printf("AES Tests: %s\n", aes_test() ? "SUCCEEDED" : "FAILED");
274
+
275
+ return(0);
276
+ }
@@ -0,0 +1,45 @@
1
+ /*********************************************************************
2
+ * Filename: arcfour.c
3
+ * Author: Brad Conte (brad AT bradconte.com)
4
+ * Copyright:
5
+ * Disclaimer: This code is presented "as is" without any guarantees.
6
+ * Details: Implementation of the ARCFOUR encryption algorithm.
7
+ Algorithm specification can be found here:
8
+ * http://en.wikipedia.org/wiki/RC4
9
+ *********************************************************************/
10
+
11
+ /*************************** HEADER FILES ***************************/
12
+ #include <stdlib.h>
13
+ #include "arcfour.h"
14
+
15
+ /*********************** FUNCTION DEFINITIONS ***********************/
16
+ void arcfour_key_setup(BYTE state[], const BYTE key[], int len)
17
+ {
18
+ int i, j;
19
+ BYTE t;
20
+
21
+ for (i = 0; i < 256; ++i)
22
+ state[i] = i;
23
+ for (i = 0, j = 0; i < 256; ++i) {
24
+ j = (j + state[i] + key[i % len]) % 256;
25
+ t = state[i];
26
+ state[i] = state[j];
27
+ state[j] = t;
28
+ }
29
+ }
30
+
31
+ void arcfour_generate_stream(BYTE state[], BYTE out[], size_t len)
32
+ {
33
+ int i, j;
34
+ size_t idx;
35
+ BYTE t;
36
+
37
+ for (idx = 0, i = 0, j = 0; idx < len; ++idx) {
38
+ i = (i + 1) % 256;
39
+ j = (j + state[i]) % 256;
40
+ t = state[i];
41
+ state[i] = state[j];
42
+ state[j] = t;
43
+ out[idx] = state[(state[i] + state[j]) % 256];
44
+ }
45
+ }
@@ -0,0 +1,30 @@
1
+ /*********************************************************************
2
+ * Filename: arcfour.h
3
+ * Author: Brad Conte (brad AT bradconte.com)
4
+ * Copyright:
5
+ * Disclaimer: This code is presented "as is" without any guarantees.
6
+ * Details: Defines the API for the corresponding ARCFOUR implementation.
7
+ *********************************************************************/
8
+
9
+ #ifndef ARCFOUR_H
10
+ #define ARCFOUR_H
11
+
12
+ /*************************** HEADER FILES ***************************/
13
+ #include <stddef.h>
14
+
15
+ /**************************** DATA TYPES ****************************/
16
+ typedef unsigned char BYTE; // 8-bit byte
17
+
18
+ /*********************** FUNCTION DECLARATIONS **********************/
19
+ // Input: state - the state used to generate the keystream
20
+ // key - Key to use to initialize the state
21
+ // len - length of key in bytes (valid lenth is 1 to 256)
22
+ void arcfour_key_setup(BYTE state[], const BYTE key[], int len);
23
+
24
+ // Pseudo-Random Generator Algorithm
25
+ // Input: state - the state used to generate the keystream
26
+ // out - Must be allocated to be of at least "len" length
27
+ // len - number of bytes to generate
28
+ void arcfour_generate_stream(BYTE state[], BYTE out[], size_t len);
29
+
30
+ #endif // ARCFOUR_H
@@ -0,0 +1,47 @@
1
+ /*********************************************************************
2
+ * Filename: arcfour_test.c
3
+ * Author: Brad Conte (brad AT bradconte.com)
4
+ * Copyright:
5
+ * Disclaimer: This code is presented "as is" without any guarantees.
6
+ * Details: Performs known-answer tests on the corresponding ARCFOUR
7
+ implementation. These tests do not encompass the full
8
+ range of available test vectors, however, if the tests
9
+ pass it is very, very likely that the code is correct
10
+ and was compiled properly. This code also serves as
11
+ example usage of the functions.
12
+ *********************************************************************/
13
+
14
+ /*************************** HEADER FILES ***************************/
15
+ #include <stdio.h>
16
+ #include <memory.h>
17
+ #include "arcfour.h"
18
+
19
+ /*********************** FUNCTION DEFINITIONS ***********************/
20
+ int rc4_test()
21
+ {
22
+ BYTE state[256];
23
+ BYTE key[3][10] = {{"Key"}, {"Wiki"}, {"Secret"}};
24
+ BYTE stream[3][10] = {{0xEB,0x9F,0x77,0x81,0xB7,0x34,0xCA,0x72,0xA7,0x19},
25
+ {0x60,0x44,0xdb,0x6d,0x41,0xb7},
26
+ {0x04,0xd4,0x6b,0x05,0x3c,0xa8,0x7b,0x59}};
27
+ int stream_len[3] = {10,6,8};
28
+ BYTE buf[1024];
29
+ int idx;
30
+ int pass = 1;
31
+
32
+ // Only test the output stream. Note that the state can be reused.
33
+ for (idx = 0; idx < 3; idx++) {
34
+ arcfour_key_setup(state, key[idx], strlen(key[idx]));
35
+ arcfour_generate_stream(state, buf, stream_len[idx]);
36
+ pass = pass && !memcmp(stream[idx], buf, stream_len[idx]);
37
+ }
38
+
39
+ return(pass);
40
+ }
41
+
42
+ int main()
43
+ {
44
+ printf("ARCFOUR tests: %s\n", rc4_test() ? "SUCCEEDED" : "FAILED");
45
+
46
+ return(0);
47
+ }
@@ -0,0 +1,135 @@
1
+ /*********************************************************************
2
+ * Filename: base64.c
3
+ * Author: Brad Conte (brad AT bradconte.com)
4
+ * Copyright:
5
+ * Disclaimer: This code is presented "as is" without any guarantees.
6
+ * Details: Implementation of the Base64 encoding algorithm.
7
+ *********************************************************************/
8
+
9
+ /*************************** HEADER FILES ***************************/
10
+ #include <stdlib.h>
11
+ #include "base64.h"
12
+
13
+ /****************************** MACROS ******************************/
14
+ #define NEWLINE_INVL 76
15
+
16
+ /**************************** VARIABLES *****************************/
17
+ // Note: To change the charset to a URL encoding, replace the '+' and '/' with '*' and '-'
18
+ static const BYTE charset[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"};
19
+
20
+ /*********************** FUNCTION DEFINITIONS ***********************/
21
+ BYTE revchar(char ch)
22
+ {
23
+ if (ch >= 'A' && ch <= 'Z')
24
+ ch -= 'A';
25
+ else if (ch >= 'a' && ch <='z')
26
+ ch = ch - 'a' + 26;
27
+ else if (ch >= '0' && ch <='9')
28
+ ch = ch - '0' + 52;
29
+ else if (ch == '+')
30
+ ch = 62;
31
+ else if (ch == '/')
32
+ ch = 63;
33
+
34
+ return(ch);
35
+ }
36
+
37
+ size_t base64_encode(const BYTE in[], BYTE out[], size_t len, int newline_flag)
38
+ {
39
+ size_t idx, idx2, blks, blk_ceiling, left_over, newline_count = 0;
40
+
41
+ blks = (len / 3);
42
+ left_over = len % 3;
43
+
44
+ if (out == NULL) {
45
+ idx2 = blks * 4 ;
46
+ if (left_over)
47
+ idx2 += 4;
48
+ if (newline_flag)
49
+ idx2 += len / 57; // (NEWLINE_INVL / 4) * 3 = 57. One newline per 57 input bytes.
50
+ }
51
+ else {
52
+ // Since 3 input bytes = 4 output bytes, determine out how many even sets of
53
+ // 3 bytes the input has.
54
+ blk_ceiling = blks * 3;
55
+ for (idx = 0, idx2 = 0; idx < blk_ceiling; idx += 3, idx2 += 4) {
56
+ out[idx2] = charset[in[idx] >> 2];
57
+ out[idx2 + 1] = charset[((in[idx] & 0x03) << 4) | (in[idx + 1] >> 4)];
58
+ out[idx2 + 2] = charset[((in[idx + 1] & 0x0f) << 2) | (in[idx + 2] >> 6)];
59
+ out[idx2 + 3] = charset[in[idx + 2] & 0x3F];
60
+ // The offical standard requires a newline every 76 characters.
61
+ // (Eg, first newline is character 77 of the output.)
62
+ if (((idx2 - newline_count + 4) % NEWLINE_INVL == 0) && newline_flag) {
63
+ out[idx2 + 4] = '\n';
64
+ idx2++;
65
+ newline_count++;
66
+ }
67
+ }
68
+
69
+ if (left_over == 1) {
70
+ out[idx2] = charset[in[idx] >> 2];
71
+ out[idx2 + 1] = charset[(in[idx] & 0x03) << 4];
72
+ out[idx2 + 2] = '=';
73
+ out[idx2 + 3] = '=';
74
+ idx2 += 4;
75
+ }
76
+ else if (left_over == 2) {
77
+ out[idx2] = charset[in[idx] >> 2];
78
+ out[idx2 + 1] = charset[((in[idx] & 0x03) << 4) | (in[idx + 1] >> 4)];
79
+ out[idx2 + 2] = charset[(in[idx + 1] & 0x0F) << 2];
80
+ out[idx2 + 3] = '=';
81
+ idx2 += 4;
82
+ }
83
+ }
84
+
85
+ return(idx2);
86
+ }
87
+
88
+ size_t base64_decode(const BYTE in[], BYTE out[], size_t len)
89
+ {
90
+ BYTE ch;
91
+ size_t idx, idx2, blks, blk_ceiling, left_over;
92
+
93
+ if (in[len - 1] == '=')
94
+ len--;
95
+ if (in[len - 1] == '=')
96
+ len--;
97
+
98
+ blks = len / 4;
99
+ left_over = len % 4;
100
+
101
+ if (out == NULL) {
102
+ if (len >= 77 && in[NEWLINE_INVL] == '\n') // Verify that newlines where used.
103
+ len -= len / (NEWLINE_INVL + 1);
104
+ blks = len / 4;
105
+ left_over = len % 4;
106
+
107
+ idx = blks * 3;
108
+ if (left_over == 2)
109
+ idx ++;
110
+ else if (left_over == 3)
111
+ idx += 2;
112
+ }
113
+ else {
114
+ blk_ceiling = blks * 4;
115
+ for (idx = 0, idx2 = 0; idx2 < blk_ceiling; idx += 3, idx2 += 4) {
116
+ if (in[idx2] == '\n')
117
+ idx2++;
118
+ out[idx] = (revchar(in[idx2]) << 2) | ((revchar(in[idx2 + 1]) & 0x30) >> 4);
119
+ out[idx + 1] = (revchar(in[idx2 + 1]) << 4) | (revchar(in[idx2 + 2]) >> 2);
120
+ out[idx + 2] = (revchar(in[idx2 + 2]) << 6) | revchar(in[idx2 + 3]);
121
+ }
122
+
123
+ if (left_over == 2) {
124
+ out[idx] = (revchar(in[idx2]) << 2) | ((revchar(in[idx2 + 1]) & 0x30) >> 4);
125
+ idx++;
126
+ }
127
+ else if (left_over == 3) {
128
+ out[idx] = (revchar(in[idx2]) << 2) | ((revchar(in[idx2 + 1]) & 0x30) >> 4);
129
+ out[idx + 1] = (revchar(in[idx2 + 1]) << 4) | (revchar(in[idx2 + 2]) >> 2);
130
+ idx += 2;
131
+ }
132
+ }
133
+
134
+ return(idx);
135
+ }