wechat-callback 0.2 → 0.3

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 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