sm2-crypto 0.2 → 0.2.2

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
  SHA256:
3
- metadata.gz: e11ed586baf19d83dea3bde65ca1c67c793229c1618222c3b0eab7dcaf4aa145
4
- data.tar.gz: 87b1ef2ecdcb6cf6852a5616e2da6655964f065a62a0418824702936fd5a0a31
3
+ metadata.gz: 812a0448b18753f7d1cdcee626efbacfdf241ae41aebc10d0aafa88deafb494c
4
+ data.tar.gz: 84ce57f30b52a790dea1df531cda4d42521dded4eb73bf1724b92b0c78fc4e19
5
5
  SHA512:
6
- metadata.gz: 42430a1b69e52b255684bdfaf35ff4f501f908cb78be9516575c2a2e850288e29cb99c705b512b967eaab1d25f960319fc89f8acb6d79883608e199dc8825b61
7
- data.tar.gz: 3c2142bcb64674f49d147791fe66fb726953e6fd7973969392ed0e892ef17424e9018ee31706164f45f85c3eab56f57b49e9ca456ab11c7ffe2b39bacb331207
6
+ metadata.gz: 59c91665c309c8ba0b33b0474582f827fd8c3803e5edd4075e18ea2d3c996a808ca814785a6814f0be9d9d0d094a84418923ec75985f9bb3efc716dc1c472af7
7
+ data.tar.gz: 02ca14a4d03a0e1f1b93f9556cadfe5638e75e089fce4cfaf4ab433e0a10e68e23ae7b7ce908a30cab8ca920c3512885cb25f4e5ad9d16ea1e6ada31720e542e
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.2] - 2025-03-26
4
+
5
+ - Add ASN.1 DER format for sm2 sign and verify
6
+
7
+ ## [0.2.0] - 2023-04-21
8
+
9
+ - Add sm2 sign and verify support
10
+
3
11
  ## [0.1.0] - 2023-03-27
4
12
 
5
13
  - Initial release
data/Gemfile CHANGED
@@ -5,5 +5,5 @@ source "https://rubygems.org"
5
5
  # Specify your gem's dependencies in sm2-crypto.gemspec
6
6
  gemspec
7
7
 
8
- gem "rake", "~> 13.0"
9
- gem "minitest", "~> 5.0"
8
+ gem "rake", "~> 13.2"
9
+ gem "minitest", "~> 5.25"
data/README.md CHANGED
@@ -59,11 +59,17 @@ sign = SM2Crypto.sign(private_key, message)
59
59
  # verify signatrue
60
60
  SM2Crypto.verify(public_key, message, sign)
61
61
 
62
- user_id = "31323334353637383132333435363738" # user_id should be a hex string
62
+ # user_id should be a hex string, default: "31323334353637383132333435363738" which is equal to utf-8 string: "1234567812345678"
63
+ user_id = "31323334353637383132333435363738"
63
64
  # sign with hash and user_id
64
65
  sign = SM2Crypto.sign(private_key, message, sm3_hash: true, user_id: user_id)
65
66
  # verify with hash and user_id
66
67
  SM2Crypto.verify(public_key, message, sign, sm3_hash: true, user_id: user_id)
