pkcs7-cryptographer 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c3b2d20fdc0a9804d2e748fbb952795720231ac668903f8e7bc3843194147c5f
4
- data.tar.gz: 8fe66251f456e340ef033201d4e865920780c89d5c46fc16af49095eb9a373b9
3
+ metadata.gz: a33a97c4086f5f9780f1098df7d5983802301bcd6566b42030572871450cd304
4
+ data.tar.gz: d6257773adc3d2c0fd25383ad1b243c04317d091fee682e477b8dc384201dfec
5
5
  SHA512:
6
- metadata.gz: e7285b506e68a68533b7623d83d54a8ab2335505c10fe161784ea6040207fe935890f02e44745b49568605d8fb81653a5ab2b6db1dea59374f666b0103e0076c
7
- data.tar.gz: 89710d821aa0f16cc5e695d2506718738b5c8c05f3a7bbfb76eb7ef333cbe4abf604016616ca09487150fb8827aad1c0cf0670c4164f659666576b2dd73402a1
6
+ metadata.gz: 7a58da6fe867dfe729490b054a6ba53d1a07a5ccfde2812acdbd2d892af10e4f29f7345741b2c9f51bcf4af400d8f7cb19392b95d27a981850afdc47d76c816f
7
+ data.tar.gz: 7a30d3664b52f8789fc118d9b8b5b00a74187dec24db6edff6b850fddeee31e0058ce008d56734c2a8e1b9e7a081780fb99dfcfc21f15e50cef0f3857a0d6c73
data/.rubocop.yml CHANGED
@@ -1,6 +1,9 @@
1
+ require:
2
+ - rubocop-rake
3
+ - rubocop-rspec
4
+
1
5
  AllCops:
2
6
  NewCops: enable
3
- SuggestExtensions: false
4
7
  Style/StringLiterals:
5
8
  Enabled: true
6
9
  EnforcedStyle: double_quotes
@@ -13,4 +16,10 @@ Layout/LineLength:
13
16
  Max: 80
14
17
 
15
18
  Metrics/BlockLength:
