sm2-crypto 0.2.1 → 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 +4 -4
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -2
- data/README.md +7 -1
- data/lib/sm2_crypto.rb +23 -7
- metadata +7 -37
- data/Gemfile.lock +0 -22
- data/sm2-crypto.gemspec +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 812a0448b18753f7d1cdcee626efbacfdf241ae41aebc10d0aafa88deafb494c
|
4
|
+
data.tar.gz: 84ce57f30b52a790dea1df531cda4d42521dded4eb73bf1724b92b0c78fc4e19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 59c91665c309c8ba0b33b0474582f827fd8c3803e5edd4075e18ea2d3c996a808ca814785a6814f0be9d9d0d094a84418923ec75985f9bb3efc716dc1c472af7
|
7
|
+
data.tar.gz: 02ca14a4d03a0e1f1b93f9556cadfe5638e75e089fce4cfaf4ab433e0a10e68e23ae7b7ce908a30cab8ca920c3512885cb25f4e5ad9d16ea1e6ada31720e542e
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
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
|
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
|
-
|
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
|
-
|
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:
|
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.
|
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.2.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.1"
|
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
|