cryptic 1.0.0.beta.8 → 1.0.0.beta.9

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: 19cd7f5683be40e75d7457f388347ab393863d1c
4
- data.tar.gz: d95bb120e657ac4c18ca6dd53c835dcf577ce64c
3
+ metadata.gz: e35bfdebfe81ab3a5f56618ad5a231e1f1db4e7d
4
+ data.tar.gz: 980067e2811eef4752ff7964ded44bbe546a59f4
5
5
  SHA512:
6
- metadata.gz: 711a1bee6d4cc23f19ba6600d6e51055e665b34fc68a44bc7fce19bad589a129df2a9fa1b4472d4a0c848ca417331aeecfad83e47dee351334223f9f3981de94
7
- data.tar.gz: d0445ac68371dc194064d75039a67a414152706dca59fe8eef8132d326bef753137287d535ebdd0053f88c8e516edb96ba599507664e8f7ba5ee9ab2e00977be
6
+ metadata.gz: a58727274617570b059f332d843236dd5c37aeb4397c2d48979e40357a07468b9beede0a5e6f8c47c1adb9e082a4f76f10c647d425fdc66983edc8b45b0b09c1
7
+ data.tar.gz: e99ecbd7df5eb8461512e93bfbed18434257284f0a457b0695678ade19b20533f6baf90dbb34ef43a7ff840262e3ba4f7a1a4e84c68ce58223143ec5e311c82c
data/bin/cryptic CHANGED
@@ -62,7 +62,7 @@ class CrypticCLI < Thor
62
62
  method_option :passphrase, aliases: %w[-p], default: nil, desc: 'The passphrase to generate the private key with'
63
63
  method_option :path, aliases: %w[-o], default: '.', desc: 'Where to place the generated keys'
64
64
  def generate
65
- keypair = Cryptic::Keypair.new(options[:passphrase], options[:bits])
65
+ keypair = Cryptic::Keypair.generate(options[:passphrase], options[:bits])
66
66
  keypair.save(options[:path])
67
67
  $stdout.puts "Generated keys saved as '#{File.expand_path(options[:path])}/cryptic_public.pem' and '#{File.expand_path(options[:path])}/cryptic_private.pem'"
68
68
  rescue Cryptic::KeyGenerationFailure => e
data/cryptic_private.pem CHANGED
@@ -1,30 +1,30 @@
1
1
  -----BEGIN RSA PRIVATE KEY-----
2
2
  Proc-Type: 4,ENCRYPTED
3
- DEK-Info: AES-256-CBC,7982FC649F5EDF03FA207CADC0B871BA
3
+ DEK-Info: AES-256-CBC,16AE475ED7BBA9616BCC2ED1DD9767BA
4
4
 
5
- 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
- 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
- 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
- xiILWriqbnTrf3gbnAEZsz+msledZ9zT1bEJJLOoGOzF2UhrHZnestDakl2mK+RS
9
- qHutCCEMp0ei/p+mp/5COGKWgXsvnmIK7+KyaWq6G0k+iI/WfzGjt4qDRsa81duA
10
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
30
30
  -----END RSA PRIVATE KEY-----
data/cryptic_public.pem CHANGED
@@ -1,9 +1,9 @@
1
1
  -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzOWt9cgkhxkdGs8SFlgZ
3
- BXCETwddfTg0zez/IeFiCAe8gcKQBDHa62jMbkwAg/tNAherRXqguWF9ZLm4ZTf3
4
- fxRHafj0KA83KLdLWcxaU1TsN/c2/DcDcsSwdgMKGz4YQR64RC6c98s/c0HZQzPj
5
- vEQPA/fU0LoFmGynZ9/pdEXQe6N3kzbpG8//64RxgFPco7g7HbZIVaRqyx3U4UgQ
6
- FKb+HoYDs5U+P6qz6TU4YFZbqglunptxKIjUZG7lywGPtDhD9gQf2n5n+wId4MgD
7
- xKwrj+ZQF220Mmq96LSm1a3BtiRhZInKLPn9Yr7JFh7CgVmqn2/50UVAbbdKKO4x
8
- TwIDAQAB
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA77uynFjDr8QenZojWGao
3
+ beqNoMB7f64QmTa7dnLgU1VDtkBn4ni3lzCXbaILvNb3fSP26qnry1vbJmxxJxd+
4
+ Vbz1Uo34+xGNmXRnQirY4PyOXrz6PhYScua/JvCr+mUo5tBz7SowG1UuH2eMWLyS
5
+ pcttlnNFaPGeuXkSuaO95ObLcXJIJgQdvFB+yccjLV218GjYR4ncYmOGXs+lxQWI
6
+ wywF2T160228JXWtNHwAfDe7cNUlgAknopMsTYuekMvDE9VB+vF0J+n+iRaQ3sOE
7
+ oqyPBuRJii3fG3h/F6sB/cOvBwd5J688u7LVRHbQJ/5IQ33WOAb36GBv13uoEv7Y
8
+ RwIDAQAB
9
9
  -----END PUBLIC KEY-----
@@ -16,7 +16,7 @@ module Cryptic
16
16
  # Initializes a Cryptic::Keypair object from a private/public keypair
17
17
  #
18
18
  # @note The passphrase isn't saved
19
- # @todo Use the Ruby 2 named parameters syntax vs. an opts hash
19
+ # @todo Code clean up between initialize and generate!
20
20
  # @todo Validate that keys are public/private