68
+
69
+ # sign with ASN.1 DER format output
70
+ sign = SM2Crypto.sign(private_key, message, asn1: true)
71
+ # verify signatrue
72
+ SM2Crypto.verify(public_key, message, sign, asn1: true)
67
73
  ```
68
74
 
69
75
  ### Get Public Key from Private Key
data/lib/sm2_crypto.rb CHANGED
@@ -101,9 +101,10 @@ module SM2Crypto
101
101
  # @param private_key [String] private key, format: binary string
102
102
  # @param data [String]
103
103
  # @param sm3_hash [Boolean], option to sign with sm3 hash, default: false
104
- # @param user_id [String], format: hex string, default: "31323334353637383132333435363738"
104
+ # @param user_id [String], format: hex string, default: "31323334353637383132333435363738" which is equal to utf-8 str "1234567812345678"
105
+ # @param asn1 [Boolean], option to return asn.1 der format signature, default: false
105
106
  # @return [String] signature, format: hex string
106
- def sign(private_key, data, sm3_hash: false, user_id: "31323334353637383132333435363738")
107
+ def sign(private_key, data, sm3_hash: false, user_id: "31323334353637383132333435363738", asn1: false)
107
108
  data = data.unpack1("a*") unless data.ascii_only?
108
109
  if sm3_hash
109
110
  public_key = get_public_key(private_key)
@@ -130,7 +131,11 @@ module SM2Crypto
130
131
  s = ((one + da).mod_inverse(n) * (k - (r * da))).to_i % n.to_i
131
132
  end
132
133
 
133
- r.to_s(16).rjust(64, "0") + s.to_s(16).rjust(64, "0")
134
+ if asn1
135
+ OpenSSL::ASN1::Sequence.new([OpenSSL::ASN1::Integer.new(r), OpenSSL::ASN1::Integer.new(s)]).to_der.unpack1("H*")
136
+ else
137
+ r.to_s(16).rjust(64, "0") + s.to_s(16).rjust(64, "0")
138
+ end
134
139
  end
135
140
 
136
141
  # verify the signature with public_key
@@ -140,17 +145,28 @@ module SM2Crypto
140
145
  # @param signature [String], hex string
141
146
  # @param sm3_hash [Boolean], option to sign with sm3 hash, default: false
142
147
  # @param user_id [String], format: hex string, default: "31323334353637383132333435363738"
148
+ # @param asn1 [Boolean], option to verify asn.1 der format signature, default: false
143
149
  # @return [Boolean] verify result
144
- def verify(public_key, data, signature, sm3_hash: false, user_id: "31323334353637383132333435363738")
145
- return false if signature.size != 128
150
+ def verify(public_key, data, signature, sm3_hash: false, user_id: "31323334353637383132333435363738", asn1: false)
151
+ if asn1
152
+ return false if signature.size < 136
153
+
154
+ # parse asn1 der format hex string signature
155
+ der_seq = OpenSSL::ASN1.decode([signature].pack("H*"))
156
+ r = der_seq.value[0].value
157
+ s = der_seq.value[1].value
158
+ else
159
+ return false if signature.size != 128
160
+
161
+ r = OpenSSL::BN.new(signature[0, 64], 16)
162
+ s = OpenSSL::BN.new(signature[64, 64], 16)
163
+ end
146
164
 
147
165
  public_key = "\x04#{public_key}" if public_key.size == 64 && public_key[0] != "\x04"
148
166
  data = data.unpack1("a*") unless data.ascii_only?
149
167
  if sm3_hash
150
168
  data = OpenSSL::Digest.digest("SM3", za(public_key, user_id) + data)
151
169
  end
152
- r = OpenSSL::BN.new(signature[0, 64], 16)
153
- s = OpenSSL::BN.new(signature[64, 64], 16)
154
170
  n = OpenSSL::BN.new("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123", 16)
155
171
  e = OpenSSL::BN.new(data, 2)
156
172
 
metadata CHANGED
@@ -1,43 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sm2-crypto
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seekr
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-21 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: minitest
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '5.0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '5.0'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '13.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '13.0'
11
+ date: 2025-03-26 00:00:00.000000000 Z
12
+ dependencies: []
41
13
  description: sm2-crypto is an implementation of the SM2 encryption and decryption
42
14
  algorithm in pure Ruby based on the OpenSSL
43
15
  email:
@@ -48,12 +20,10 @@ extra_rdoc_files: []
48
20
  files:
49
21
  - CHANGELOG.md
50
22
  - Gemfile
51
- - Gemfile.lock
52
23
  - LICENSE.txt
53
24
  - README.md
54
25
  - Rakefile
55
26
  - lib/sm2_crypto.rb
56
- - sm2-crypto.gemspec
57
27
  homepage: https://github.com/numbcoder/sm2-crypto
58
28
  licenses:
59
29
  - MIT
@@ -61,7 +31,7 @@ metadata:
61
31
  rubygems_mfa_required: 'true'
62
32
  homepage_uri: https://github.com/numbcoder/sm2-crypto
63
33
  source_code_uri: https://github.com/numbcoder/sm2-crypto
64
- post_install_message:
34
+ post_install_message:
65
35
  rdoc_options: []
66
36
  require_paths:
67
37
  - lib
@@ -76,8 +46,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
46
  - !ruby/object:Gem::Version
77
47
  version: '0'
78
48
  requirements: []
79
- rubygems_version: 3.4.6
80
- signing_key:
49
+ rubygems_version: 3.1.6
50
+ signing_key:
81
51
  specification_version: 4
82
52
  summary: An SM2 cryptographic algorithm encryption and decryption library for Ruby
83
53
  test_files: []
data/Gemfile.lock DELETED
@@ -1,22 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- sm2-crypto (0.1)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- minitest (5.18.0)
10
- rake (13.0.6)
11
-
12
- PLATFORMS
13
- arm64-darwin-22
14
- x86_64-linux
15
-
16
- DEPENDENCIES
17
- minitest (~> 5.0)
18
- rake (~> 13.0)
19
- sm2-crypto!
20
-
21
- BUNDLED WITH
22
- 2.4.6
data/sm2-crypto.gemspec DELETED
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- Gem::Specification.new do |spec|
4
- spec.name = "sm2-crypto"
5
- spec.version = "0.2"
6
- spec.authors = ["Seekr"]
7
- spec.email = ["wzhao23@gmail.com"]
8
-
9
- spec.summary = "An SM2 cryptographic algorithm encryption and decryption library for Ruby"
10
- spec.description = "sm2-crypto is an implementation of the SM2 encryption and decryption algorithm in pure Ruby based on the OpenSSL"
11
- spec.homepage = "https://github.com/numbcoder/sm2-crypto"
12
- spec.license = "MIT"
13
- spec.required_ruby_version = ">= 2.7.0"
14
-
15
- spec.metadata["rubygems_mfa_required"] = "true"
16
- spec.metadata["homepage_uri"] = spec.homepage
17
- spec.metadata["source_code_uri"] = spec.homepage
18
-
19
- # Specify which files should be added to the gem when it is released.
20
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
21
- spec.files = Dir.chdir(__dir__) do
22
- `git ls-files -z`.split("\x0").reject do |f|
23
- (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|circleci)|appveyor)})
24
- end
25
- end
26
- spec.bindir = "exe"
27
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
28
- spec.require_paths = ["lib"]
29
-
30
- spec.add_development_dependency "minitest", ">= 5.0"
31
- spec.add_development_dependency "rake", ">= 13.0"
32
- end