ffi-hydrogen 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +30 -0
  5. data/.travis.yml +10 -0
  6. data/Gemfile +6 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +72 -0
  9. data/Rakefile +46 -0
  10. data/bench/both.rb +86 -0
  11. data/bench/encode.rb +57 -0
  12. data/bench/encrypt.rb +80 -0
  13. data/bench/init.rb +5 -0
  14. data/bin/console +14 -0
  15. data/bin/setup +8 -0
  16. data/ffi-hydrogen.gemspec +31 -0
  17. data/lib/ffi/hydrogen.rb +216 -0
  18. data/vendor/.clang-format +2 -0
  19. data/vendor/.gitignore +3 -0
  20. data/vendor/README.md +2 -0
  21. data/vendor/libhydrogen/.clang-format +95 -0
  22. data/vendor/libhydrogen/.gitignore +32 -0
  23. data/vendor/libhydrogen/.travis.yml +22 -0
  24. data/vendor/libhydrogen/LICENSE +18 -0
  25. data/vendor/libhydrogen/Makefile +61 -0
  26. data/vendor/libhydrogen/Makefile.arduino +51 -0
  27. data/vendor/libhydrogen/README.md +29 -0
  28. data/vendor/libhydrogen/hydrogen.c +18 -0
  29. data/vendor/libhydrogen/hydrogen.h +317 -0
  30. data/vendor/libhydrogen/impl/common.h +316 -0
  31. data/vendor/libhydrogen/impl/core.h +220 -0
  32. data/vendor/libhydrogen/impl/gimli-core/portable.h +39 -0
  33. data/vendor/libhydrogen/impl/gimli-core/sse2.h +97 -0
  34. data/vendor/libhydrogen/impl/gimli-core.h +25 -0
  35. data/vendor/libhydrogen/impl/hash.h +138 -0
  36. data/vendor/libhydrogen/impl/hydrogen_p.h +83 -0
  37. data/vendor/libhydrogen/impl/kdf.h +20 -0
  38. data/vendor/libhydrogen/impl/kx.h +441 -0
  39. data/vendor/libhydrogen/impl/pwhash.h +281 -0
  40. data/vendor/libhydrogen/impl/random.h +376 -0
  41. data/vendor/libhydrogen/impl/secretbox.h +236 -0
  42. data/vendor/libhydrogen/impl/sign.h +207 -0
  43. data/vendor/libhydrogen/impl/x25519.h +383 -0
  44. data/vendor/libhydrogen/library.properties +10 -0
  45. data/vendor/libhydrogen/logo.png +0 -0
  46. data/vendor/libhydrogen/tests/tests.c +431 -0
  47. data/vendor/main.c +140 -0
  48. data/vendor/stringencoders/.gitignore +25 -0
  49. data/vendor/stringencoders/.travis.yml +13 -0
  50. data/vendor/stringencoders/AUTHORS +1 -0
  51. data/vendor/stringencoders/COPYING +2 -0
  52. data/vendor/stringencoders/ChangeLog +170 -0
  53. data/vendor/stringencoders/Doxyfile +276 -0
  54. data/vendor/stringencoders/INSTALL +119 -0
  55. data/vendor/stringencoders/LICENSE +22 -0
  56. data/vendor/stringencoders/Makefile.am +3 -0
  57. data/vendor/stringencoders/NEWS +3 -0
  58. data/vendor/stringencoders/README +2 -0
  59. data/vendor/stringencoders/README.md +32 -0
  60. data/vendor/stringencoders/bootstrap.sh +3 -0
  61. data/vendor/stringencoders/configure-gcc-hardened.sh +16 -0
  62. data/vendor/stringencoders/configure.ac +44 -0
  63. data/vendor/stringencoders/doxy/footer.html +34 -0
  64. data/vendor/stringencoders/doxy/header.html +85 -0
  65. data/vendor/stringencoders/indent.sh +9 -0
  66. data/vendor/stringencoders/javascript/base64-speed.html +43 -0
  67. data/vendor/stringencoders/javascript/base64-test.html +209 -0
  68. data/vendor/stringencoders/javascript/base64.html +18 -0
  69. data/vendor/stringencoders/javascript/base64.js +176 -0
  70. data/vendor/stringencoders/javascript/qunit.css +119 -0
  71. data/vendor/stringencoders/javascript/qunit.js +1062 -0
  72. data/vendor/stringencoders/javascript/urlparse-test.html +367 -0
  73. data/vendor/stringencoders/javascript/urlparse.js +328 -0
  74. data/vendor/stringencoders/make-ci.sh +13 -0
  75. data/vendor/stringencoders/makerelease.sh +16 -0
  76. data/vendor/stringencoders/python/b85.py +176 -0
  77. data/vendor/stringencoders/src/Makefile.am +134 -0
  78. data/vendor/stringencoders/src/arraytoc.c +85 -0
  79. data/vendor/stringencoders/src/arraytoc.h +43 -0
  80. data/vendor/stringencoders/src/extern_c_begin.h +3 -0
  81. data/vendor/stringencoders/src/extern_c_end.h +3 -0
  82. data/vendor/stringencoders/src/html_named_entities_generator.py +203 -0
  83. data/vendor/stringencoders/src/modp_ascii.c +159 -0
  84. data/vendor/stringencoders/src/modp_ascii.h +162 -0
  85. data/vendor/stringencoders/src/modp_ascii_data.h +84 -0
  86. data/vendor/stringencoders/src/modp_ascii_gen.c +55 -0
  87. data/vendor/stringencoders/src/modp_b16.c +125 -0
  88. data/vendor/stringencoders/src/modp_b16.h +148 -0
  89. data/vendor/stringencoders/src/modp_b16_data.h +104 -0
  90. data/vendor/stringencoders/src/modp_b16_gen.c +65 -0
  91. data/vendor/stringencoders/src/modp_b2.c +69 -0
  92. data/vendor/stringencoders/src/modp_b2.h +130 -0
  93. data/vendor/stringencoders/src/modp_b2_data.h +44 -0
  94. data/vendor/stringencoders/src/modp_b2_gen.c +36 -0
  95. data/vendor/stringencoders/src/modp_b36.c +108 -0
  96. data/vendor/stringencoders/src/modp_b36.h +170 -0
  97. data/vendor/stringencoders/src/modp_b64.c +254 -0
  98. data/vendor/stringencoders/src/modp_b64.h +236 -0
  99. data/vendor/stringencoders/src/modp_b64_data.h +477 -0
  100. data/vendor/stringencoders/src/modp_b64_gen.c +168 -0
  101. data/vendor/stringencoders/src/modp_b64r.c +254 -0
  102. data/vendor/stringencoders/src/modp_b64r.h +242 -0
  103. data/vendor/stringencoders/src/modp_b64r_data.h +477 -0
  104. data/vendor/stringencoders/src/modp_b64w.c +254 -0
  105. data/vendor/stringencoders/src/modp_b64w.h +231 -0
  106. data/vendor/stringencoders/src/modp_b64w_data.h +477 -0
  107. data/vendor/stringencoders/src/modp_b85.c +109 -0
  108. data/vendor/stringencoders/src/modp_b85.h +171 -0
  109. data/vendor/stringencoders/src/modp_b85_data.h +36 -0
  110. data/vendor/stringencoders/src/modp_b85_gen.c +65 -0
  111. data/vendor/stringencoders/src/modp_bjavascript.c +65 -0
  112. data/vendor/stringencoders/src/modp_bjavascript.h +105 -0
  113. data/vendor/stringencoders/src/modp_bjavascript_data.h +84 -0
  114. data/vendor/stringencoders/src/modp_bjavascript_gen.c +58 -0
  115. data/vendor/stringencoders/src/modp_burl.c +228 -0
  116. data/vendor/stringencoders/src/modp_burl.h +259 -0
  117. data/vendor/stringencoders/src/modp_burl_data.h +136 -0
  118. data/vendor/stringencoders/src/modp_burl_gen.c +121 -0
  119. data/vendor/stringencoders/src/modp_html.c +128 -0
  120. data/vendor/stringencoders/src/modp_html.h +53 -0
  121. data/vendor/stringencoders/src/modp_html_named_entities.h +9910 -0
  122. data/vendor/stringencoders/src/modp_json.c +315 -0
  123. data/vendor/stringencoders/src/modp_json.h +103 -0
  124. data/vendor/stringencoders/src/modp_json_data.h +57 -0
  125. data/vendor/stringencoders/src/modp_json_gen.py +60 -0
  126. data/vendor/stringencoders/src/modp_mainpage.h +120 -0
  127. data/vendor/stringencoders/src/modp_numtoa.c +350 -0
  128. data/vendor/stringencoders/src/modp_numtoa.h +100 -0
  129. data/vendor/stringencoders/src/modp_qsiter.c +76 -0
  130. data/vendor/stringencoders/src/modp_qsiter.h +71 -0
  131. data/vendor/stringencoders/src/modp_stdint.h +43 -0
  132. data/vendor/stringencoders/src/modp_utf8.c +88 -0
  133. data/vendor/stringencoders/src/modp_utf8.h +38 -0
  134. data/vendor/stringencoders/src/modp_xml.c +311 -0
  135. data/vendor/stringencoders/src/modp_xml.h +166 -0
  136. data/vendor/stringencoders/src/stringencoders.pc +10 -0
  137. data/vendor/stringencoders/src/stringencoders.pc.in +10 -0
  138. data/vendor/stringencoders/test/Makefile.am +113 -0
  139. data/vendor/stringencoders/test/apr_base64.c +262 -0
  140. data/vendor/stringencoders/test/apr_base64.h +120 -0
  141. data/vendor/stringencoders/test/cxx_test.cc +482 -0
  142. data/vendor/stringencoders/test/minunit.h +82 -0
  143. data/vendor/stringencoders/test/modp_ascii_test.c +281 -0
  144. data/vendor/stringencoders/test/modp_b16_test.c +288 -0
  145. data/vendor/stringencoders/test/modp_b2_test.c +250 -0
  146. data/vendor/stringencoders/test/modp_b64_test.c +266 -0
  147. data/vendor/stringencoders/test/modp_b85_test.c +130 -0
  148. data/vendor/stringencoders/test/modp_bjavascript_test.c +137 -0
  149. data/vendor/stringencoders/test/modp_burl_test.c +423 -0
  150. data/vendor/stringencoders/test/modp_html_test.c +296 -0
  151. data/vendor/stringencoders/test/modp_json_test.c +336 -0
  152. data/vendor/stringencoders/test/modp_numtoa_test.c +545 -0
  153. data/vendor/stringencoders/test/modp_qsiter_test.c +280 -0
  154. data/vendor/stringencoders/test/modp_utf8_test.c +188 -0
  155. data/vendor/stringencoders/test/modp_xml_test.c +339 -0
  156. data/vendor/stringencoders/test/speedtest.c +241 -0
  157. data/vendor/stringencoders/test/speedtest_ascii.c +345 -0
  158. data/vendor/stringencoders/test/speedtest_msg.c +78 -0
  159. data/vendor/stringencoders/test/speedtest_numtoa.c +276 -0
  160. metadata +314 -0
