oydid 0.4.3 → 0.4.4

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: 20d91a8c36a05670346244339ea68ec0288c1550994a421e51d4eeb4c6906234
4
- data.tar.gz: 32722af4d3ab83842ad7cc3428834bccecdf0a987c3cb5c86683c7b5208fabe8
3
+ metadata.gz: 56c65853f4983bcb8214a4027986839c0503adcc1133933f817d8401d8881be7
4
+ data.tar.gz: 2a6048ab2023f8641e83e7b0162a8c15ef6bdb2c0855d70cef8d6c015ca34720
5
5
  SHA512:
6
- metadata.gz: 965132e50470d2423fce55a6f9cef44c34747585c3a46646f4ed1d546f9acfb25058bfe1cff3dcef1cd151e7ed40964f4f5f5cb55943872534c55610fc90ed1f
7
- data.tar.gz: 06e4978da7ae725b69ae07e95fd92638b966c4ae3a111d5a18202739ba4bb0a9496c85f3cd4aae76041958f321d8a3337f94a5774d3df3600287677338442f76
6
+ metadata.gz: 799e94f77486d60beb09c8b8f5101ac5789eb1d000052a1aa396121acbd13e0a935cb06fe0c1849ef4deb75b407da049d1111bd15f0d49bd2863671419da4480
7
+ data.tar.gz: d513c74e0b307a74a9c7fced1bd3ce5bdaef1941290a70aef447a183e3e31da5c44582d25969cd401ec25379412fb7850d55e5e547972e87ee39e4297e79866c
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.3
1
+ 0.4.4
data/lib/oydid/basic.rb CHANGED
@@ -25,6 +25,11 @@ class Oydid
25
25
  message.to_json_c14n
26
26
  end
27
27
 
28
+ def self.percent_encode(did)
29
+ # remove "https://" from string as it is default
30
+ did = did.sub("https://","").sub("@", "%40").sub("http://","http%3A%2F%2F")
31
+ end
32
+
28
33
  # key management ----------------------------
29
34
  def self.generate_private_key(input, method = "ed25519-priv")
30
35
  begin
@@ -47,13 +52,21 @@ class Oydid
47
52
  return [encode([omc, length, raw_key].pack("SCa#{length}")), ""]
48
53
  end
49
54
 
50
- def self.public_key(private_key)
55
+ def self.public_key(private_key, method = "ed25519-pub")
51
56
  code, length, digest = decode(private_key).unpack('SCa*')
52
57
  case Multicodecs[code].name
53
58
  when 'ed25519-priv'
54
- public_key = Ed25519::SigningKey.new(digest).verify_key
59
+ case method
60
+ when 'ed25519-pub'
61
+ public_key = Ed25519::SigningKey.new(digest).verify_key
62
+ when 'x25519-pub'
63
+ public_key = RbNaCl::PrivateKey.new(digest).public_key
64
+ else
65
+ return [nil, "unsupported key codec"]
66
+ end
55
67
  length = public_key.to_bytes.bytesize
56
- return [encode([Multicodecs['ed25519-pub'].code, length, public_key].pack("CCa#{length}")), ""]
68
+ return [encode([Multicodecs[method].code, length, public_key].pack("CCa#{length}")), ""]
69
+
57
70
  else
58
71
  return [nil, "unsupported key codec"]
59
72
  end
@@ -91,6 +104,53 @@ class Oydid
91
104
  end
92
105
  end
93
106
 
