xxtea 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []