pvpgn-twilight 0.0.7

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.
data/Changes ADDED
@@ -0,0 +1,24 @@
1
+ Version 0.0.1
2
+ - First Release
3
+
4
+ Version 0.0.2
5
+ - Some Fixes to the gemspec
6
+
7
+ Version 0.0.3
8
+ - Removed some static variables from the code
9
+ - Improved the gem
10
+
11
+ Version 0.0.4
12
+ - More Improvements
13
+ - Added a change log
14
+ - Added RDocs
15
+
16
+ Version 0.0.5
17
+ - Improved RDocs a little
18
+
19
+ Version 0.0.6
20
+ - Tweaked RDocs
21
+ - Tweaked source a little
22
+
23
+ Version 0.0.7
24
+ - Created GitHub repository
@@ -0,0 +1,30 @@
1
+ = Description
2
+ A library allowing communication with pvpgn, as well as some optimized versions of pvpgn
3
+ utility functions
4
+
5
+ = Synopsis
6
+ require 'pvpgn'
7
+
8
+ puts PVPGN::BNHash('hello') #will hash to: 2e0236a3649381fe99cdce4b5b59adffa3167c7b
9
+
10
+ = Module functions
11
+ PVPGN.BNHash(string_to_hash)
12
+ This will return a string containing the 5 DWORD/UINT long hash required for pvpgn
13
+ logon authentication, it is automatically converted to lower case
14
+
15
+ = Known Bugs
16
+ None that I know of.
17
+
18
+ = License
19
+ Artistic 2.0
20
+
21
+ = Copyright
22
+ (C) 2009 Lorenzo Boccetti, The PVPGN Team, All Rights Reserved .
23
+
24
+ = Warranty
25
+ This package is provided "as is" and without any express or
26
+ implied warranties, including, without limitation, the implied
27
+ warranties of merchantability and fitness for a particular purpose.
28
+
29
+ = Authors
30
+ Lorenzo Boccetti
@@ -0,0 +1,2 @@
1
+ require 'pvpgn'
2
+ puts PVPGN::BNHash('hello') #will hash to: 2e0236a3649381fe99cdce4b5b59adffa3167c7b
data/ext/extconf.rb ADDED
@@ -0,0 +1,5 @@
1
+ # Loads mkmf which is used to make makefiles for Ruby extensions
2
+ require 'mkmf'
3
+
4
+ # Do the work
5
+ create_makefile('pvpgn')
data/ext/pvpgn.cpp ADDED
@@ -0,0 +1,206 @@
1
+ #define PVPGN_TWILIGHT_VERSION "0.0.6"
2
+
3
+ #ifdef __TEST__
4
+ #include <iostream>
5
+ #else
6
+ #include "ruby.h"
7
+ #endif
8
+
9
+ typedef unsigned int t_uint32;
10
+ typedef signed int t_sint32;
11
+
12
+ #define ROTL(x,n,w) (((x)<<((n)&(w-1))) | ((x)>>(((-(n))&(w-1)))))
13
+
14
+ #define ROTL32(x,n) ROTL(x,n,32)
15
+ #define ROTL16(x,n) ROTL(x,n,16)
16
+
17
+ static void PVPGN_Hash(t_uint32* pHash, t_uint32* pTemp)
18
+ {
19
+ t_uint32 i;
20
+
21
+ for(i = 0; i < 64; i++)
22
+ pTemp[i + 16] = ROTL32(1,pTemp[i] ^ pTemp[i + 8] ^ pTemp[i + 2] ^ pTemp[i + 13]);
23
+
24
+ t_uint32 a = pHash[0];
25
+ t_uint32 b = pHash[1];
26
+ t_uint32 c = pHash[2];
27
+ t_uint32 d = pHash[3];
28
+ t_uint32 e = pHash[4];
29
+ t_uint32 g;
30
+
31
+ for(i = 0; i < 20; i++)
32
+ {
33
+ g = pTemp[i] + ROTL32(a,5) + e + ((b & c) | (~b & d)) + 0x5a827999;
34
+ e = d;
35
+ d = c;
36
+ c = ROTL32(b,30);
37
+ b = a;
38
+ a = g;
39
+ }
40
+
41
+ for(; i < 40; i++)
42
+ {
43
+ g = (d ^ c ^ b) + e + ROTL32(g,5) + pTemp[i] + 0x6ed9eba1;
44
+ e = d;
45
+ d = c;
46
+ c = ROTL32(b,30);
47
+ b = a;
48
+ a = g;
49
+ }
50
+
51
+ for (; i < 60; i++)
52
+ {
53
+ g = pTemp[i] + ROTL32(g,5) + e + ((c & b) | (d & c) | (d & b)) - 0x70e44324;
54
+ e = d;
55
+ d = c;
56
+ c = ROTL32(b,30);
57
+ b = a;
58
+ a = g;
59
+ }
60
+
61
+ for (; i < 80; i++)
62
+ {
63
+ g = (d ^ c ^ b) + e + ROTL32(g,5) + pTemp[i] - 0x359d3e2a;
64
+ e = d;
65
+ d = c;
66
+ c = ROTL32(b,30);
67
+ b = a;
68
+ a = g;
69
+ }
70
+
71
+ pHash[0] += g;
72
+ pHash[1] += b;
73
+ pHash[2] += c;
74
+ pHash[3] += d;
75
+ pHash[4] += e;
76
+ }
77
+
78
+ static void PVPGN_Set16(t_uint32* pDest, const unsigned char* pSource, t_sint32 nSize)
79
+ {
80
+ if(pDest == NULL || pSource == NULL || nSize < 0)
81
+ return;
82
+
83
+ t_uint32 i, dwPos;
84
+ for(dwPos = 0, i = 0; i < 16; i++)
85
+ {
86
+ pDest[i] = 0;
87
+ if(dwPos < nSize)
88
+ pDest[i] |= ((t_uint32)pSource[dwPos]);
89
+
90
+ dwPos++;
91
+ if(dwPos < nSize)
92
+ pDest[i] |= ((t_uint32)pSource[dwPos]) << 8;
93
+
94
+ dwPos++;
95
+ if(dwPos < nSize)
96
+ pDest[i] |= ((t_uint32)pSource[dwPos]) << 16;
97
+
98
+ dwPos++;
99
+ if(dwPos < nSize)
100
+ pDest[i] |= ((t_uint32)pSource[dwPos]) << 24;
101
+
102
+ dwPos++;
103
+ }
104
+ }
105
+
106
+ static void UTILITY_ToLower(char* pString)
107
+ {
108
+ if(pString == NULL)
109
+ return;
110
+
111
+ char nChar = 0;
112
+ while((nChar = *pString))
113
+ *pString++ = ((nChar < 'A' || nChar > 'Z') ? nChar : (nChar + 0x20));
114
+ }
115
+
116
+ static void UTILITY_HexToText(char* pBuffer, t_uint32 dwHex, t_uint32 bUpper = 0)
117
+ {
118
+ if(pBuffer == NULL)
119
+ return;
120
+
121
+ static const char szHex[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
122
+ static const char szHexU[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
123
+ int i;
124
+ if(!bUpper)
125
+ {
126
+ for(i = 7; i > -1; i--)
127
+ {
128
+ int nChar = dwHex % 16;
129
+ dwHex >>= 4;
130
+ pBuffer[i] = szHex[nChar];
131
+ }
132
+ }
133
+ else
134
+ {
135
+ for(i = 7; i > -1; i--)
136
+ {
137
+ int nChar = dwHex % 16;
138
+ dwHex >>= 4;
139
+ pBuffer[i] = szHexU[nChar];
140
+ }
141
+ }
142
+ }
143
+
144
+ static char* PVPGN_CreateHash(char* pHash, t_sint32 nSize)
145
+ {
146
+ if(pHash == NULL || nSize < 1)
147
+ return NULL;
148
+
149
+ t_uint32 dwLength = 0, i;
150
+ unsigned char* pData = (unsigned char*)pHash;
151
+ char pHashOut[41];
152
+ t_uint32 dwHash[5] = {0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0};
153
+ t_uint32 dwTemp[80];
154
+
155
+ pHashOut[40] = 0;
156
+ UTILITY_ToLower(pHash);
157
+ while(nSize > 0)
158
+ {
159
+ dwLength = (nSize > 64) ? 64 : nSize;
160
+ PVPGN_Set16(dwTemp,pData,dwLength);
161
+ PVPGN_Hash(dwHash,dwTemp);
162
+ nSize -= dwLength;
163
+ pData += dwLength;
164
+ }
165
+
166
+ for(i = 0; i < 5; i++)
167
+ UTILITY_HexToText(&pHashOut[i * 8],dwHash[i]);
168
+
169
+ return pHashOut;
170
+ }
171
+ #ifdef __TEST__
172
+ int main(int argc, char *argv[])
173
+ {
174
+ std::string sInput;
175
+ std::cout << "Please Enter Password: ";
176
+ std::cin >> sInput;
177
+ std::cout << "Hash: " << PVPGN_CreateHash((char*)sInput.c_str(),sInput.size()) << std::endl;
178
+ system("PAUSE");
179
+ return 0;
180
+ }
181
+ #else
182
+ /*
183
+ * call-seq:
184
+ * PVPGN.BNHash(string_to_hash)
185
+ *
186
+ * Creates the PVPGN hash for the give string, it is automatically
187
+ * converted to a lower case string, the input is also automatically
188
+ * converted to lower case
189
+ */
190
+ static VALUE __cdecl RUBY_BNHash(int argc, VALUE* argv, VALUE klass)
191
+ {
192
+ VALUE vPassword;
193
+ if(argc != 1)
194
+ rb_raise(rb_eRuntimeError,"Invalid Amount of Arguments");
195
+
196
+ vPassword = argv[0];
197
+ char* szPass = StringValuePtr(vPassword);
198
+ return rb_str_new2(PVPGN_CreateHash(szPass,strlen(szPass)));
199
+ }
200
+
201
+ void Init_pvpgn()
202
+ {
203
+ static VALUE mPVPGN = rb_define_module("PVPGN");
204
+ rb_define_module_function(mPVPGN,"BNHash",(VALUE (*)(...))RUBY_BNHash,-1);
205
+ }
206
+ #endif
@@ -0,0 +1,14 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{pvpgn-twilight}
3
+ s.version = "0.0.7"
4
+ s.date = %q{2009-09-30}
5
+ s.authors = ["Lorenzo Boccetti"]
6
+ s.email = %q{necrolis@gamil.com}
7
+ s.summary = %q{A ruby interface for Twilight PVPGN}
8
+ s.homepage = %q{http://www.war3.co.za}
9
+ s.description = %q{PVPGN-Twilight allows ruby scripts to communicate with pvpgn, while providing faster varients of certain functions, like hashing}
10
+ s.files = ["pvpgn-twilight.gemspec","ext/pvpgn.cpp","examples/pvpgn_test.rb","ext/extconf.rb","Changes","docs/pvpgn-twilight.txt","pvpgn-twilight.gemspec"]
11
+ s.extensions << 'ext/extconf.rb'
12
+ s.has_rdoc = true
13
+ s.extra_rdoc_files = ["Changes","ext/pvpgn.cpp","docs/pvpgn-twilight.txt"]
14
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pvpgn-twilight
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.7
5
+ platform: ruby
6
+ authors:
7
+ - Lorenzo Boccetti
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-09-30 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: PVPGN-Twilight allows ruby scripts to communicate with pvpgn, while providing faster varients of certain functions, like hashing
17
+ email: necrolis@gamil.com
18
+ executables: []
19
+
20
+ extensions:
21
+ - ext/extconf.rb
22
+ extra_rdoc_files:
23
+ - Changes
24
+ - ext/pvpgn.cpp
25
+ - docs/pvpgn-twilight.txt
26
+ files:
27
+ - pvpgn-twilight.gemspec
28
+ - ext/pvpgn.cpp
29
+ - examples/pvpgn_test.rb
30
+ - ext/extconf.rb
31
+ - Changes
32
+ - docs/pvpgn-twilight.txt
33
+ has_rdoc: true
34
+ homepage: http://www.war3.co.za
35
+ licenses: []
36
+
37
+ post_install_message:
38
+ rdoc_options: []
39
+
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ version:
54
+ requirements: []
55
+
56
+ rubyforge_project:
57
+ rubygems_version: 1.3.5
58
+ signing_key:
59
+ specification_version: 3
60
+ summary: A ruby interface for Twilight PVPGN
61
+ test_files: []
62
+