urg 1.0.0 → 2.0.0

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: ab5fdbf2ded7cae1dcab226132f54a5288df63fe5211517cedf8fd78d0581c3d
4
- data.tar.gz: 28ecb8f88aa4c8a0c503aa9390747af06f7a50afa3927df8ce992b0398c8da85
3
+ metadata.gz: caa54c0d547147e299a5fe633dffb9788ad484bfd1a2b6069de082b2eed9eb21
4
+ data.tar.gz: 6d2cbad977fe534ca66cd7c529c72a619e4cfcfe37d1bb8844738390fb7aca16
5
5
  SHA512:
6
- metadata.gz: 0d08ab8c416deff8ed5a3aa5bbe573126ed7e9073dc4b2cb550def06b0b6017862076052932958f24ea43009940f3da2f5d4d424aed5d2f7632068c662c5fed3
7
- data.tar.gz: 958dc223cea12f3b756496e7063ce05157cf8ec4817ecefef0fbc4b97870a2d6bae2e6f49c846ae0e589f7c8683ef9a8f59a8760ffe29291e1d367a47ae8fa83
6
+ metadata.gz: d0045e15e2b7ac46f47ec6bcb5a8dee46e00902da8e26eb6e2bf364743db62f207967d669d184e6b09c20df37ff2675af6c6616b5d91b6319ff3dcc1527360c2
7
+ data.tar.gz: 83716724a828da6cd6a63054fca9b7b1917692aed9796b85d7de9a474a5f81c3e4c87555fac011d546e75d3d28f1b1a95a28332c91f14241b65bd4947084fba9
@@ -0,0 +1,79 @@
1
+ require "faraday"
2
+
3
+ module Urg
4
+ class OneTimeSecret
5
+ def share_secret(secret, passphrase:nil, ttl: nil, notify_email: nil)
6
+ secret_params = {
7
+ secret: secret,
8
+ passphrase: passphrase,
9
+ ttl: ttl.presence || default_secret_ttl,
10
+ recipient: notify_email
11
+ }
12
+
13
+ conn = Faraday.new(
14
+ url: api_url("/share"),
15
+ params: secret_params,
16
+ headers: api_headers
17
+ )
18
+
19
+ resp = conn.post
20
+
21
+ unless resp.success?
22
+ raise "OneTimeSecret share_secret request failed with status #{resp.status}, and body `#{resp.body}`"
23
+ end
24
+
25
+ JSON.parse(resp.body)
26
+ end
27
+
28
+ def fetch_secret(secret_key, passphrase: nil)
29
+ secret_params = {
30
+ passphrase: passphrase
31
+ }
32
+
33
+ conn = Faraday.new(
34
+ url: api_url("/secret/#{secret_key}"),
35
+ params: secret_params,
36
+ headers: api_headers
37
+ )
38
+
39
+ resp = conn.post
40
+
41
+ unless resp.success?
42
+ raise "OneTimeSecret fetch_secret request failed with status #{resp.status}#{' (it\'s possible that the secret has already been consumed)' if resp.status == 404}, and body `#{resp.body}`"
43
+ end
44
+
45
+ JSON.parse(resp.body)
46
+
47
+ end
48
+
49
+ private
50
+
51
+ def default_secret_ttl
52
+ 600 # in seconds => 10 minutes
53
+ end
54
+
55
+ def api_url(path)
56
+ api_base_url + path
57
+ end
58
+
59
+ def api_base_url
60
+ "https://#{[username.sub('@', '%40'), api_key].join(":")}@onetimesecret.com/api/v1"
61
+ end
62
+
63
+ def api_headers
64
+ {
65
+ "Content-Type" => "application/json"
66
+ }
67
+ end
68
+
69
+ def username
70
+ "tech@unreasonablegroup.com"
71
+ end
72
+
73
+ def api_key
74
+ # TODO!
75
+ # ENV["OTS_API_KEY"]
76
+ "8489b3912d38b9d1ba0ab943c28543a44548f909"
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,31 @@
1
+ require "securerandom"
2
+
3
+ module Urg
4
+ class SecureData
5
+ def self.encrypt(plaintext)
6
+ cipher.encrypt
7
+ key = cipher.random_key
8
+ iv = cipher.random_iv
9
+ cyphertext = cipher.update(plaintext) + cipher.final
10
+
11
+ {
12
+ cyphertext: Base64.strict_encode64(cyphertext),
13
+ key: Base64.strict_encode64(key),
14
+ iv: Base64.strict_encode64(iv)
15
+ }
16
+ end
17
+
18
+ def self.decrypt(cyphertext, iv:, key:)
19
+ cipher.decrypt
20
+ cipher.key = Base64.strict_decode64(key)
21
+ cipher.iv = Base64.strict_decode64(iv)
22
+ cipher.update(Base64.strict_decode64(cyphertext)) + cipher.final
23
+ end
24
+
25
+ private
26
+
27
+ def self.cipher
28
+ @cipher ||= OpenSSL::Cipher::AES.new(256, :CBC)
29
+ end
30
+ end
31
+ end
data/lib/urg.rb CHANGED
@@ -3,9 +3,32 @@ require "zlib"
3
3
  require "openssl"
