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,228 @@
1
+ /*
2
+ * <pre>
3
+ * BFASTURL.c High performance URL encoder/decoder
4
+ * https://github.com/client9/stringencoders
5
+ *
6
+ * Copyright &copy; 2006-2016 Nick Galbreath
7
+ * All rights reserved.
8
+ * Released under MIT license. See LICENSE for details.
9
+ * </PRE>
10
+ */
11
+
12
+ #include "modp_stdint.h"
13
+
14
+ #include "modp_burl.h"
15
+ #include "modp_burl_data.h"
16
+
17
+ size_t modp_burl_encode(char* dest, const char* src, size_t len)
18
+ {
19
+
20
+ const char* deststart = dest;
21
+ const uint8_t* s = (const uint8_t*)src;
22
+ const uint8_t* srcend = s + len;
23
+ char c;
24
+ uint8_t x;
25
+
26
+ if (len == 0) {
27
+ *dest = '\0';
28
+ return (size_t)0;
29
+ }
30
+
31
+ while (s < srcend) {
32
+ x = *s++;
33
+ c = (char)gsUrlEncodeMap[x];
34
+ if (c) {
35
+ *dest++ = c;
36
+ } else {
37
+ *dest++ = '%';
38
+ *dest++ = (char)gsHexEncodeMap1[x];
39
+ *dest++ = (char)gsHexEncodeMap2[x];
40
+ /*
41
+ is the equiv of this
42
+ static const char sHexChars[] = "0123456789ABCDEF";
43
+ *dest++ = (char)sHexChars[x >> 4];
44
+ *dest++ = (char)sHexChars[x & 0x0F];
45
+ */
46
+ }
47
+ }
48
+ *dest = '\0';
49
+ return (size_t)(dest - deststart); /* compute "strlen" of dest. */
50
+ }
51
+
52
+ /**
53
+ * The implementation is identical except it uses a
54
+ * different array
55
+ */
56
+ size_t modp_burl_min_encode(char* dest, const char* src, size_t len)
57
+ {
58
+
59
+ const char* deststart = dest;
60
+ const uint8_t* s = (const uint8_t*)src;
61
+ const uint8_t* srcend = s + len;
62
+ char c;
63
+ uint8_t x;
64
+
65
+ if (len == 0) {
66
+ *dest = '\0';
67
+ return (size_t)0;
68
+ }
69
+
70
+ while (s < srcend) {
71
+ x = *s++;
72
+ c = (char)(gsUrlEncodeMinMap[x]); /** CHANGE HERE **/
73
+ if (c) {
74
+ *dest++ = c;
75
+ } else {
76
+ *dest++ = '%';
77
+ *dest++ = (char)gsHexEncodeMap1[x];
78
+ *dest++ = (char)(gsHexEncodeMap2[x]);
79
+ /*
80
+ is the equiv of this
81
+ static const char sHexChars[] = "0123456789ABCDEF";
82
+ *dest++ = sHexChars[x >> 4];
83
+ *dest++ = sHexChars[x & 0x0F];
84
+ */
85
+ }
86
+ }
87
+ *dest = '\0';
88
+ return (size_t)(dest - deststart); /* compute "strlen" of dest. */
89
+ }
90
+
91
+ /**
92
+ * Give exact size of encoded output string
93
+ * without doing the encoding
94
+ */
95
+ size_t modp_burl_encode_strlen(const char* src, const size_t len)
96
+ {
97
+ size_t count = 0;
98
+ const char* srcend = src + len;
99
+
100
+ if (len == 0) {
101
+ return (size_t)0;
102
+ }
103
+
104
+ while (src < srcend) {
105
+ if (gsUrlEncodeMap[(uint8_t)*src++]) {
106
+ count++;
107
+ } else {
108
+ count += 3;
109
+ }
110
+ }
111
+ return count;
112
+ }
113
+
114
+ /**
115
+ * Give exact size of encoded output string
116
+ * without doing the encoding
117
+ */
118
+ size_t modp_burl_min_encode_strlen(const char* src, const size_t len)
119
+ {
120
+ size_t count = 0;
121
+ const char* srcend = src + len;
122
+
123
+ if (len == 0) {
124
+ return (size_t)0;
125
+ }
126
+
127
+ while (src < srcend) {
128
+ if (gsUrlEncodeMinMap[(uint8_t)*src++]) {
129
+ count++;
130
+ } else {
131
+ count += 3;
132
+ }
133
+ }
134
+ return count;
135
+ }
136
+
137
+ size_t modp_burl_decode(char* dest, const char* s, size_t len)
138
+ {
139
+ uint32_t d = 0; /* used for decoding %XX */
140
+ const uint8_t* src = (const uint8_t*)s;
141
+ const char* deststart = dest;
142
+ const uint8_t* srcend = (const uint8_t*)(src + len);
143
+ const uint8_t* srcendloop = (const uint8_t*)(srcend - 2);
144
+
145
+ if (len == 0) {
146
+ *dest = '\0';
147
+ return (size_t)0;
148
+ }
149
+
150
+ while (src < srcendloop) {
151
+ switch (*src) {
152
+ case '+':
153
+ *dest++ = ' ';
154
+ src++;
155
+ break;
156
+ case '%':
157
+ d = (gsHexDecodeMap[(uint32_t)(*(src + 1))] << 4) | gsHexDecodeMap[(uint32_t)(*(src + 2))];
158
+ if (d < 256) { /* if one of the hex chars is bad, d >= 256 */
159
+ *dest = (char)d;
160
+ dest++;
161
+ src += 3;
162
+ } else {
163
+ *dest++ = '%';
164
+ src++;
165
+ }
166
+ break;
167
+ default:
168
+ *dest++ = (char)*src++;
169
+ }
170
+ }
171
+
172
+ /* handle last two chars
173
+ * dont decode "%XX"
174
+ */
175
+ while (src < srcend) {
176
+ switch (*src) {
177
+ case '+':
178
+ *dest++ = ' ';
179
+ src++;
180
+ break;
181
+ default:
182
+ *dest++ = (char)(*src++);
183
+ }
184
+ }
185
+
186
+ *dest = '\0';
187
+ return (size_t)(dest - deststart); /* compute "strlen" of dest. */
188
+ }
189
+
190
+ size_t modp_burl_decode_raw(char* dest, const char* s, size_t len)
191
+ {
192
+ uint32_t d = 0; /* used for decoding %XX */
193
+ const uint8_t* src = (const uint8_t*)s;
194
+ const char* deststart = dest;
195
+ const uint8_t* srcend = (const uint8_t*)(src + len);
196
+ const uint8_t* srcendloop = (const uint8_t*)(srcend - 2);
197
+
198
+ if (len == 0) {
199
+ *dest = '\0';
200
+ return (size_t)0;
201
+ }
202
+
203
+ while (src < srcendloop) {
204
+ if (*src == '%') {
205
+ d = (gsHexDecodeMap[(uint32_t)(*(src + 1))] << 4) | gsHexDecodeMap[(uint32_t)(*(src + 2))];
206
+ if (d < 256) { /* if one of the hex chars is bad, d >= 256 */
207
+ *dest = (char)d;
208
+ dest++;
209
+ src += 3;
210
+ } else {
211
+ *dest++ = '%';
212
+ src++;
213
+ }
214
+ } else {
215
+ *dest++ = (char)*src++;
216
+ }
217
+ }
218
+
219
+ /* handle last two chars
220
+ * dont decode "%XX"
221
+ */
222
+ while (src < srcend) {
223
+ *dest++ = (char)(*src++);
224
+ }
225
+
226
+ *dest = '\0';
227
+ return (size_t)(dest - deststart); /* compute "strlen" of dest. */
228
+ }
@@ -0,0 +1,259 @@
1
+ /**
2
+ * \file modp_burl.h
3
+ * \brief high performance URL encoding and decoding
4
+ *
5
+ */
6
+
7
+ /*
8
+ * <PRE>
9
+ * High Performance URL Encoder/Decoder
10
+ *
11
+ * Copyright &copy; 2006-2016 Nick Galbreath
12
+ * All rights reserved.
13
+ *
14
+ * https://github.com/client9/stringencoders
15
+ *
16
+ * Released under MIT license. See LICENSE for details.
17
+ * </PRE>
18
+ */
19
+
20
+ #ifndef COM_MODP_STRINGENCODERS_BURL
21
+ #define COM_MODP_STRINGENCODERS_BURL
22
+
23
+ /* size_t declaration */
24
+
25
+ #include <stddef.h>
26
+
27
+ #ifdef __cplusplus
28
+ #ifndef MODP_C_BEGIN_DECLS
29
+ #define MODP_C_BEGIN_DECLS extern "C" {
30
+ #define MODP_C_END_DECLS }
31
+ #endif
32
+ #else
33
+ #define MODP_C_BEGIN_DECLS
34
+ #define MODP_C_END_DECLS
35
+ #endif
36
+
37
+ MODP_C_BEGIN_DECLS
38
+
39
+ /**
40
+ * Url encode a string. This uses a very strict definition of url
41
+ * encoding. The only characters NOT encoded are A-Z, a-z, 0-9, "-",
42
+ * "_", ".", along with the space char getting mapped to "+".
43
+ * Everything else is escaped using "%HEXHEX" format. This is
44
+ * identical to the implementation of php's urlencode and nearly
45
+ * identical to Java's UrlEncoder class (they do not escape '*' for
46
+ * some reason).
47
+ *
48
+ * \param[out] dest output string. Must
49
+ * \param[in] str The input string
50
+ * \param[in] len The length of the input string, excluding any
51
+ * final null byte.
52
+ */
53
+ size_t modp_burl_encode(char* dest, const char* str, size_t len);
54
+
55
+ /**
56
+ * Url encode a string. This uses a minimal definition of url
57
+ * encoding. This works similar to the previous function except '~',
58
+ * '!', '$', '\'', '(', ')', '*', ',', ';', ':', '@', '/', '?' are NOT
59
+ * escaped. This will allow decoding by standard url-decoders and
60
+ * make the encoded urls more readable.
61
+ *
62
+ * \param[out] dest output string. Must
63
+ * \param[in] str The input string
64
+ * \param[in] len The length of the input string, excluding any
65
+ * final null byte.
66
+ */
67
+ size_t modp_burl_min_encode(char* dest, const char* str, size_t len);
68
+
69
+ /** \brief get size of output string w/o doing actual encoding
70
+ *
71
+ * \param[in] src input string, not null
72
+ * \param[in] len length of input string
73
+ * \return length of output string NOT including any final null byte
74
+ */
75
+ size_t modp_burl_min_encode_strlen(const char* src, const size_t len);
76
+
77
+ /**
78
+ * Provides the maximum size for output string given
79
+ * and input size of A bytes.
80
+ */
81
+ #define modp_burl_encode_len(A) (3 * A + 1)
82
+
83
+ /**
84
+ * Given the exact size of output string.
85
+ *
86
+ * Can be used to allocate the right amount of memory for
87
+ * modp_burl_encode. Be sure to add 1 byte for final null.
88
+ *
89
+ * This is somewhat expensive since it examines every character
90
+ * in the input string
91
+ *
92
+ * \param[in] str The input string
93
+ * \param[in] len THe length of the input string, excluding any
94
+ * final null byte (i.e. strlen(str))
95
+ * \return the size of the output string, excluding the final
96
+ * null byte.
97
+ */
98
+ size_t modp_burl_encode_strlen(const char* str, const size_t len);
99
+
100
+ /**
101
+ * URL Decode a string
102
+ *
103
+ * \param[out] dest The output string. Must be at least (len + 1)
104
+ * bytes allocated. This may be the same as the input buffer.
105
+ * \param[in] str The input string that is URL encoded.
106
+ * \param[in] len The length of the input string (excluding final
107
+ * null byte)
108
+ * \return the strlen of the output string.
109
+ */
110
+ size_t modp_burl_decode(char* dest, const char* str, size_t len);
111
+
112
+ /**
113
+ * URL Decode a string, '+' is preserved
114
+ *
115
+ * \param[out] dest The output string. Must be at least (len + 1)
116
+ * bytes allocated. This may be the same as the input buffer.
117
+ * \param[in] str The input string that is URL encoded.
118
+ * \param[in] len The length of the input string (excluding final
119
+ * null byte)
120
+ * \return the strlen of the output string.
121
+ */
122
+ size_t modp_burl_decode_raw(char* dest, const char* str, size_t len);
123
+
124
+ /**
125
+ * Returns memory required to decoded a url-encoded
126
+ * string of length A.
127
+ *
128
+ */
129
+ #define modp_burl_decode_len(A) (A + 1)
130
+
131
+ MODP_C_END_DECLS
132
+
133
+ #ifdef __cplusplus
134
+ #include <cstring>
135
+ #include <string>
136
+
137
+ namespace modp {
138
+
139
+ inline std::string url_encode(const char* s, size_t len)
140
+ {
141
+ std::string x(modp_burl_encode_len(len), '\0');
142
+ size_t d = modp_burl_encode(const_cast<char*>(x.data()), s, len);
143
+ x.erase(d, std::string::npos);
144
+ return x;
145
+ }
146
+
147
+ inline std::string url_encode(const char* s)
148
+ {
149
+ return url_encode(s, strlen(s));
150
+ }
151
+
152
+ inline std::string url_encode(const std::string& s)
153
+ {
154
+ return url_encode(s.data(), s.size());
155
+ }
156
+
157
+ /**
158
+ * Standard (maximal) url encoding.
159
+ *
160
+ * \param[in,out] s the string to be encoded
161
+ * \return a reference to the input string
162
+ */
163
+ inline std::string& url_encode(std::string& s)
164
+ {
165
+ std::string x(url_encode(s.data(), s.size()));
166
+ s.swap(x);
167
+ return s;
168
+ }
169
+
170
+ /**
171
+ * Minimal Url Encoding
172
+ *
173
+ * \param[in,out] s the string to be encoded
174
+ * \return a reference to the input string
175
+ */
176
+ inline std::string& url_min_encode(std::string& s)
177
+ {
178
+ std::string x(modp_burl_encode_len(s.size()), '\0');
179
+ size_t d = modp_burl_min_encode(const_cast<char*>(x.data()), s.data(), s.size());
180
+ x.erase(d, std::string::npos);
181
+ s.swap(x);
182
+ return s;
183
+ }
184
+
185
+ inline std::string url_min_encode(const std::string& s)
186
+ {
187
+ std::string x(modp_burl_encode_len(s.size()), '\0');
188
+ size_t d = modp_burl_min_encode(const_cast<char*>(x.data()), s.data(), s.size());
189
+ x.erase(d, std::string::npos);
190
+ return x;
191
+ }
192
+
193
+ /**
194
+ * Url decode a string.
195
+ * This function does not allocate memory.
196
+ *
197
+ * \param[in,out] s the string to be decoded
198
+ * \return a reference to the input string.
199
+ * There is no error case, bad characters are passed through
200
+ */
201
+ inline std::string& url_decode(std::string& s)
202
+ {
203
+ size_t d = modp_burl_decode(const_cast<char*>(s.data()), s.data(), s.size());
204
+ s.erase(d, std::string::npos);
205
+ return s;
206
+ }
207
+
208
+ inline std::string& url_decode_raw(std::string& s)
209
+ {
210
+ size_t d = modp_burl_decode_raw(const_cast<char*>(s.data()), s.data(), s.size());
211
+ s.erase(d, std::string::npos);
212
+ return s;
213
+ }
214
+
215
+ inline std::string url_decode(const char* str)
216
+ {
217
+ std::string s(str);
218
+ url_decode(s);
219
+ return s;
220
+ }
221
+
222
+ inline std::string url_decode_raw(const char* str)
223
+ {
224
+ std::string s(str);
225
+ url_decode_raw(s);
226
+ return s;
227
+ }
228
+
229
+ inline std::string url_decode(const char* str, size_t len)
230
+ {
231
+ std::string s(str, len);
232
+ url_decode(s);
233
+ return s;
234
+ }
235
+
236
+ inline std::string url_decode_raw(const char* str, size_t len)
237
+ {
238
+ std::string s(str, len);
239
+ url_decode_raw(s);
240
+ return s;
241
+ }
242
+
243
+ inline std::string url_decode(const std::string& s)
244
+ {
245
+ std::string x(s);
246
+ url_decode(x);
247
+ return x;
248
+ }
249
+
250
+ inline std::string url_decode_raw(const std::string& s)
251
+ {
252
+ std::string x(s);
253
+ url_decode_raw(x);
254
+ return x;
255
+ }
256
+ }
257
+ #endif
258
+
259
+ #endif
@@ -0,0 +1,136 @@
1
+ static const uint8_t gsUrlEncodeMap[256] = {
2
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
3
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
4
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
5
+ '\0', '\0', '+', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
6
+ '\0', '\0', '\0', '\0', '\0', '-', '.', '\0', '0', '1',
7
+ '2', '3', '4', '5', '6', '7', '8', '9', '\0', '\0',
8
+ '\0', '\0', '\0', '\0', '\0', 'A', 'B', 'C', 'D', 'E',
9
+ 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
10
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
11
+ 'Z', '\0', '\0', '\0', '\0', '_', '\0', 'a', 'b', 'c',
12
+ 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
13
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
14
+ 'x', 'y', 'z', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
15
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
16
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
17
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
18
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
19
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
20
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
21
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
22
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
23
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
24
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
25
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
26
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
27
+ '\0', '\0', '\0', '\0', '\0', '\0'
28
+ };
29
+ static const uint8_t gsUrlEncodeMinMap[256] = {
30
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
31
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
32
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
33
+ '\0', '\0', '+', '!', '\0', '\0', '$', '\0', '\0', '\0',
34
+ '(', ')', '*', '\0', ',', '-', '.', '/', '0', '1',
35
+ '2', '3', '4', '5', '6', '7', '8', '9', ':', ';',
36
+ '\0', '\0', '\0', '?', '@', 'A', 'B', 'C', 'D', 'E',
37
+ 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
38
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
39
+ 'Z', '\0', '\0', '\0', '\0', '_', '\0', 'a', 'b', 'c',
40
+ 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
41
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
42
+ 'x', 'y', 'z', '\0', '\0', '\0', '~', '\0', '\0', '\0',
43
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
44
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
45
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
46
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
47
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
48
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
49
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
50
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
51
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
52
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
53
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
54
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
55
+ '\0', '\0', '\0', '\0', '\0', '\0'
56
+ };
57
+ static const uint32_t gsHexDecodeMap[256] = {
58
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
59
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
60
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
61
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
62
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 256, 256,
63
+ 256, 256, 256, 256, 256, 10, 11, 12, 13, 14, 15, 256,
64
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
65
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
66
+ 256, 10, 11, 12, 13, 14, 15, 256, 256, 256, 256, 256,
67
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
68
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
69
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
70
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
71
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
72
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
73
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
74
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
75
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
76
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
77
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
78
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
79
+ 256, 256, 256, 256
80
+ };
81
+ static const uint8_t gsHexEncodeMap1[256] = {
82
+ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
83
+ '0', '0', '0', '0', '0', '0', '1', '1', '1', '1',
84
+ '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
85
+ '1', '1', '2', '2', '2', '2', '2', '2', '2', '2',
86
+ '2', '2', '2', '2', '2', '2', '2', '2', '3', '3',
87
+ '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
88
+ '3', '3', '3', '3', '4', '4', '4', '4', '4', '4',
89
+ '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
90
+ '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
91
+ '5', '5', '5', '5', '5', '5', '6', '6', '6', '6',
92
+ '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
93
+ '6', '6', '7', '7', '7', '7', '7', '7', '7', '7',
94
+ '7', '7', '7', '7', '7', '7', '7', '7', '8', '8',
95
+ '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
96
+ '8', '8', '8', '8', '9', '9', '9', '9', '9', '9',
97
+ '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
98
+ 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
99
+ 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B',
100
+ 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
101
+ 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',
102
+ 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'D', 'D',
103
+ 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D',
104
+ 'D', 'D', 'D', 'D', 'E', 'E', 'E', 'E', 'E', 'E',
105
+ 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E',
106
+ 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F',
107
+ 'F', 'F', 'F', 'F', 'F', 'F'
108
+ };
109
+ static const uint8_t gsHexEncodeMap2[256] = {
110
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
111
+ 'A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3',
112
+ '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
113
+ 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7',
114
+ '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', '0', '1',
115
+ '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
116
+ 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5',
117
+ '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
118
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
119
+ 'A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3',
120
+ '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
121
+ 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7',
122
+ '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', '0', '1',
123
+ '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
124
+ 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5',
125
+ '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
126
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
127
+ 'A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3',
128
+ '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
129
+ 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7',
130
+ '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', '0', '1',
131
+ '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
132
+ 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5',
133
+ '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
134
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
135
+ 'A', 'B', 'C', 'D', 'E', 'F'
136
+ };