ECToken 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,223 @@
1
+ //
2
+ // ECToken.c
3
+ //
4
+ //
5
+ // Created by Darren Fung on 12-06-19.
6
+ // Copyright (c) 2012 Tunezy Inc. All rights reserved.
7
+ //
8
+
9
+ #include <openssl/blowfish.h>
10
+ #include <stdio.h>
11
+ #include <stdlib.h>
12
+ #include <string.h>
13
+ #include <ruby.h>
14
+
15
+ #define kMAX_TOKEN_LENGTH 512
16
+
17
+ #define n2l(c,l) (l =((unsigned long)(*((c)++)))<<24L, \
18
+ l|=((unsigned long)(*((c)++)))<<16L, \
19
+ l|=((unsigned long)(*((c)++)))<< 8L, \
20
+ l|=((unsigned long)(*((c)++))))
21
+
22
+ #define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \
23
+ *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
24
+ *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
25
+ *((c)++)=(unsigned char)(((l) )&0xff))
26
+
27
+
28
+ void cfb64_encrypt(const unsigned char* in, unsigned char* out, long length,
29
+ BF_KEY* schedule,
30
+ unsigned char* ivec,
31
+ int *num,
32
+ int encrypt)
33
+ {
34
+ register BF_LONG v0,v1,t;
35
+ register int n= *num;
36
+ register long l=length;
37
+ BF_LONG ti[2];
38
+ unsigned char *iv,c,cc;
39
+
40
+ iv=(unsigned char *)ivec;
41
+ while (l--)
42
+ {
43
+ if (n == 0)
44
+ {
45
+ n2l(iv,v0); ti[0]=v0;
46
+ n2l(iv,v1); ti[1]=v1;
47
+ BF_encrypt((BF_LONG*)ti,schedule);
48
+ iv=(unsigned char *)ivec;
49
+ t=ti[0]; l2n(t,iv);
50
+ t=ti[1]; l2n(t,iv);
51
+ iv=(unsigned char *)ivec;
52
+ }
53
+ c= *(in++)^iv[n];
54
+ *(out++)=c;
55
+ iv[n]=c;
56
+ n=(n+1)&0x07;
57
+ }
58
+ v0=v1=ti[0]=ti[1]=t=c=cc=0;
59
+ *num=n;
60
+ }
61
+
62
+
63
+ /************************************************** ****************
64
+ * ARGS:
65
+ * keydata == ascii text, the encryption passphrase
66
+ * keydatalen == how long keydata is
67
+ * in == the data to be encrypted
68
+ * out == the encrypted data.
69
+ * length(in) == length(out), apparently
70
+ * inlen == length of the in array
71
+ ************************************************** ****************/
72
+ void bfencrypt(unsigned char *keydata, int keydatalen, const unsigned char *in,
73
+ unsigned char *out, unsigned int inlen) {
74
+ BF_KEY key;
75
+ unsigned char ivec[32];
76
+ int num=0;
77
+ // set up for encryption
78
+ BF_set_key(&key, keydatalen, keydata);
79
+ memset(ivec, '\0', 32);
80
+ cfb64_encrypt(in, out, inlen, &key, ivec, &num, BF_ENCRYPT);
81
+ }
82
+
83
+ void bfdecrypt(unsigned char *keydata, int keydatalen, const unsigned char *in,
84
+ unsigned char *out, unsigned int inlen) {
85
+ BF_KEY key;
86
+ unsigned char ivec[32];
87
+ int num=0;
88
+ // set up for decryption
89
+ BF_set_key(&key, keydatalen, keydata);
90
+ memset(ivec, '\0', 32);
91
+ BF_cfb64_encrypt(in, out, inlen, &key, ivec, &num, BF_DECRYPT);
92
+ }
93
+
94
+ static VALUE encrypt(VALUE self, VALUE k, VALUE t) {
95
+ char *key = StringValueCStr(k);
96
+ char *string = StringValueCStr(t);
97
+ char estr[kMAX_TOKEN_LENGTH*4];
98
+
99
+ if (strlen(string)+1 > kMAX_TOKEN_LENGTH) // this line should protect us from the sprintf
100
+ {
101
+ int token_length = kMAX_TOKEN_LENGTH;
102
+ printf("Only max of %i char is allowed\n", token_length);
103
+ exit(0);
104
+ }
105
+
106
+ // For backward compatibility, check if somebody already passed in ec_secure=1
107
+
108
+ // search for ec_secure in string
109
+ // delete any previous instance of ec_secure=1 that resides within the string
110
+ // this application will now prepend ec_secure=LENGTH_OF_STRING
111
+ // so a valid string may end up being encrypted as ec_secure=033&ec_clientip=1.1.1.1
112
+ char* ecsecure_check_ptr = strstr(string, "ec_secure=1");
113
+
114
+ // buffer we will hold the new modified string
115
+ char newBuff[(kMAX_TOKEN_LENGTH*2)-1];
116
+ memset(newBuff,0,sizeof(newBuff));
117
+
118
+ if(ecsecure_check_ptr > 0) // we found ec_secure within the string
119
+ {
120
+ if(string == ecsecure_check_ptr)
121
+ strcpy(newBuff,ecsecure_check_ptr+=12); // found at beginning, skip over and copy the rest of the string
122
+ else // it's somewhere else in the string, scrub it out
123
+ {
124
+ *ecsecure_check_ptr = 0; // break the string into two parts, first string null terminate where we found ec_secure
125
+ sprintf(newBuff,"%s%s", string,ecsecure_check_ptr+11);
126
+ // above we combine what was before ec_secure with what is after ec_secure's start position plus 11 octets
127
+ }
128
+ }
129
+ else // there was no ec_secure found within the string, so we just copy the string
130
+ strcpy(newBuff,string);
131
+
132
+ // setup the buffer we will pass off to blowfish
133
+ char newbuffer[(kMAX_TOKEN_LENGTH*2)-1];
134
+ memset(newbuffer,0,sizeof(newbuffer));
135
+ // prepend with ec_secure=032, for example
136
+ sprintf(newbuffer, "ec_secure=%03d&%s",(int)(strlen(newBuff)+14), newBuff);
137
+
138
+ // encrypt the new buffer
139
+ bfencrypt((unsigned char*)key, strlen(key), (unsigned char*)newbuffer,
140
+ (unsigned char*)estr, strlen(newbuffer)+1);
141
+
142
+ // convert to hex string
143
+ unsigned int i = 0;
144
+ char final_token[strlen(newbuffer)];
145
+ char* current_ptr = &final_token[0];
146
+ for(i=0; i<strlen(newbuffer); i++) {
147
+ sprintf(current_ptr,"%02x",estr[i]&0xff);
148
+ // increment pointer by 2 (2 chars in hex decimal)
149
+ current_ptr += 2 * sizeof(char);
150
+ }
151
+
152
+ return rb_str_new2(final_token);
153
+
154
+ }
155
+
156
+ void Init_ECToken(void) {
157
+ VALUE klass = rb_define_class("EdgeCastToken", rb_cObject);
158
+ rb_define_singleton_method(klass, "encrypt", encrypt, 2);
159
+ }
160
+
161
+ /*int main(int argc, char **argv)
162
+ {
163
+ if (argc < 3)
164
+ {
165
+ printf("Usage: ec_encrpyt <key> <text>\n");
166
+ exit(0);
167
+ }
168
+
169
+ char *key = argv[1];
170
+ char *string = argv[2];
171
+ char estr[kMAX_TOKEN_LENGTH*4];
172
+
173
+ if (strlen(string)+1 > kMAX_TOKEN_LENGTH) // this line should protect us from the sprintf
174
+ {
175
+ int token_length = kMAX_TOKEN_LENGTH;
176
+ printf("Only max of %i char is allowed\n", token_length);
177
+ exit(0);
178
+ }
179
+
180
+ // For backward compatibility, check if somebody already passed in ec_secure=1
181
+
182
+ // search for ec_secure in string
183
+ // delete any previous instance of ec_secure=1 that resides within the string
184
+ // this application will now prepend ec_secure=LENGTH_OF_STRING
185
+ // so a valid string may end up being encrypted as ec_secure=033&ec_clientip=1.1.1.1
186
+ char* ecsecure_check_ptr = strstr(string, "ec_secure=1");
187
+
188
+ // buffer we will hold the new modified string
189
+ char newBuff[(kMAX_TOKEN_LENGTH*2)-1];
190
+ memset(newBuff,0,sizeof(newBuff));
191
+
192
+ if(ecsecure_check_ptr > 0) // we found ec_secure within the string
193
+ {
194
+ if(string == ecsecure_check_ptr)
195
+ strcpy(newBuff,ecsecure_check_ptr+=12); // found at beginning, skip over and copy the rest of the string
196
+ else // it's somewhere else in the string, scrub it out
197
+ {
198
+ *ecsecure_check_ptr = 0; // break the string into two parts, first string null terminate where we found ec_secure
199
+ sprintf(newBuff,"%s%s", string,ecsecure_check_ptr+11);
200
+ // above we combine what was before ec_secure with what is after ec_secure's start position plus 11 octets
201
+ }
202
+ }
203
+ else // there was no ec_secure found within the string, so we just copy the string
204
+ strcpy(newBuff,string);
205
+
206
+ // setup the buffer we will pass off to blowfish
207
+ char newbuffer[(kMAX_TOKEN_LENGTH*2)-1];
208
+ memset(newbuffer,0,sizeof(newbuffer));
209
+ // prepend with ec_secure=032, for example
210
+ sprintf(newbuffer, "ec_secure=%03d&%s",(int)(strlen(newBuff)+14), newBuff);
211
+
212
+ // encrypt the new buffer
213
+ bfencrypt((unsigned char*)key, strlen(key), (unsigned char*)newbuffer,
214
+ (unsigned char*)estr, strlen(newbuffer)+1);
215
+
216
+ // convert to hex string
217
+ for(unsigned int i=0; i<strlen(newbuffer); i++)
218
+ printf("%02x",estr[i]&0xff);
219
+ printf("\n");
220
+
221
+ return 0;
222
+ }*/
223
+
@@ -0,0 +1,7 @@
1
+ require 'mkmf'
2
+
3
+ # have_header('openssl/blowfish')
4
+
5
+ pkg_config 'openssl'
6
+
7
+ create_makefile('ECToken/ECToken')
data/lib/ECToken.rb ADDED
@@ -0,0 +1,2 @@
1
+ require "ECToken/version"
2
+ require 'ECToken/ECToken'
@@ -0,0 +1,3 @@
1
+ module ECToken
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ECToken
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Darren Fung
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-20 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: Encrypts using BF-CFB
15
+ email:
16
+ - darren@tunezy.com
17
+ executables: []
18
+ extensions:
19
+ - ext/ECToken/extconf.rb
20
+ extra_rdoc_files: []
21
+ files:
22
+ - lib/ECToken/version.rb
23
+ - lib/ECToken.rb
24
+ - ext/ECToken/ECToken.c
25
+ - ext/ECToken/extconf.rb
26
+ homepage: ''
27
+ licenses: []
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubyforge_project: ECToken
46
+ rubygems_version: 1.8.15
47
+ signing_key:
48
+ specification_version: 3
49
+ summary: Encrypts using BF-CFB
50
+ test_files: []