21
21
  # @param [String] private_key the private key (or file) to use
22
22
  # @param [Hash] opts additional options to configure your Keypair with
@@ -25,32 +25,41 @@ module Cryptic
25
25
  # from
26
26
  # @return [Keypair] the initialized Cryptic::Keypair object
27
27
  def initialize(private_key, opts = { public_key: nil, passphrase: nil })
28
- @private_key = OpenSSL::PKey::RSA.new(
29
- if File.exists?(private_key)
30
- File.read(private_key)
31
- else
32
- private_key
33
- end,
34
- opts[:passphrase]
35
- )
36
-
37
- unless @private_key.private?
38
- raise(
39
- Cryptic::InvalidKey,
40
- "Public key '#{private_key}' provided as a private key."
41
- )
28
+ if private_key.is_a? OpenSSL::PKey::RSA
29
+ @private_key = private_key
30
+ elsif !private_key.to_pem.eql? ''
31
+ @private_key = OpenSSL::PKey::RSA.new(
32
+ if File.exists?(private_key)
33
+ File.read(private_key)
34
+ else
35
+ private_key
36
+ end,
37
+ opts[:passphrase]
38
+ )
39
+ unless @private_key.private?
40
+ raise(
41
+ Cryptic::InvalidKey,
42
+ "Public key '#{private_key}' provided as a private key."
43
+ )
44
+ end
42
45
  end
43
46
 
44
- @public_key = OpenSSL::PKey::RSA.new(
45
- if opts[:public_key] && File.exists?(opts[:public_key])
46
- File.read(opts[:public_key])
47
- elsif opts[:public_key]
48
- opts[:public_key]
49
- else
50
- @private_key
51
- end,
52
- opts[:passphrase]
53
- ).public_key
47
+ if public_key.is_a? OpenSSL::PKey::RSA
48
+ @public_key = public_key
49
+ else
50
+ @public_key = OpenSSL::PKey::RSA.new(
51
+ if opts[:public_key] && File.exists?(opts[:public_key].to_s)
52
+ File.read(opts[:public_key])
53
+ elsif opts[:public_key]
54
+ opts[:public_key]
55
+ else
56
+ require 'pry'
57
+ binding.pry
58
+ @private_key or raise(Cryptic::KeyNotFound)
59
+ end,
60
+ opts[:passphrase]
61
+ ).public_key
62
+ end
54
63
  rescue OpenSSL::PKey::RSAError => e
55
64
  if e.message.eql? 'Neither PUB key nor PRIV key:: not enough data'
56
65
  if @private_key.nil?
@@ -73,16 +82,21 @@ module Cryptic
73
82
  # @param [Fixnum] size the amount of bits to use in your key
74
83
  # @return [Keypair] an object representing a private/public keypair
75
84
  def self.generate(passphrase = nil, size = 2048)
76
- # OPTIMIZE: There are so many hammers in here it looks like we're playing
77
- # Whack-a-mole
78
85
  # TODO: Find a better way to handle retries
79
86
  attempts ||= 0
80
87
  attempts += 1
81
88
 
82
- rsa_key = OpenSSL::PKey::RSA.new(size)
83
- cipher ||= OpenSSL::Cipher::AES256.new(:CBC)
89
+ rsa_key = OpenSSL::PKey::RSA.new(size, passphrase)
90
+ cipher = OpenSSL::Cipher::AES256.new(:CBC)
84
91
 
85
- new(rsa_key.to_pem(cipher, passphrase), { public_key: rsa_key.public_key.to_pem, passphrase: passphrase })
92
+ new(
93
+ rsa_key,
94
+ {
95
+ cipher: cipher,
96
+ public_key: rsa_key.public_key,
97
+ passphrase: passphrase
98
+ }
99
+ )
86
100
  rescue OpenSSL::PKey::RSAError => e
87
101
  if e.message =~ /^read key$/
88
102
  retry unless attempts > 1
@@ -97,19 +111,22 @@ module Cryptic
97
111
  # @todo Document what save may raise
98
112
  # @todo Update this method
99
113
  # @return [String] returns the path files were saved to
100
- def save(path = '.')
101
- if @private_key.to_pem.eql?('') || @public_key.to_pem.eql?('')
114
+ def save(path = '.', opts = { cipher: OpenSSL::Cipher::AES256.new(:CBC), passphrase: nil})
115
+ priv = @private_key.to_pem(opts[:cipher], opts[:passphrase])
116
+ pub = (opts[:public_key] || @public_key || @private_key.public_key).to_pem
117
+
118
+ if priv.eql?('') || pub.eql?('')
102
119
  raise Cryptic::KeyGenerationFailure, "The keypair was never successfully generated"
103
120
  end
104
121
 
105
122
  FileUtils.mkdir_p(File.dirname(path))
106
123
 
107
124
  File.open("#{File.expand_path(path)}/cryptic_private.pem", 'w') do |file|
108
- file.write @private_key
125
+ file.write priv
109
126
  end
110
127
 
111
128
  File.open("#{File.expand_path(path)}/cryptic_public.pem", 'w') do |file|
112
- file.write @public_key
129
+ file.write pub
113
130
  end
114
131
 
115
132
  path
@@ -1,4 +1,4 @@
1
1
  module Cryptic
2
2
  # The version of the cryptic gem
3
- VERSION = '1.0.0.beta.8'
3
+ VERSION = '1.0.0.beta.9'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cryptic
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta.8
4
+ version: 1.0.0.beta.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erran Carey