16
- IgnoredMethods: ['describe', 'context']
19
+ IgnoredMethods: ['describe', 'context']
20
+
21
+ RSpec/MultipleMemoizedHelpers:
22
+ Enabled: false
23
+
24
+ RSpec/NestedGroups:
25
+ Max: 4
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pkcs7-cryptographer (0.1.0)
4
+ pkcs7-cryptographer (0.2.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -33,19 +33,24 @@ GEM
33
33
  diff-lcs (>= 1.2.0, < 2.0)
34
34
  rspec-support (~> 3.10.0)
35
35
  rspec-support (3.10.2)
36
- rubocop (0.93.1)
36
+ rubocop (1.12.0)
37
37
  parallel (~> 1.10)
38
- parser (>= 2.7.1.5)
38
+ parser (>= 3.0.0.0)
39
39
  rainbow (>= 2.2.2, < 4.0)
40
- regexp_parser (>= 1.8)
40
+ regexp_parser (>= 1.8, < 3.0)
41
41
  rexml
42
- rubocop-ast (>= 0.6.0)
42
+ rubocop-ast (>= 1.2.0, < 2.0)
43
43
  ruby-progressbar (~> 1.7)
44
- unicode-display_width (>= 1.4.0, < 2.0)
44
+ unicode-display_width (>= 1.4.0, < 3.0)
45
45
  rubocop-ast (1.4.1)
46
46
  parser (>= 2.7.1.5)
47
+ rubocop-rake (0.5.1)
48
+ rubocop
49
+ rubocop-rspec (2.2.0)
50
+ rubocop (~> 1.0)
51
+ rubocop-ast (>= 1.1.0)
47
52
  ruby-progressbar (1.11.0)
48
- unicode-display_width (1.7.0)
53
+ unicode-display_width (2.0.0)
49
54
 
50
55
  PLATFORMS
51
56
  x86_64-darwin-19
@@ -56,7 +61,9 @@ DEPENDENCIES
56
61
  pry
57
62
  rake (~> 13.0)
58
63
  rspec (~> 3.2)
59
- rubocop (~> 0.80)
64
+ rubocop (= 1.12.0)
65
+ rubocop-rake (= 0.5.1)
66
+ rubocop-rspec (= 2.2.0)
60
67
 
61
68
  BUNDLED WITH
62
69
  2.2.3
data/README.md CHANGED
@@ -1,11 +1,17 @@
1
1
  # PKCS7::Cryptographer
2
2
 
3
- Cryptographer is an small utility that allows to encrypt and decrypt messages
3
+ [![Gem Version](https://badge.fury.io/rb/pkcs7-cryptographer.svg)](https://badge.fury.io/rb/pkcs7-cryptographer)
4
+ ![main workflow](https://github.com/dmuneras/pkcs7-cryptographer/actions/workflows/main.yml/badge.svg)
5
+
6
+
7
+
8
+ Cryptographer is an small utility to encrypt and decrypt messages
4
9
  using PKCS7.
5
10
 
6
- PKCS7 is used to store signed and encrypted data.It uses aes-256-cbc
7
- as chipher in the encryption process. If you want to read more information about
8
- the involved data structures and theory around this, please visit:
11
+ PKCS7 is used to store signed and encrypted data.This specific implementation
12
+ uses aes-256-cbc as chipher in the encryption process. If you want to read more
13
+ information about the involved data structures and theory around this,
14
+ please visit:
9
15
 
10
16
  - https://ruby-doc.org/stdlib-3.0.0/libdoc/openssl/rdoc/OpenSSL.html
11
17
  - https://tools.ietf.org/html/rfc5652
@@ -20,30 +26,36 @@ gem 'pkcs7-cryptographer'
20
26
 
21
27
  And then execute:
22
28
 
29
+ ```sh
23
30
  $ bundle install
31
+ ```
24
32
 
25
33
  Or install it yourself as:
26
34
 
35
+ ```sh
27
36
  $ gem install pkcs7-cryptographer
28
-
37
+ ```
29
38
  ## Usage
30
39
 
31
40
  After installing the gem you will have the `PKCS7::Cryptographer` available.
32
41
 
33
- `PKCS7::Cryptographer` is a class that provides to public methods:
42
+ `PKCS7::Cryptographer` is a class that provides two public methods:
34
43
 
35
44
  - `sign_and_encrypt`
36
45
  - `decrypt_and_verify`
37
46
 
38
- Read the following example to get a better undertanding:
47
+ Read the following examples to get a better undertanding:
48
+
49
+
50
+ ### Using bare PKCS7::Cryptographer
39
51
 
40
52
  ```ruby
41
53
 
42
54
  # This script assumes you have a read_file method to read the certificates and
43
55
  # keys.
44
56
 
45
- # What we are going to do is sign an encrypt a message from the CA Authority
46
- # and read it from the Client:
57
+ # What we are going to do is signing an encrypting a message from the CA
58
+ # Authority and read it from the Client:
47
59
 
48
60
  # Certificate Authority PKI data
49
61
  CA_KEY = read_file("ca.key")
@@ -62,6 +74,8 @@ Read the following example to get a better undertanding:
62
74
  # It could be read if the CA_STORE of the reader has certificate of the
63
75
  # CA that signed the client certificate as trusted.
64
76
 
77
+ cryptographer = PKCS7::Cryptographer.new
78
+
65
79
  # Client <------------------------- CA Authority API
66
80
  encrypted_data = cryptographer.sign_and_encrypt(
67
81
  data: "Atletico Nacional de Medellin",
@@ -87,6 +101,55 @@ Read the following example to get a better undertanding:
87
101
  # decrypted_data returns: "Atletico Nacional de Medellin"
88
102
  ```
89
103
 
104
+ ### Using PKCS7::Cryptographer::Entity
105
+
106
+ ```ruby
107
+
108
+ # This script assumes you have a read_file method to read the certificates and
109
+ # keys. If you have any question about how to generate the keys/certificates
110
+ # check this post: https://mariadb.com/kb/en/certificate-creation-with-openssl/
111
+
112
+ # What we are going to do is sending a message from the CA Authority and read
113
+ # it from the Client:
114
+
115
+ # Certificate Authority PKI data
116
+ CA_KEY = read_file("ca.key")
117
+ CA_CERTIFICATE = read_file("ca.crt")
118
+
119
+ # Client PKI data
120
+ CLIENT_CERTIFICATE = read_file("client.crt")
121
+ CLIENT_KEY = read_file("client.key")
122
+
123
+ CA_STORE = OpenSSL::X509::Store.new
124
+ CA_STORE.add_cert(OpenSSL::X509::Certificate.new(CA_CERTIFICATE))
125
+
126
+ ca_entity = PKCS7::Cryptographer::Entity.new(
127
+ key: CA_KEY,
128
+ certificate: CA_CERTIFICATE,
129
+ ca_store: CA_STORE
130
+ )
131
+
132
+ client_entity = PKCS7::Cryptographer::Entity.new(
133
+ key: CLIENT_KEY,
134
+ certificate: CLIENT_CERTIFICATE,
135
+ ca_store: CA_STORE
136
+ )
137
+
138
+ # SEND MESSAGE TO THE CLIENT
139
+ # ----------------------------------------------------------------------------
140
+ data = "Victor Ibarbo"
141
+ encrypted_data = ca_entity.encrypt_data(data: data, to: client_entity)
142
+
143
+ # READ MESSAGE IN CLIENT
144
+ # ----------------------------------------------------------------------------
145
+ decrypted_data = client_entity.decrypt_data(
146
+ data: encrypted_data,
147
+ from: ca_entity
148
+ )
149
+
150
+ # decrypted_data returns: "Victor Ibarbo"
151
+ ```
152
+
90
153
  ## Development
91
154
 
92
155
  After checking out the repo, run `bin/setup` to install dependencies. Then, run
data/bin/console CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
  require "bundler/setup"
5
5
  require "pkcs7/cryptographer"
6
+ require "pkcs7/cryptographer/entity"
6
7
 
7
8
  # You can add fixtures and/or initialization code here to make experimenting
8
9
  # with your gem easier. You can also use a different console, if you like.
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "openssl"
4
4
  require_relative "cryptographer/version"
5
+ require_relative "cryptographer/initializers"
5
6
 
6
7
  module PKCS7
7
8
  ###
@@ -14,6 +15,8 @@ module PKCS7
14
15
  # - https://tools.ietf.org/html/rfc5652
15
16
  ###
16
17
  class Cryptographer
18
+ include PKCS7::Cryptographer::Initializers
19
+
17
20
  # PUBLIC METHODS
18
21
  # --------------------------------------------------------------------------
19
22
 
@@ -75,25 +78,5 @@ module PKCS7
75
78
 
76
79
  signed_data.data
77
80
  end
78
-
79
- # PRIVATE METHODS
80
- # --------------------------------------------------------------------------
81
- private
82
-
83
- def x509_certificate(certificate)
84
- wrap_in_class_or_return(certificate, OpenSSL::X509::Certificate)
85
- end
86
-
87
- def rsa_key(key)
88
- wrap_in_class_or_return(key, OpenSSL::PKey::RSA)
89
- end
90
-
91
- def pkcs7(pkcs7)
92
- wrap_in_class_or_return(pkcs7, OpenSSL::PKCS7)
93
- end
94
-
95
- def wrap_in_class_or_return(data, klass)
96
- data.instance_of?(klass) ? data : klass.new(data)
97
- end
98
81
  end
99
82
  end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "initializers"
4
+
5
+ module PKCS7
6
+ class Cryptographer
7
+ ###
8
+ # Define an entity abel to decrypt or encrypt messages to send them to other
9
+ # entities. It uses a Cryptographer to do the dirty work and just provide a
10
+ # more human readable way to read an pass messages between trustable
11
+ # entities.
12
+ ###
13
+ class Entity
14
+ include PKCS7::Cryptographer::Initializers
15
+
16
+ attr_reader :certificate
17
+
18
+ # PUBLIC METHODS
19
+ # ------------------------------------------------------------------------
20
+ def initialize(key:, certificate:, ca_store: OpenSSL::X509::Store.new)
21
+ @key = rsa_key(key)
22
+ @certificate = x509_certificate(certificate)
23
+ @cryptographer = PKCS7::Cryptographer.new
24
+ @ca_store = ca_store
25
+ end
26
+
27
+ def trustable_entity?(entity)
28
+ @ca_store.verify(entity.certificate)
29
+ end
30
+
31
+ def encrypt_data(data:, to:)
32
+ perform_safely(to) do
33
+ @cryptographer.sign_and_encrypt(
34
+ data: data,
35
+ key: @key,
36
+ certificate: @certificate,
37
+ public_certificate: to.certificate
38
+ )
39
+ end
40
+ end
41
+
42
+ def decrypt_data(data:, from:)
43
+ perform_safely(from) do
44
+ @cryptographer.decrypt_and_verify(
45
+ data: data,
46
+ key: @key,
47
+ certificate: @certificate,
48
+ public_certificate: from.certificate,
49
+ ca_store: @ca_store
50
+ )
51
+ end
52
+ end
53
+
54
+ # PRIVATE METHODS
55
+ # ------------------------------------------------------------------------
56
+ private
57
+
58
+ def perform_safely(entity)
59
+ return false unless trustable_entity?(entity)
60
+
61
+ yield
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PKCS7
4
+ class Cryptographer
5
+ ###
6
+ # Provides a set of methods to initialize OpenSSL objects if necessary. It
7
+ # allow consumers to pass either the OpenSSL ruby objects or the
8
+ # certificate, key or encrypted message string.
9
+ ###
10
+ module Initializers
11
+ def x509_certificate(certificate)
12
+ wrap_in_class_or_return(certificate, OpenSSL::X509::Certificate)
13
+ end
14
+
15
+ def rsa_key(key)
16
+ wrap_in_class_or_return(key, OpenSSL::PKey::RSA)
17
+ end
18
+
19
+ def pkcs7(pkcs7)
20
+ wrap_in_class_or_return(pkcs7, OpenSSL::PKCS7)
21
+ end
22
+
23
+ def wrap_in_class_or_return(data, klass)
24
+ data.instance_of?(klass) ? data : klass.new(data)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module PKCS7
4
4
  class Cryptographer
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.1"
6
6
  end
7
7
  end
@@ -31,5 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency "pry"
32
32
  spec.add_development_dependency "rake", "~> 13.0"
33
33
  spec.add_development_dependency "rspec", "~> 3.2"
34
- spec.add_development_dependency "rubocop", "~> 0.80"
34
+ spec.add_development_dependency "rubocop", "1.12.0"
35
+ spec.add_development_dependency "rubocop-rake", "0.5.1"
36
+ spec.add_development_dependency "rubocop-rspec", "2.2.0"
35
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pkcs7-cryptographer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Munera Sanchez
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-24 00:00:00.000000000 Z
11
+ date: 2021-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,16 +70,44 @@ dependencies:
70
70
  name: rubocop
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: '0.80'
75
+ version: 1.12.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.12.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.5.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.5.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 2.2.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
81
109
  - !ruby/object:Gem::Version
82
- version: '0.80'
110
+ version: 2.2.0
83
111
  description: Utility to encrypt and decrypt messages using OpenSSL::PKCS7
84
112
  email:
85
113
  - dmunera119@gmail.com
@@ -100,6 +128,8 @@ files:
100
128
  - bin/console
101
129
  - bin/setup
102
130
  - lib/pkcs7/cryptographer.rb
131
+ - lib/pkcs7/cryptographer/entity.rb
132
+ - lib/pkcs7/cryptographer/initializers.rb
103
133
  - lib/pkcs7/cryptographer/version.rb
104
134
  - pkcs7-cryptographer.gemspec
105
135
  homepage: https://github.com/dmuneras/pkcs7-cryptographer