4
4
  require "open-uri"
5
5
 
6
+ require_relative "./one_time_secret"
7
+ require_relative "./secure_data"
8
+
6
9
  module Urg
7
10
  DEFAULT_PUBLIC_KEY_URI = "https://urg-public-keys.s3-us-west-2.amazonaws.com/urg-exfil.pub"
8
11
 
12
+ def self.export(object)
13
+ string = Base64.encode64(Zlib::Deflate.deflate(Marshal.dump(object)))
14
+
15
+ encryption = SecureData.encrypt(string)
16
+
17
+ ots_passphrase = SecureRandom.urlsafe_base64
18
+ ots = OneTimeSecret.new.share_secret(encryption[:cyphertext], passphrase: ots_passphrase)
19
+
20
+ puts (("*" * 25) + "\n") * 1
21
+ puts "Exported. Data will self-destruct in 10 minutes OR after first use, whichever comes first."
22
+ puts "Import data remotely via: Urg.import(ots_key: \"#{ots['secret_key']}\", ots_passphrase: \"#{ots_passphrase}\", decryption_key: \"#{encryption[:key]}\", decryption_iv: \"#{encryption[:iv]}\")"
23
+ puts (("*" * 25) + "\n") * 1
24
+ end
25
+
26
+ def self.import(ots_key:, ots_passphrase:, decryption_key:, decryption_iv:)
27
+ ots = OneTimeSecret.new.fetch_secret(ots_key, passphrase: ots_passphrase)
28
+ plaintext = SecureData.decrypt(ots["value"], iv: decryption_iv, key: decryption_key)
29
+ Marshal.load(Zlib::Inflate.inflate(Base64.decode64(plaintext)))
30
+ end
31
+
9
32
  def self.exfil(object, key: DEFAULT_PUBLIC_KEY_URI)
10
33
  if key
11
34
  public_key_uri = URI.parse(key)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: urg
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lawson Kurtz
@@ -9,13 +9,29 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2019-08-08 00:00:00.000000000 Z
12
- dependencies: []
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.15.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.15.4
13
27
  description: Utils for urg
14
28
  email: lawson.kurtz@gmail.com
15
29
  executables: []
16
30
  extensions: []
17
31
  extra_rdoc_files: []
18
32
  files:
33
+ - lib/one_time_secret.rb
34
+ - lib/secure_data.rb
19
35
  - lib/urg.rb
20
36
  homepage: https://rubygems.org/gems/urg
21
37
  licenses:
@@ -36,8 +52,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
36
52
  - !ruby/object:Gem::Version
37
53
  version: '0'
38
54
  requirements: []
39
- rubyforge_project:
40
- rubygems_version: 2.7.6
55
+ rubygems_version: 3.1.2
41
56
  signing_key:
42
57
  specification_version: 4
43
58
  summary: urg, mostly.