wechat-callback 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6d866c6ff02037f220c42b497664f852ecde60f
4
- data.tar.gz: 41a81672c3920de6822ccb57554d97d6c77c16f1
3
+ metadata.gz: abe8b742f4d7992685d0be99900192815cf46f4f
4
+ data.tar.gz: e3f8689b852a2fb649e0d334498b983698982934
5
5
  SHA512:
6
- metadata.gz: 5128379e8b0edbbed039f7947c6ed4cb4450be89f4fffefae80d33b231e3fadc35ee582a81fc93ef93d1655264c3d1b285334f2230cc4394d584a0adf3a4589e
7
- data.tar.gz: 08a025cd499b20325cdb42ae0159180ba83d35ae1ee2955a891aa1b15f688aaa281ff23a2569f514bcbf88d460ccfe590bc02b36d53169851543f5f6e83acf84
6
+ metadata.gz: 4b2588006ae7d1c992252d1cacaa220c5fd3ea6add64a003cff401851dae98b76461213e1f2830e6c0df206a7de03faaec2eae078a6cd70c6c86fe75a2e66319
7
+ data.tar.gz: 1d1d278dfdee0101ebc72da2d1be2171ae3d5485b187a04b1f211a59c683d2c62da3908f511e0d4f6d33b9d96a5df67c6d870cf95e4d279c1f276e5c000ad68a
data/CHANGELOG.md CHANGED
@@ -8,3 +8,7 @@
8
8
  ## v0.2
9
9
  1. Message Encryption class
10
10
  2. Message Decryption class
11
+
12
+ ## v0.3
13
+ 1. Random Byte Array class
14
+ 2. Secure Message class
@@ -7,6 +7,9 @@ require 'wechat/callback/xml_document'
7
7
  require 'wechat/callback/message_decryption'
8
8
  require 'wechat/callback/message_encryption'
9
9
 
10
+ require 'wechat/callback/random_byte_array'
11
+ require 'wechat/callback/secure_message'
12
+
10
13
  module Wechat
11
14
  module Callback
12
15
  # Your code goes here...
@@ -0,0 +1,9 @@
1
+ class Wechat::Callback::RandomByteArray
2
+
3
+ LENGTH = 16
4
+
5
+ def self.create(length)
6
+ [*0..255].sample length
7
+ end
8
+
9
+ end
@@ -0,0 +1,46 @@
1
+ class Wechat::Callback::SecureMessage
2
+
3
+ RANDOM_LENGTH = 16
4
+ XML_SIZE_LENGTH = 4
5
+
6
+ # 消息加解密
7
+ # http://mp.weixin.qq.com/wiki/6/90f7259c0d0739bbb41d9f4c4c8e59a2.html
8
+ #
9
+ # random(16B) + msg_len(4B) + msg + $AppId + padding
10
+ # padding: AES采用CBC模式,秘钥长度为32个字节,数据采用PKCS#7填充;PKCS#7:K为秘钥字节数(采用32),buf为待加密的内容,N为其字节数。Buf需要被填充为K的整数倍。在buf的尾部填充(K-N%K)个字节,每个字节的内容是(K- N%K);
11
+ # 去掉rand_msg头部的16个随机字节,4个字节的msg_len,和尾部的$AppId即为最终的xml消息体
12
+ def self.load(message_decryption)
13
+
14
+ random_bytes = message_decryption[0..(RANDOM_LENGTH-1)].bytes
15
+ xml_size = message_decryption[RANDOM_LENGTH..(RANDOM_LENGTH+XML_SIZE_LENGTH-1)].reverse.unpack('l').first
16
+
17
+ text_decryption = message_decryption.bytes[(RANDOM_LENGTH+XML_SIZE_LENGTH)..(message_decryption.length-1)]
18
+ xml_text = byte_array_to_string text_decryption[0..(xml_size-1)]
19
+
20
+ padding_length = message_decryption.last.unpack('C').first
21
+ app_id = byte_array_to_string text_decryption[xml_size..(text_decryption.length-1-padding_length)]
22
+ padding_bytes = text_decryption[(text_decryption.length-padding_length)..(text_decryption.length-1)]
23
+
24
+ [ random_bytes, xml_size, xml_text, app_id, padding_bytes ]
25
+
26
+ end
27
+
28
+ # 消息加解密
29
+ # http://mp.weixin.qq.com/wiki/6/90f7259c0d0739bbb41d9f4c4c8e59a2.html
30
+ #
31
+ # random(16B) + msg_len(4B) + msg + $AppId + padding
32
+ # padding: AES采用CBC模式,秘钥长度为32个字节,数据采用PKCS#7填充;PKCS#7:K为秘钥字节数(采用32),buf为待加密的内容,N为其字节数。Buf需要被填充为K的整数倍。在buf的尾部填充(K-N%K)个字节,每个字节的内容是(K- N%K);
33
+ # 去掉rand_msg头部的16个随机字节,4个字节的msg_len,和尾部的$AppId即为最终的xml消息体
34
+ def self.create(random_bytes, xml_text, app_id)
35
+ xml_size_bytes = [ xml_text.bytes.length ].pack('l').reverse.bytes
36
+ buffer = random_bytes+xml_size_bytes+xml_text.bytes+app_id.bytes
37
+ padding_length = 32-buffer.length%32
38
+ buffer += [ padding_length ]*padding_length
39
+ byte_array_to_string buffer
40
+ end
41
+
42
+ def self.byte_array_to_string(bytes)
43
+ bytes.inject('') do |buffer, byte| buffer += [ byte ].pack 'C' end
44
+ end
45
+
46
+ end
@@ -1,5 +1,5 @@
1
1
  module Wechat
2
2
  module Callback
3
- VERSION = '0.2'.freeze
3
+ VERSION = '0.3'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wechat-callback
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Topbit Du
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-16 00:00:00.000000000 Z
11
+ date: 2016-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -90,6 +90,8 @@ files:
90
90
  - lib/wechat/callback/message_decryption.rb
91
91
  - lib/wechat/callback/message_encryption.rb
92
92
  - lib/wechat/callback/message_signature.rb
93
+ - lib/wechat/callback/random_byte_array.rb
94
+ - lib/wechat/callback/secure_message.rb
93
95
  - lib/wechat/callback/signature.rb
94
96
  - lib/wechat/callback/version.rb
95
97
  - lib/wechat/callback/xml_document.rb