107
+ def self.encrypt(message, public_key)
108
+ begin
109
+ code, length, digest = decode(public_key).unpack('CCa*')
110
+ case Multicodecs[code].name
111
+ when 'x25519-pub'
112
+ pubKey = RbNaCl::PublicKey.new(digest)
113
+ authHash = RbNaCl::Hash.sha256('auth'.dup.force_encoding('ASCII-8BIT'))
114
+ authKey = RbNaCl::PrivateKey.new(authHash)
115
+ box = RbNaCl::Box.new(pubKey, authKey)
116
+ nonce = RbNaCl::Random.random_bytes(box.nonce_bytes)
117
+ msg = message.force_encoding('ASCII-8BIT')
118
+ cipher = box.encrypt(nonce, msg)
119
+ return [
120
+ {
121
+ value: cipher.unpack('H*')[0],
122
+ nonce: nonce.unpack('H*')[0]
123
+ }, ""
124
+ ]
125
+ else
126
+ return [nil, "unsupported key codec"]
127
+ end
128
+ rescue
129
+ return [nil, "encryption failed"]
130
+ end
131
+ end
132
+
133
+ def self.decrypt(message, private_key)
134
+ begin
135
+ cipher = [JSON.parse(message)["value"]].pack('H*')
136
+ nonce = [JSON.parse(message)["nonce"]].pack('H*')
137
+ code, length, digest = decode(private_key).unpack('SCa*')
138
+ case Multicodecs[code].name
139
+ when 'ed25519-priv'
140
+ privKey = RbNaCl::PrivateKey.new(digest)
141
+ authHash = RbNaCl::Hash.sha256('auth'.dup.force_encoding('ASCII-8BIT'))
142
+ authKey = RbNaCl::PrivateKey.new(authHash).public_key
143
+ box = RbNaCl::Box.new(authKey, privKey)
144
+ retVal = box.decrypt(nonce, cipher)
145
+ return [retVal, ""]
146
+ else
147
+ return [nil, "unsupported key codec"]
148
+ end
149
+ rescue
150
+ return [nil, "decryption failed"]
151
+ end
152
+ end
153
+
94
154
  def self.read_private_key(filename)
95
155
  begin
96
156
  f = File.open(filename)
@@ -157,6 +217,7 @@ class Oydid
157
217
 
158
218
  case doc_location
159
219
  when /^http/
220
+ doc_location = doc_location.sub("%3A%2F%2F","://")
160
221
  retVal = HTTParty.get(doc_location + "/doc/" + doc_hash)
161
222
  if retVal.code != 200
162
223
  msg = retVal.parsed_response("error").to_s rescue "invalid response from " + doc_location.to_s + "/doc/" + doc_hash.to_s
@@ -190,6 +251,7 @@ class Oydid
190
251
 
191
252
  case doc_location
192
253
  when /^http/
254
+ doc_location = doc_location.sub("%3A%2F%2F","://")
193
255
  retVal = HTTParty.get(doc_location + "/doc_raw/" + doc_hash)
194
256
  if retVal.code != 200
195
257
  msg = retVal.parsed_response("error").to_s rescue "invalid response from " + doc_location.to_s + "/doc/" + doc_hash.to_s
data/lib/oydid/didcomm.rb CHANGED
@@ -98,4 +98,23 @@ class Oydid
98
98
  return [nil, "verification failed"]
99
99
  end
100
100
  end
101
+
102
+ # DID Auth for data container with challenge ---
103
+ def self.token_from_challenge(host, pwd)
104
+ sid = SecureRandom.hex(20).to_s
105
+ retVal = HTTParty.post(host + "/oydid/init",
106
+ headers: { 'Content-Type' => 'application/json' },
107
+ body: { "session_id": sid }.to_json )
108
+ challenge = retVal.parsed_response["challenge"]
109
+ signed_challenge = Oydid.sign(challenge, Oydid.generate_private_key(pwd).first).first
110
+ public_key = Oydid.public_key(Oydid.generate_private_key(pwd).first).first
111
+ retVal = HTTParty.post(host + "/oydid/token",
112
+ headers: { 'Content-Type' => 'application/json' },
113
+ body: {
114
+ "session_id": sid,
115
+ "signed_challenge": signed_challenge,
116
+ "public_key": public_key
117
+ }.to_json)
118
+ return retVal.parsed_response["access_token"]
119
+ end
101
120
  end
data/lib/oydid/log.rb CHANGED
@@ -37,6 +37,7 @@ class Oydid
37
37
 
38
38
  case log_location
39
39
  when /^http/
40
+ log_location = log_location.sub("%3A%2F%2F","://")
40
41
  retVal = HTTParty.get(log_location + "/log/" + did_hash)
41
42
  if retVal.code != 200
42
43
  msg = retVal.parsed_response("error").to_s rescue
data/lib/oydid.rb CHANGED
@@ -139,6 +139,11 @@ class Oydid
139
139
  return write(content, did, "update", options)
140
140
  end
141
141
 
142
+ def self.simulate_did(content, did, mode, options)
143
+ user_did, didDocument, revoc_log, l1, l2, r1, privateKey, revocationKey, did_old, log_old, msg = Oydid.generate_base(content, did, mode, options)
144
+ return [user_did, msg]
145
+ end
146
+
142
147
  def self.generate_base(content, did, mode, options)
143
148
  # input validation
144
149
  did_doc = JSON.parse(content.to_json) rescue nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oydid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christoph Fabianek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-29 00:00:00.000000000 Z
11
+ date: 2022-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dag