@@ -0,0 +1,339 @@
1
+ /* we compile as C90 but use snprintf */
2
+ #define _ISOC99_SOURCE
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+ #include <string.h>
6
+
7
+ #include "minunit.h"
8
+
9
+ #include "modp_xml.h"
10
+
11
+ /**
12
+ * Test empty input to decode
13
+ */
14
+ static char* testXmlDecodeEmpty(void)
15
+ {
16
+ size_t d;
17
+ char buf[1000];
18
+
19
+ buf[0] = 1;
20
+ d = modp_xml_decode(buf, "", (size_t)0);
21
+ mu_assert_int_equals(d, 0);
22
+ mu_assert(buf[0] == 0);
23
+
24
+ return 0;
25
+ }
26
+
27
+ /**
28
+ * Test characters that should be unchanged
29
+ * Mostly a copy from URL encoding
30
+ */
31
+ static char* testXmlDecodeUntouched(void)
32
+ {
33
+ const char* lower = "abcdefghijklmnopqrstuvwxyz";
34
+ const char* upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
35
+ const char* digits = "0123456789";
36
+ const char* special = ".-_~!$()*,;:@/?";
37
+ char buf[1000];
38
+
39
+ size_t d = 0;
40
+
41
+ memset(buf, 0, sizeof(buf));
42
+ d = modp_xml_decode(buf, lower, strlen(lower));
43
+ mu_assert_int_equals(d, strlen(lower));
44
+ mu_assert_str_equals(buf, lower);
45
+
46
+ memset(buf, 0, sizeof(buf));
47
+ d = modp_xml_decode(buf, upper, strlen(upper));
48
+ mu_assert_int_equals(d, strlen(upper));
49
+ mu_assert_str_equals(buf, upper);
50
+
51
+ memset(buf, 0, sizeof(buf));
52
+ d = modp_xml_decode(buf, digits, strlen(digits));
53
+ mu_assert_int_equals(d, strlen(digits));
54
+ mu_assert_str_equals(buf, digits);
55
+
56
+ memset(buf, 0, sizeof(buf));
57
+ d = modp_xml_decode(buf, special, strlen(special));
58
+ mu_assert_int_equals(d, strlen(special));
59
+ mu_assert_str_equals(buf, special);
60
+
61
+ return 0;
62
+ }
63
+
64
+ /**
65
+ * Test characters that should be unchanged
66
+ * Mostly a copy from URL encoding
67
+ */
68
+ static char* testXmlDecodeNames(void)
69
+ {
70
+ const char* strin = "X&quot;X&apos;X&amp;X&gt;X&lt;X";
71
+ const char* strout = "X\"X'X&X>X<X";
72
+
73
+ char buf[1000];
74
+ size_t d = 0;
75
+
76
+ memset(buf, 0, sizeof(buf));
77
+ d = modp_xml_decode(buf, strin, strlen(strin));
78
+ mu_assert_int_equals(d, strlen(strout));
79
+
80
+ mu_assert_str_equals(strout, buf);
81
+
82
+ return 0;
83
+ }
84
+
85
+ /**
86
+ * Bad entity name.. not existent
87
+ */
88
+ static char* testXmlDecodeBadNames1(void)
89
+ {
90
+ const char* strin = "X&quo;X";
91
+ const char* strout = "X&quo;X";
92
+
93
+ char buf[1000];
94
+ size_t d = 0;
95
+
96
+ memset(buf, 0, sizeof(buf));
97
+ d = modp_xml_decode(buf, strin, strlen(strin));
98
+ mu_assert_int_equals(d, strlen(strout));
99
+ mu_assert_str_equals(strout, buf);
100
+
101
+ return 0;
102
+ }
103
+
104
+ /**
105
+ * Bad entity name -- no semi-colon
106
+ */
107
+ static char* testXmlDecodeBadNames2(void)
108
+ {
109
+ const char* strin = "X&quotX";
110
+ const char* strout = "X&quotX";
111
+
112
+ char buf[1000];
113
+ size_t d = 0;
114
+
115
+ memset(buf, 0, sizeof(buf));
116
+ d = modp_xml_decode(buf, strin, strlen(strin));
117
+ mu_assert_int_equals(d, strlen(strout));
118
+ mu_assert_str_equals(strout, buf);
119
+
120
+ return 0;
121
+ }
122
+
123
+ /**
124
+ * Bad entity name -- no name!
125
+ */
126
+ static char* testXmlDecodeBadNames3(void)
127
+ {
128
+ const char* strin = "X&;X";
129
+ const char* strout = "X&;X";
130
+
131
+ char buf[1000];
132
+ size_t d = 0;
133
+
134
+ memset(buf, 0, sizeof(buf));
135
+ d = modp_xml_decode(buf, strin, strlen(strin));
136
+ mu_assert_int_equals(d, strlen(strout));
137
+ mu_assert_str_equals(strout, buf);
138
+
139
+ return 0;
140
+ }
141
+
142
+ /**
143
+ * Bad entity name -- boundary!
144
+ */
145
+ static char* testXmlDecodeBadNames4(void)
146
+ {
147
+ const char* strin = "X&;";
148
+ const char* strout = "X&;";
149
+
150
+ char buf[1000];
151
+ size_t d = 0;
152
+
153
+ memset(buf, 0, sizeof(buf));
154
+ d = modp_xml_decode(buf, strin, strlen(strin));
155
+ mu_assert_int_equals(d, strlen(strout));
156
+ mu_assert_str_equals(strout, buf);
157
+
158
+ return 0;
159
+ }
160
+
161
+ /**
162
+ * Bad entity name -- boundary!
163
+ */
164
+ static char* testXmlDecodeBadNames5(void)
165
+ {
166
+ const char* strin = "X&";
167
+ const char* strout = "X&";
168
+
169
+ char buf[1000];
170
+ size_t d = 0;
171
+
172
+ memset(buf, 0, sizeof(buf));
173
+ d = modp_xml_decode(buf, strin, strlen(strin));
174
+ mu_assert_int_equals(d, strlen(strout));
175
+ mu_assert_str_equals(strout, buf);
176
+
177
+ return 0;
178
+ }
179
+
180
+ /**
181
+ * Bad entity name.. case sensitive
182
+ */
183
+ static char* testXmlDecodeBadNames6(void)
184
+ {
185
+ const char* strin = "X&QUOT;X";
186
+ const char* strout = "X&QUOT;X";
187
+
188
+ char buf[1000];
189
+ size_t d = 0;
190
+
191
+ memset(buf, 0, sizeof(buf));
192
+ d = modp_xml_decode(buf, strin, strlen(strin));
193
+ mu_assert_int_equals(d, strlen(strout));
194
+ mu_assert_str_equals(strout, buf);
195
+
196
+ return 0;
197
+ }
198
+
199
+ static char* testXmlUnicodeCodePoints(void)
200
+ {
201
+ static const int ranges[] = {
202
+ 0x0000, 0x0008, /* control characters */
203
+ 0x000B, 0x000B, /* Vertical Tab is forbidden, ?? */
204
+ 0x000E, 0x001F, /* control characters */
205
+ 0x0080, 0x009F, /* control characters */
206
+ 0x0750, 0x077D, /* the rest are undefined */
207
+ 0x07C0, 0x08FF,
208
+ 0x1380, 0x139F,
209
+ 0x18B0, 0x18FF,
210
+ 0x1980, 0x19DF,
211
+ 0x1A00, 0x1CFF,
212
+ 0x1D80, 0x1DFF,
213
+ 0x2C00, 0x2E7F,
214
+ 0x2FE0, 0x2FEF,
215
+ 0x31C0, 0x31EF,
216
+ 0x9FB0, 0x9FFF,
217
+ 0xA4D0, 0xABFF,
218
+ 0xD7B0, 0xD7FF,
219
+ 0xFE10, 0xFE1F,
220
+ 0x10140, 0x102FF,
221
+ 0x104B0, 0x107FF,
222
+ 0x1D200, 0x1D2FF,
223
+ 0x1D360, 0x1D3FF,
224
+ 0x1D800, 0x1FFFF,
225
+ 0x2A6E0, 0x2F7FF,
226
+ 0x2FAB0, 0xDFFFF,
227
+ 0xE0080, 0xE00FF,
228
+ 0xE01F0, 0xEFFFF,
229
+ 0xFFFFE, 0xFFFFF
230
+ };
231
+ static const int imax = sizeof(ranges) / sizeof(uint32_t);
232
+ int i;
233
+ for (i = 0; i < imax; ++i) {
234
+ mu_assert_int_equals(-1, modp_xml_validate_unicode(ranges[i]));
235
+ }
236
+
237
+ /* too big */
238
+ mu_assert_int_equals(-1, modp_xml_validate_unicode(0xFFFFFF));
239
+
240
+ /* ok */
241
+ mu_assert_int_equals(0x41, modp_xml_validate_unicode(0x41));
242
+ return 0;
243
+ }
244
+
245
+ static char* testXmlUnicodeCharToUTF8(void)
246
+ {
247
+ char buf[1000];
248
+ size_t d = 0;
249
+ int val = 0;
250
+
251
+ d = modp_xml_unicode_char_to_utf8(buf, 0x41);
252
+ mu_assert_int_equals(1, d);
253
+ buf[d] = '\0';
254
+ mu_assert_str_equals(buf, "A");
255
+
256
+ /* Cent symbol */
257
+ d = modp_xml_unicode_char_to_utf8(buf, 0x00A2);
258
+ mu_assert_int_equals(2, d);
259
+ val = (unsigned char)buf[0];
260
+ mu_assert_int_equals(val, 0xC2);
261
+ val = (unsigned char)buf[1];
262
+ mu_assert_int_equals(val, 0xA2);
263
+
264
+ /* Euro symbol */
265
+ d = modp_xml_unicode_char_to_utf8(buf, 0x20AC);
266
+ mu_assert_int_equals(3, d);
267
+ val = (unsigned char)buf[0];
268
+ mu_assert_int_equals(val, 0xE2);
269
+ val = (unsigned char)buf[1];
270
+ mu_assert_int_equals(val, 0x82);
271
+ val = (unsigned char)buf[2];
272
+ mu_assert_int_equals(val, 0xAC);
273
+
274
+ /* Chinese Character */
275
+ d = modp_xml_unicode_char_to_utf8(buf, 0x24B62);
276
+ mu_assert_int_equals(4, d);
277
+ val = (unsigned char)buf[0];
278
+ mu_assert_int_equals(val, 0xF0);
279
+ val = (unsigned char)buf[1];
280
+ mu_assert_int_equals(val, 0xA4);
281
+ val = (unsigned char)buf[2];
282
+ mu_assert_int_equals(val, 0xAD);
283
+ val = (unsigned char)buf[3];
284
+ mu_assert_int_equals(val, 0xA2);
285
+
286
+ return 0;
287
+ }
288
+
289
+ static char* testXmlDecodeDecimalEntities(void)
290
+ {
291
+ const char* strin = "X&#65;X";
292
+ const char* strout = "XAX";
293
+
294
+ char buf[1000];
295
+ size_t d = 0;
296
+
297
+ memset(buf, 0, sizeof(buf));
298
+ d = modp_xml_decode(buf, strin, strlen(strin));
299
+ mu_assert_int_equals(d, strlen(strout));
300
+ mu_assert_str_equals(strout, buf);
301
+
302
+ return 0;
303
+ }
304
+
305
+ static char* testXmlDecodeHexEntities(void)
306
+ {
307
+ const char* strin = "X&#x41;X";
308
+ const char* strout = "XAX";
309
+
310
+ char buf[1000];
311
+ size_t d = 0;
312
+
313
+ memset(buf, 0, sizeof(buf));
314
+ d = modp_xml_decode(buf, strin, strlen(strin));
315
+ mu_assert_int_equals(d, strlen(strout));
316
+ mu_assert_str_equals(strout, buf);
317
+
318
+ return 0;
319
+ }
320
+
321
+ static char* all_tests(void)
322
+ {
323
+ mu_run_test(testXmlDecodeEmpty);
324
+ mu_run_test(testXmlDecodeUntouched);
325
+ mu_run_test(testXmlDecodeNames);
326
+ mu_run_test(testXmlDecodeBadNames1);
327
+ mu_run_test(testXmlDecodeBadNames2);
328
+ mu_run_test(testXmlDecodeBadNames3);
329
+ mu_run_test(testXmlDecodeBadNames4);
330
+ mu_run_test(testXmlDecodeBadNames5);
331
+ mu_run_test(testXmlDecodeBadNames6);
332
+ mu_run_test(testXmlUnicodeCodePoints);
333
+ mu_run_test(testXmlUnicodeCharToUTF8);
334
+ mu_run_test(testXmlDecodeDecimalEntities);
335
+ mu_run_test(testXmlDecodeHexEntities);
336
+ return 0;
337
+ }
338
+
339
+ UNITTESTS
@@ -0,0 +1,241 @@
1
+ /** \file speedtest.c
2
+ *
3
+ * Copyright 2005-2016 Nick Galbreath -- nickg [at] client9 [dot] com
4
+ * All rights reserved.
5
+ *
6
+ * https://github.com/client9/stringencoders/
7
+ *
8
+ * Released under MIT license. See LICENSE for details.
9
+ *
10
+ * Quickie performance tester. This does NOT test correctness.
11
+ *
12
+ */
13
+
14
+ #include "apr_base64.h"
15
+ #include "modp_b16.h"
16
+ #include "modp_b2.h"
17
+ #include "modp_b64.h"
18
+ #include "modp_b85.h"
19
+ #include "modp_bjavascript.h"
20
+ #include "modp_burl.h"
21
+
22
+ #include <time.h>
23
+ #ifndef CLOCKS_PER_SEC
24
+ #ifdef CLK_TCK
25
+ #define CLOCKS_PER_SEC (CLK_TCK)
26
+ #endif
27
+ #endif
28
+ #include <stdio.h>
29
+ #include <string.h>
30
+
31
+ #define SZ 4096
32
+ int main(void)
33
+ {
34
+ double s1, s2;
35
+ int i, j;
36
+ clock_t c0, c1;
37
+ char teststr1[SZ];
38
+
39
+ /*
40
+ this contains the message sizes we'll test on
41
+ add, subtract, change as desired.
42
+ */
43
+ size_t sizes[] = { 20, 200, 2000 };
44
+
45
+ for (i = 0; i < (int)sizeof(teststr1); ++i) {
46
+ teststr1[i] = (char)('A' + i % 26);
47
+ }
48
+
49
+ /* over allocate result buffers */
50
+ char result[SZ * 8];
51
+ char result2[SZ * 8];
52
+
53
+ const int MAX = 1000000;
54
+
55
+ for (j = 0; j < (int)(sizeof(sizes) / sizeof(size_t)); ++j) {
56
+ printf("\nMessage size = %d\n", (int)sizes[j]);
57
+
58
+ printf("\tmodpb64\tapache\timprovement\tmodpb85\tmodpurl\tmodpb16\tmodpb2\tmodpjs\n");
59
+ printf("Encode\t");
60
+ fflush(stdout);
61
+
62
+ /* MODP_B64 ENCODE */
63
+ c0 = clock();
64
+ for (i = 0; i < MAX; ++i) {
65
+ modp_b64_encode(result, teststr1, sizes[j]);
66
+ }
67
+ c1 = clock();
68
+ s1 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
69
+ printf("%6.2f\t", s1);
70
+ fflush(stdout);
71
+
72
+ /* APACHE ENCODE */
73
+ c0 = clock();
74
+ for (i = 0; i < MAX; ++i) {
75
+ apr_base64_encode_binary(result,
76
+ (const unsigned char*)teststr1,
77
+ (int)sizes[j]);
78
+ }
79
+ c1 = clock();
80
+ s2 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
81
+ printf("%6.2f\t", s2);
82
+ printf("%6.2fx\t\t", s2 / s1);
83
+ fflush(stdout);
84
+
85
+ /*
86
+ * base85 encode, let's see what is faster
87
+ */
88
+ c0 = clock();
89
+ for (i = 0; i < MAX; ++i) {
90
+ modp_b85_encode(result, teststr1, sizes[j]);
91
+ }
92
+ c1 = clock();
93
+ s1 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
94
+ printf("%6.2f\t", s1);
95
+ fflush(stdout);
96
+
97
+ /*
98
+ * url encode
99
+ */
100
+ c0 = clock();
101
+ for (i = 0; i < MAX; ++i) {
102
+ modp_burl_encode(result, teststr1, sizes[j]);
103
+ }
104
+ c1 = clock();
105
+ s1 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
106
+ printf("%6.2f\t", s1);
107
+ fflush(stdout);
108
+
109
+ /**
110
+ * B16
111
+ */
112
+ c0 = clock();
113
+ for (i = 0; i < MAX; ++i) {
114
+ modp_b16_encode(result, teststr1, sizes[j]);
115
+ }
116
+ c1 = clock();
117
+ s1 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
118
+ printf("%6.2f\t", s1);
119
+ fflush(stdout);
120
+
121
+ /**
122
+ * B2 BINARY
123
+ */
124
+ c0 = clock();
125
+ for (i = 0; i < MAX; ++i) {
126
+ modp_b2_encode(result, teststr1, sizes[j]);
127
+ }
128
+ c1 = clock();
129
+ s1 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
130
+ printf("%6.2f\t", s1);
131
+ fflush(stdout);
132
+
133
+ /**
134
+ * javascript
135
+ */
136
+ c0 = clock();
137
+ for (i = 0; i < MAX; ++i) {
138
+ modp_bjavascript_encode(result, teststr1, sizes[j]);
139
+ }
140
+ c1 = clock();
141
+ s1 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
142
+ printf("%6.2f\t", s1);
143
+ fflush(stdout);
144
+
145
+ printf("\n");
146
+ fflush(stdout);
147
+
148
+ /***
149
+ * DECODE
150
+ */
151
+ /* reset result to have b64 chars */
152
+ modp_b64_encode(result, teststr1, sizes[j]);
153
+ size_t len = strlen(result);
154
+
155
+ printf("Decode\t");
156
+ fflush(stdout);
157
+
158
+ /* MODP_B64 */
159
+ c0 = clock();
160
+ for (i = 0; i < MAX; ++i) {
161
+ modp_b64_decode(result2, result, len);
162
+ }
163
+ c1 = clock();
164
+ s1 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
165
+ printf("%6.2f\t", s1);
166
+ fflush(stdout);
167
+
168
+ /* APACHE */
169
+ c0 = clock();
170
+ for (i = 0; i < MAX; ++i) {
171
+ apr_base64_decode_binary((unsigned char*)result2, result);
172
+ }
173
+ c1 = clock();
174
+ s2 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
175
+ printf("%6.2f\t", s2);
176
+ printf("%6.2fx\t\t", s2 / s1);
177
+ fflush(stdout);
178
+
179
+ /*
180
+ * modp_b85 decode
181
+ */
182
+ /* re-encode to get b85 chars, not b64 */
183
+ len = modp_b85_encode(result, teststr1, sizes[j]);
184
+
185
+ c0 = clock();
186
+ for (i = 0; i < MAX; ++i) {
187
+ modp_b85_decode(result2, result, len);
188
+ }
189
+ c1 = clock();
190
+ s1 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
191
+ printf("%6.2f\t", s1);
192
+ fflush(stdout);
193
+
194
+ /* re-encode to get urlencoded chars, not b64 */
195
+ len = modp_burl_encode(result, teststr1, sizes[j]);
196
+
197
+ c0 = clock();
198
+ for (i = 0; i < MAX; ++i) {
199
+ modp_burl_decode(result2, result, len);
200
+ }
201
+ c1 = clock();
202
+ s1 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
203
+ printf("%6.2f\t", s1);
204
+ fflush(stdout);
205
+
206
+ /**
207
+ ** B16 DECODE
208
+ **/
209
+ /* re-encode to get urlencoded chars, not b64 */
210
+ len = modp_b16_encode(result, teststr1, sizes[j]);
211
+
212
+ c0 = clock();
213
+ for (i = 0; i < MAX; ++i) {
214
+ modp_b16_decode(result2, result, len);
215
+ }
216
+ c1 = clock();
217
+ s1 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
218
+ printf("%6.2f\t", s1);
219
+ fflush(stdout);
220
+
221
+ /**
222
+ ** B16 DECODE
223
+ **/
224
+ /* re-encode to get urlencoded chars, not b64 */
225
+ len = modp_b2_encode(result, teststr1, sizes[j]);
226
+
227
+ c0 = clock();
228
+ for (i = 0; i < MAX; ++i) {
229
+ modp_b2_decode(result2, result, len);
230
+ }
231
+ c1 = clock();
232
+ s1 = (double)(c1 - c0) * (1.0 / (double)CLOCKS_PER_SEC);
233
+ printf("%6.2f\t", s1);
234
+ fflush(stdout);
235
+
236
+ printf("\n");
237
+ fflush(stdout);
238
+ }
239
+
240
+ return 0;
241
+ }