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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/Gemfile +6 -0
- data/Rakefile +6 -0
- data/ext/xxtea/extconf.rb +5 -0
- data/ext/xxtea/xxtea.c +229 -0
- data/lib/xxtea.rb +13 -0
- data/lib/xxtea/version.rb +3 -0
- data/xxtea.gemspec +21 -0
- metadata +53 -0
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/ext/xxtea/xxtea.c
ADDED
@@ -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
|
+
}
|
data/lib/xxtea.rb
ADDED
data/xxtea.gemspec
ADDED
@@ -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: []
|