xxtea 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 40a67d849e79434013e6648f21ddc02e7e6e93cf
4
+ data.tar.gz: 480a724d92d0ec28c64a264e7ababd1daf0a23ad
5
+ SHA512:
6
+ metadata.gz: f9344b00aae36904b61f0facd0900a734c462e036335021dce7494f083f3fe0949a3e9102ba3bfd5dd8cc0094bd7cb22a46995dac76f9a28f8bef8eddf1e92a3
7
+ data.tar.gz: 844b8fea4b61f4a71863952af8f0117f0c1eb52da0335ecc1fb8098470cc810619cc65c8c5d0f162dad4ec5ae674c5fd6cc6d28f9961d20331d68cec53025644
@@ -0,0 +1,3 @@
1
+ *.bundle
2
+ *.gem
3
+ *.o
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rake'
6
+ gem 'rake-compiler'
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/extensiontask'
3
+
4
+ Rake::ExtensionTask.new('xxtea') do |ext|
5
+ ext.lib_dir = 'lib/xxtea'
6
+ end
@@ -0,0 +1,5 @@
1
+ require 'mkmf'
2
+
3
+ $CFLAGS += ' -g -O3 -Wall '
4
+
5
+ create_makefile('xxtea/xxtea')
@@ -0,0 +1,229 @@
1
+
2
+ #include <stdint.h>
3
+ #include <stdlib.h>
4
+ #include <ruby.h>
5
+
6
+
7
+ #define DELTA 0x9e3779b9
8
+ #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
9
+
10
+ static void btea(uint32_t *v, int n, uint32_t const key[4])
11
+ {
12
+ uint32_t y, z, sum;
13
+ unsigned p, rounds, e;
14
+
15
+ if (n > 1) { /* Coding Part */
16
+ rounds = 6 + 52 / n;
17
+ sum = 0;
18
+ z = v[n - 1];
19
+
20
+ do {
21
+ sum += DELTA;
22
+ e = (sum >> 2) & 3;
23
+
24
+ for (p = 0; p < n - 1; p++) {
25
+ y = v[p + 1];
26
+ z = v[p] += MX;
27
+ }
28
+
29
+ y = v[0];
30
+ z = v[n - 1] += MX;
31
+ }
32
+ while (--rounds);
33
+ }
34
+ else if (n < -1) { /* Decoding Part */
35
+ n = -n;
36
+ rounds = 6 + 52 / n;
37
+ sum = rounds * DELTA;
38
+ y = v[0];
39
+
40
+ do {
41
+ e = (sum >> 2) & 3;
42
+
43
+ for (p = n - 1; p > 0; p--) {
44
+ z = v[p - 1];
45
+ y = v[p] -= MX;
46
+ }
47
+
48
+ z = v[n - 1];
49
+ y = v[0] -= MX;
50
+ sum -= DELTA;
51
+ }
52
+ while (--rounds);
53
+ }
54
+ }
55
+
56
+ static int bytes2longs(const char *in, int inlen, uint32_t *out, int padding)
57
+ {
58
+ int i, pad;
59
+ const unsigned char *s;
60
+
61
+ s = (const unsigned char *)in;
62
+
63
+ /* (i & 3) << 3 -> [0, 8, 16, 24] */
64
+ for (i = 0; i < inlen; i++) {
65
+ out[i >> 2] |= s[i] << ((i & 3) << 3);
66
+ }
67
+
68
+ /* PKCS#7 padding */
69
+ if (padding) {
70
+ pad = 4 - (inlen & 3);
71
+ /* make sure lenght of out >= 2 */
72
+ pad = (inlen < 4) ? pad + 4 : pad;
73
+ for (i = inlen; i < inlen + pad; i++) {
74
+ out[i >> 2] |= pad << ((i & 3) << 3);
75
+ }
76
+ }
77
+
78
+ /* Divided by 4, and then rounded up (ceil) to an integer.
79
+ * Which is the number of how many longs we've got.
80
+ */
81
+ return ((i - 1) >> 2) + 1;
82
+ }
83
+
84
+ static int longs2bytes(uint32_t *in, int inlen, char *out, int padding)
85
+ {
86
+ int i, pad;
87
+ unsigned char *s;
88
+
89
+ s = (unsigned char *)out;
90
+
91
+ for (i = 0; i < inlen; i++) {
92
+ s[4 * i] = in[i] & 0xFF;
93
+ s[4 * i + 1] = (in[i] >> 8) & 0xFF;
94
+ s[4 * i + 2] = (in[i] >> 16) & 0xFF;
95
+ s[4 * i + 3] = (in[i] >> 24) & 0xFF;
96
+ }
97
+
98
+ i *= 4;
99
+
100
+ /* PKCS#7 unpadding */
101
+ if (padding) {
102
+ pad = s[i - 1];
103
+ i -= pad;
104
+ }
105
+
106
+ s[i] = '\0';
107
+
108
+ /* How many bytes we've got */
109
+ return i;
110
+ }
111
+
112
+ VALUE xxtea_encrypt(VALUE mod, VALUE data, VALUE key)
113
+ {
114
+ int alen, dlen, klen;
115
+ uint32_t *d, k[4];
116
+ VALUE retval;
117
+ char *retbuf;
118
+
119
+ d = NULL;
120
+ k[0] = k[1] = k[2] = k[3] = 0;
121
+
122
+ Check_Type(data, T_STRING);
123
+ Check_Type(key, T_STRING);
124
+
125
+ dlen = RSTRING_LEN(data);
126
+ klen = RSTRING_LEN(key);
127
+
128
+ if (klen != 16) {
129
+ rb_raise(rb_eArgError, "Need a 16-byte key.");
130
+ return Qnil;
131
+ }
132
+
133
+ alen = dlen < 4 ? 2 : (dlen >> 2) + 1;
134
+ d = (uint32_t *)calloc(alen, sizeof(uint32_t));
135
+
136
+ if (!d) {
137
+ rb_raise(rb_eNoMemError, "calloc failed.");
138
+ return Qnil;
139
+ }
140
+
141
+ bytes2longs(StringValuePtr(data), dlen, d, 1);
142
+ bytes2longs(StringValuePtr(key), klen, k, 0);
143
+ btea(d, alen, k);
144
+
145
+ retval = rb_str_new(NULL, (alen << 2));
146
+
147
+ if (!retval) {
148
+ free(d);
149
+ return Qnil;
150
+ }
151
+
152
+ retbuf = RSTRING_PTR(retval);
153
+ longs2bytes(d, alen, retbuf, 0);
154
+
155
+ return retval;
156
+ }
157
+
158
+ VALUE xxtea_decrypt(VALUE mod, VALUE data, VALUE key)
159
+ {
160
+ int alen, dlen, klen, rc;
161
+ uint32_t *d, k[4];
162
+ VALUE retval;
163
+ char *retbuf;
164
+
165
+ d = NULL;
166
+ k[0] = k[1] = k[2] = k[3] = 0;
167
+
168
+ Check_Type(data, T_STRING);
169
+ Check_Type(key, T_STRING);
170
+
171
+ dlen = RSTRING_LEN(data);
172
+ klen = RSTRING_LEN(key);
173
+
174
+ if (klen != 16) {
175
+ rb_raise(rb_eArgError, "Need a 16-byte key.");
176
+ return Qnil;
177
+ }
178
+
179
+ /* not divided by 4, or length < 8 */
180
+ if (dlen & 3 || dlen < 8) {
181
+ rb_raise(rb_eArgError, "Invalid data.");
182
+ return Qnil;
183
+ }
184
+
185
+ retval = rb_str_new(NULL, dlen);
186
+
187
+ if (!retval) {
188
+ free(d);
189
+ return Qnil;
190
+ }
191
+
192
+ retbuf = RSTRING_PTR(retval);
193
+
194
+ alen = dlen >> 2;
195
+ d = (uint32_t *)calloc(alen, sizeof(uint32_t));
196
+
197
+ if (!d) {
198
+ rb_raise(rb_eNoMemError, "calloc failed.");
199
+ return Qnil;
200
+ }
201
+
202
+ retval = rb_str_new(NULL, (alen << 2));
203
+
204
+ if (!retval) {
205
+ free(d);
206
+ return NULL;
207
+ }
208
+
209
+ retbuf = RSTRING_PTR(retval);
210
+
211
+ bytes2longs(StringValuePtr(data), dlen, d, 0);
212
+ bytes2longs(StringValuePtr(key), klen, k, 0);
213
+ btea(d, -alen, k);
214
+
215
+ if ((rc = longs2bytes(d, alen, retbuf, 1)) != dlen) {
216
+ /* Remove PKCS#7 padded chars */
217
+ rb_str_resize(retval, rc);
218
+ }
219
+
220
+ return retval;
221
+ }
222
+
223
+
224
+ void Init_xxtea()
225
+ {
226
+ VALUE mXXTEA = rb_define_module("XXTEA");
227
+ rb_define_singleton_method(mXXTEA, "encrypt", xxtea_encrypt, 2);
228
+ rb_define_singleton_method(mXXTEA, "decrypt", xxtea_decrypt, 2);
229
+ }
@@ -0,0 +1,13 @@
1
+ require 'xxtea/version'
2
+ require 'xxtea/xxtea'
3
+
4
+
5
+ module XXTEA
6
+ def self.encrypt_hex(data, key)
7
+ encrypt(data, key).unpack('H*').first
8
+ end
9
+
10
+ def self.decrypt_hex(data, key)
11
+ decrypt([data].pack('H*'), key)
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module XXTEA
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'xxtea/version'
7
+ Gem::Specification.new do |gem|
8
+ gem.name = "xxtea"
9
+ gem.version = XXTEA::VERSION
10
+ gem.authors = ["Yue Du"]
11
+ gem.email = ["ifduyue@gmail.com"]
12
+ gem.description = %q{Ruby xxtea module}
13
+ gem.summary = %q{Ruby xxtea module}
14
+ gem.homepage = "http://github.com/ifduyue/xxtea"
15
+ gem.license = 'BSD'
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+ gem.extensions = ["ext/xxtea/extconf.rb"]
21
+ end
metadata ADDED
@@ -0,0 +1,53 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xxtea
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Yue Du
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-03-08 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Ruby xxtea module
14
+ email:
15
+ - ifduyue@gmail.com
16
+ executables: []
17
+ extensions:
18
+ - ext/xxtea/extconf.rb
19
+ extra_rdoc_files: []
20
+ files:
21
+ - ".gitignore"
22
+ - Gemfile
23
+ - Rakefile
24
+ - ext/xxtea/extconf.rb
25
+ - ext/xxtea/xxtea.c
26
+ - lib/xxtea.rb
27
+ - lib/xxtea/version.rb
28
+ - xxtea.gemspec
29
+ homepage: http://github.com/ifduyue/xxtea
30
+ licenses:
31
+ - BSD
32
+ metadata: {}
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ requirements: []
48
+ rubyforge_project:
49
+ rubygems_version: 2.4.2
50
+ signing_key:
51
+ specification_version: 4
52
+ summary: Ruby xxtea module
53
+ test_files: []