cryptopro 0.0.3 → 0.1.1
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/README.textile +4 -0
- data/lib/cryptopro.rb +2 -0
- data/lib/cryptopro/base.rb +39 -0
- data/lib/cryptopro/certificate.rb +61 -0
- data/lib/cryptopro/signature.rb +3 -31
- data/lib/cryptopro/version.rb +1 -1
- metadata +8 -13
data/README.textile
CHANGED
data/lib/cryptopro.rb
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'digest/md5'
|
3
|
+
require 'cocaine'
|
4
|
+
|
5
|
+
module Cryptopro
|
6
|
+
class Base
|
7
|
+
CERTIFICATE_FILE_NAME = "certificate.cer"
|
8
|
+
CERTIFICATE_LINE_LENGTH = 64
|
9
|
+
|
10
|
+
def self.create_temp_dir
|
11
|
+
uniq_name = Digest::MD5.hexdigest("#{rand(1_000_000)}#{Time.now}")
|
12
|
+
full_name = "#{Dir.tmpdir}/cryptcp/#{uniq_name}"
|
13
|
+
FileUtils.mkdir_p(full_name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.create_temp_file(dir_name, file_name, content)
|
17
|
+
full_path = "#{dir_name}/#{file_name}"
|
18
|
+
File.open(full_path, "w") { |file| file.write(content) }
|
19
|
+
full_path
|
20
|
+
end
|
21
|
+
|
22
|
+
# Добавляет -----BEGIN CERTIFICATE----- / -----END CERTIFICATE-----, если их нет.
|
23
|
+
# Так же делит длинную строку Base64 на строки по 64 символа.
|
24
|
+
# Это требование cryptcp к файл с сертификатом.
|
25
|
+
def self.add_container_to_certificate(certificate)
|
26
|
+
return certificate if certificate.downcase.include?("begin")
|
27
|
+
|
28
|
+
parts = certificate.scan(/.{1,#{CERTIFICATE_LINE_LENGTH}}/)
|
29
|
+
certificate_with_container = "-----BEGIN CERTIFICATE-----\n#{parts.join("\n")}\n-----END CERTIFICATE-----"
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.create_temp_certificate_file(content)
|
33
|
+
tmp_dir = create_temp_dir
|
34
|
+
certificate_with_container = add_container_to_certificate(content)
|
35
|
+
create_temp_file(tmp_dir, CERTIFICATE_FILE_NAME, certificate_with_container)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Cryptopro
|
2
|
+
class Certificate < Cryptopro::Base
|
3
|
+
|
4
|
+
def self.info(certificate_body)
|
5
|
+
certificate_file_path = create_temp_certificate_file(certificate_body)
|
6
|
+
cryptopro_answer = get_info(certificate_file_path)
|
7
|
+
convert_from_raw_to_hashes(cryptopro_answer)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def self.get_info(certificate_file_path)
|
13
|
+
Cocaine::CommandLine.path = ["/opt/cprocsp/bin/amd64", "/opt/cprocsp/bin/ia32"]
|
14
|
+
line = Cocaine::CommandLine.new("certmgr", "-list -f :certificate",
|
15
|
+
:certificate => certificate_file_path
|
16
|
+
)
|
17
|
+
begin
|
18
|
+
line.run
|
19
|
+
rescue Cocaine::ExitStatusError
|
20
|
+
false
|
21
|
+
rescue Cocaine::CommandNotFoundError => e
|
22
|
+
raise "Command certmgr was not found"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.raw_certificates(cryptopro_answer)
|
27
|
+
cleaned_answer = clean_answer(cryptopro_answer)
|
28
|
+
cleaned_answer.split("=============================================================================")
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.clean_answer(cryptopro_answer)
|
32
|
+
cleaned = []
|
33
|
+
cleaned = cryptopro_answer.split("\n")[4..-4]
|
34
|
+
cleaned.join("\n")
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.certificate_extract_info(raw_certificate)
|
38
|
+
info = {}
|
39
|
+
raw_certificate.split("\n").each do |certificate_line|
|
40
|
+
if certificate_line.include?(":")
|
41
|
+
name, value = certificate_line.split(":").map(&:strip)
|
42
|
+
name.gsub!(/\s/, "_")
|
43
|
+
name.downcase!
|
44
|
+
info[name.to_sym] = value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
info
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.convert_from_raw_to_hashes(cryptopro_answer)
|
51
|
+
container_certificates = []
|
52
|
+
|
53
|
+
raw_certificates(cryptopro_answer).each do |raw_certificate|
|
54
|
+
container_certificates << certificate_extract_info(raw_certificate)
|
55
|
+
end
|
56
|
+
|
57
|
+
container_certificates
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
data/lib/cryptopro/signature.rb
CHANGED
@@ -1,15 +1,8 @@
|
|
1
|
-
require 'tmpdir'
|
2
|
-
require 'digest/md5'
|
3
|
-
require 'cocaine'
|
4
|
-
|
5
1
|
module Cryptopro
|
6
|
-
class Signature
|
2
|
+
class Signature < Cryptopro::Base
|
7
3
|
MESSAGE_FILE_NAME = "message.txt"
|
8
4
|
# Должен называться как файл с сообщением, только расширение .sgn
|
9
5
|
SIGNATURE_FILE_NAME = "message.txt.sgn"
|
10
|
-
CERTIFICATE_FILE_NAME = "certificate.cer"
|
11
|
-
|
12
|
-
CERTIFICATE_LINE_LENGTH = 64
|
13
6
|
|
14
7
|
# Options: message, signature, certificate
|
15
8
|
def self.verify(options)
|
@@ -17,6 +10,8 @@ module Cryptopro
|
|
17
10
|
raise "Signature required" if (options[:signature].nil? || options[:signature].empty?)
|
18
11
|
raise "Certificate required" if (options[:certificate].nil? || options[:certificate].empty?)
|
19
12
|
|
13
|
+
# Для работы с cryptcp требуется, чтобы сообщение, полпись и сертификат были в виде файлов
|
14
|
+
# Создаётся временная уникальная папка для каждой проверки
|
20
15
|
tmp_dir = create_temp_dir
|
21
16
|
create_temp_files(tmp_dir, options)
|
22
17
|
valid = execute(tmp_dir)
|
@@ -24,14 +19,6 @@ module Cryptopro
|
|
24
19
|
|
25
20
|
private
|
26
21
|
|
27
|
-
# Для работы с cryptcp требуется, чтобы сообщение, полпись и сертификат были в виде файлов
|
28
|
-
# Создаётся временная уникальная папка для каждой проверки
|
29
|
-
def self.create_temp_dir
|
30
|
-
uniq_name = Digest::MD5.hexdigest("#{rand(1_000_000)}#{Time.now}")
|
31
|
-
full_name = "#{Dir.tmpdir}/cryptcp/#{uniq_name}"
|
32
|
-
FileUtils.mkdir_p(full_name)
|
33
|
-
end
|
34
|
-
|
35
22
|
def self.create_temp_files(tmp_dir, options)
|
36
23
|
# Создать файл сообщения
|
37
24
|
create_temp_file(tmp_dir, MESSAGE_FILE_NAME, options[:message])
|
@@ -42,10 +29,6 @@ module Cryptopro
|
|
42
29
|
create_temp_file(tmp_dir, CERTIFICATE_FILE_NAME, certificate_with_container)
|
43
30
|
end
|
44
31
|
|
45
|
-
def self.create_temp_file(dir_name, file_name, content)
|
46
|
-
File.open("#{dir_name}/#{file_name}", "w") { |file| file.write(content) }
|
47
|
-
end
|
48
|
-
|
49
32
|
# Обсуждение формата использования: http://www.cryptopro.ru/forum2/Default.aspx?g=posts&t=1516
|
50
33
|
# Пример вызова утилиты cryptcp:
|
51
34
|
# cryptcp -vsignf -dir /home/user/signs -f certificate.cer message.txt
|
@@ -67,16 +50,5 @@ module Cryptopro
|
|
67
50
|
end
|
68
51
|
end
|
69
52
|
|
70
|
-
# Добавляет -----BEGIN CERTIFICATE----- / -----END CERTIFICATE-----, если их нет.
|
71
|
-
# Так же делит длинную строку Base64 на строки по 64 символа.
|
72
|
-
# Это требование cryptcp к файл с сертификатом.
|
73
|
-
def self.add_container_to_certificate(certificate)
|
74
|
-
return certificate if certificate.downcase.include?("begin")
|
75
|
-
|
76
|
-
parts = certificate.scan(/.{1,#{CERTIFICATE_LINE_LENGTH}}/)
|
77
|
-
certificate_with_container = "-----BEGIN CERTIFICATE-----\n#{parts.join("\n")}\n-----END CERTIFICATE-----"
|
78
|
-
end
|
79
|
-
|
80
53
|
end
|
81
|
-
|
82
54
|
end
|
data/lib/cryptopro/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cryptopro
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- divineforest
|
@@ -15,18 +14,16 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2011-11-
|
17
|
+
date: 2011-11-17 00:00:00 +04:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: cocaine
|
23
22
|
prerelease: false
|
24
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
24
|
requirements:
|
27
25
|
- - ">="
|
28
26
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
27
|
segments:
|
31
28
|
- 0
|
32
29
|
version: "0"
|
@@ -49,6 +46,8 @@ files:
|
|
49
46
|
- Rakefile
|
50
47
|
- cryptopro.gemspec
|
51
48
|
- lib/cryptopro.rb
|
49
|
+
- lib/cryptopro/base.rb
|
50
|
+
- lib/cryptopro/certificate.rb
|
52
51
|
- lib/cryptopro/csr.rb
|
53
52
|
- lib/cryptopro/signature.rb
|
54
53
|
- lib/cryptopro/version.rb
|
@@ -62,27 +61,23 @@ rdoc_options: []
|
|
62
61
|
require_paths:
|
63
62
|
- lib
|
64
63
|
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
64
|
requirements:
|
67
65
|
- - ">="
|
68
66
|
- !ruby/object:Gem::Version
|
69
|
-
hash: 3
|
70
67
|
segments:
|
71
68
|
- 0
|
72
69
|
version: "0"
|
73
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
71
|
requirements:
|
76
72
|
- - ">="
|
77
73
|
- !ruby/object:Gem::Version
|
78
|
-
hash: 3
|
79
74
|
segments:
|
80
75
|
- 0
|
81
76
|
version: "0"
|
82
77
|
requirements: []
|
83
78
|
|
84
79
|
rubyforge_project: cryptopro
|
85
|
-
rubygems_version: 1.6
|
80
|
+
rubygems_version: 1.3.6
|
86
81
|
signing_key:
|
87
82
|
specification_version: 3
|
88
83
|
summary: CryptoPro ruby-wrapper for linux
|