oydid 0.4.4 → 0.5.3
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 +4 -4
- data/VERSION +1 -1
- data/lib/oydid/basic.rb +149 -33
- data/lib/oydid/didcomm.rb +9 -9
- data/lib/oydid/log.rb +14 -7
- data/lib/oydid/vc.rb +264 -0
- data/lib/oydid.rb +283 -113
- data/spec/input/basic/sample_b16_dec.doc +1 -0
- data/spec/input/basic/{sample_enc.doc → sample_b16_enc.doc} +0 -0
- data/spec/input/basic/sample_b17_edec.doc +1 -0
- data/spec/input/basic/{sample_hash.doc → sample_b17_enc.doc} +0 -0
- data/spec/input/basic/sample_b32_dec.doc +1 -0
- data/spec/{output/basic/sample_dec.doc → input/basic/sample_b32_enc.doc} +0 -0
- data/spec/input/basic/{sample_dec.doc → sample_b58_dec.doc} +0 -0
- data/spec/input/basic/sample_b58_enc.doc +1 -0
- data/spec/input/basic/sample_b64_dec.doc +1 -0
- data/spec/input/basic/sample_b64_enc.doc +1 -0
- data/spec/input/basic/sample_blake2b-16_b16_hash.doc +1 -0
- data/spec/input/basic/sample_blake2b-32_b32_hash.doc +1 -0
- data/spec/input/basic/sample_blake2b-64_b58_hash.doc +1 -0
- data/spec/input/basic/sample_invalid2_readkey.doc +1 -1
- data/spec/input/basic/sample_invalid3_readkey.doc +1 -1
- data/spec/input/basic/sample_readkey.doc +1 -1
- data/spec/input/basic/sample_sha2-256_b58_hash.doc +1 -0
- data/spec/input/basic/sample_sha2-512_b58_hash.doc +1 -0
- data/spec/input/basic/sample_sha3-224_b64_hash.doc +1 -0
- data/spec/output/basic/sample_b16_dec.doc +1 -0
- data/spec/output/basic/sample_b16_enc.doc +1 -0
- data/spec/output/basic/sample_b17_edec.doc +2 -0
- data/spec/output/basic/sample_b17_enc.doc +1 -0
- data/spec/output/basic/sample_b32_dec.doc +1 -0
- data/spec/output/basic/sample_b32_enc.doc +1 -0
- data/spec/output/basic/sample_b58_dec.doc +1 -0
- data/spec/output/basic/{sample_enc.doc → sample_b58_enc.doc} +0 -0
- data/spec/output/basic/sample_b64_dec.doc +1 -0
- data/spec/output/basic/sample_b64_enc.doc +1 -0
- data/spec/output/basic/sample_blake2b-16_b16_hash.doc +1 -0
- data/spec/output/basic/sample_blake2b-32_b32_hash.doc +1 -0
- data/spec/output/basic/sample_blake2b-64_b58_hash.doc +1 -0
- data/spec/output/basic/{sample_hash.doc → sample_sha2-256_b58_hash.doc} +0 -0
- data/spec/output/basic/sample_sha2-512_b58_hash.doc +1 -0
- data/spec/output/basic/sample_sha3-224_b64_hash.doc +1 -0
- data/spec/oydid_spec.rb +95 -13
- metadata +72 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 872454b12ba811fdab1ac25967a94f2555b3a3eb5e0b9e33128f671084c1c8ba
|
4
|
+
data.tar.gz: ba79bd15b747a1ff8344bb0084184bdd6f810cc4f13dde5e2abda974459d6576
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f365d7a094576d29cf1dc056a6c0ac6ff869b3f7ebe26d99817f439b369f7537caef79f170d1fbe8201eb7d44b36f29f0a0028f858d5ba0bace8de10f6972f6
|
7
|
+
data.tar.gz: 6e7425342af56e8bb2139138ad3162a82fc5023af0db7ba8d005abf5231e098df5d9718af1ee144ca4d8100a69c57e448dd5a4c3c20bc10127be317e1e05eff5
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.3
|
data/lib/oydid/basic.rb
CHANGED
@@ -4,16 +4,79 @@
|
|
4
4
|
class Oydid
|
5
5
|
|
6
6
|
# basic functions ---------------------------
|
7
|
-
|
8
|
-
|
7
|
+
# %w[multibases multihashes rbnacl json].each { |f| require f }
|
8
|
+
def self.multi_encode(message, options)
|
9
|
+
method = options[:encode] || DEFAULT_ENCODING rescue DEFAULT_ENCODING
|
10
|
+
case method
|
11
|
+
when *SUPPORTED_ENCODINGS
|
12
|
+
return [Multibases.pack(method, message).to_s, ""]
|
13
|
+
else
|
14
|
+
return [nil, "unsupported encoding: '" + method + "'"]
|
15
|
+
end
|
9
16
|
end
|
10
17
|
|
11
|
-
def self.
|
12
|
-
|
18
|
+
def self.multi_decode(message)
|
19
|
+
begin
|
20
|
+
[Multibases.unpack(message).decode.to_s('ASCII-8BIT'), ""]
|
21
|
+
rescue => error
|
22
|
+
[nil, error.message]
|
23
|
+
end
|
13
24
|
end
|
14
25
|
|
15
26
|
def self.hash(message)
|
16
|
-
|
27
|
+
return multi_hash(message, {:digest => DEFAULT_DIGEST}).first
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.multi_hash(message, options)
|
31
|
+
method = options[:digest] || DEFAULT_DIGEST
|
32
|
+
case method.to_s
|
33
|
+
when "sha2-256"
|
34
|
+
digest = RbNaCl::Hash.sha256(message)
|
35
|
+
when "sha2-512"
|
36
|
+
digest = RbNaCl::Hash.sha512(message)
|
37
|
+
when "sha3-224", "sha3-256", "sha3-384", "sha3-512"
|
38
|
+
digest = OpenSSL::Digest.digest(method, message)
|
39
|
+
when "blake2b-16"
|
40
|
+
digest = RbNaCl::Hash.blake2b(message, {digest_size: 16})
|
41
|
+
when "blake2b-32"
|
42
|
+
digest = RbNaCl::Hash.blake2b(message, {digest_size: 32})
|
43
|
+
when "blake2b-64"
|
44
|
+
digest = RbNaCl::Hash.blake2b(message)
|
45
|
+
else
|
46
|
+
return [nil, "unsupported digest: '" + method.to_s + "'"]
|
47
|
+
end
|
48
|
+
encoded = multi_encode(Multihashes.encode(digest, method.to_s), options)
|
49
|
+
if encoded.first.nil?
|
50
|
+
return [nil, encoded.last]
|
51
|
+
else
|
52
|
+
return [encoded.first, ""]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.get_digest(message)
|
57
|
+
retVal = Multihashes.decode Oydid.multi_decode(message).first
|
58
|
+
if retVal[:hash_function].to_s != ""
|
59
|
+
return [retVal[:hash_function].to_s, ""]
|
60
|
+
end
|
61
|
+
case Oydid.multi_decode(message).first[0..1].to_s
|
62
|
+
when "\x02\x10"
|
63
|
+
return ["blake2b-16", ""]
|
64
|
+
when "\x04 "
|
65
|
+
return ["blake2b-32", ""]
|
66
|
+
when "\b@"
|
67
|
+
return ["blake2b-64", ""]
|
68
|
+
else
|
69
|
+
return [nil, "unknown digest"]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.get_encoding(message)
|
74
|
+
# from https://github.com/multiformats/multibase/blob/master/multibase.csv
|
75
|
+
begin
|
76
|
+
[Multibases.unpack(message).encoding, ""]
|
77
|
+
rescue => error
|
78
|
+
[nil, error.message]
|
79
|
+
end
|
17
80
|
end
|
18
81
|
|
19
82
|
def self.canonical(message)
|
@@ -27,11 +90,11 @@ class Oydid
|
|
27
90
|
|
28
91
|
def self.percent_encode(did)
|
29
92
|
# remove "https://" from string as it is default
|
30
|
-
did = did.sub("https://","").sub("@", "%40").sub("http://","http%3A%2F%2F")
|
93
|
+
did = did.sub("https://","").sub("@", "%40").sub("http://","http%3A%2F%2F").gsub(":","%3A").sub("did%3Aoyd%3A", "did:oyd:")
|
31
94
|
end
|
32
95
|
|
33
96
|
# key management ----------------------------
|
34
|
-
def self.generate_private_key(input, method = "ed25519-priv")
|
97
|
+
def self.generate_private_key(input, method = "ed25519-priv", options)
|
35
98
|
begin
|
36
99
|
omc = Multicodecs[method].code
|
37
100
|
rescue
|
@@ -49,11 +112,16 @@ class Oydid
|
|
49
112
|
return [nil, "unsupported key codec"]
|
50
113
|
end
|
51
114
|
length = raw_key.bytesize
|
52
|
-
|
115
|
+
encoded = multi_encode([omc, length, raw_key].pack("SCa#{length}"), options)
|
116
|
+
if encoded.first.nil?
|
117
|
+
return [nil, encoded.last]
|
118
|
+
else
|
119
|
+
return [encoded.first, ""]
|
120
|
+
end
|
53
121
|
end
|
54
122
|
|
55
|
-
def self.public_key(private_key, method = "ed25519-pub")
|
56
|
-
code, length, digest =
|
123
|
+
def self.public_key(private_key, options, method = "ed25519-pub")
|
124
|
+
code, length, digest = multi_decode(private_key).first.unpack('SCa*')
|
57
125
|
case Multicodecs[code].name
|
58
126
|
when 'ed25519-priv'
|
59
127
|
case method
|
@@ -65,18 +133,49 @@ class Oydid
|
|
65
133
|
return [nil, "unsupported key codec"]
|
66
134
|
end
|
67
135
|
length = public_key.to_bytes.bytesize
|
68
|
-
|
69
|
-
|
136
|
+
encoded = multi_encode([Multicodecs[method].code, length, public_key].pack("CCa#{length}"), options)
|
137
|
+
if encoded.first.nil?
|
138
|
+
return [nil, encoded.last]
|
139
|
+
else
|
140
|
+
return [encoded.first, ""]
|
141
|
+
end
|
70
142
|
else
|
71
143
|
return [nil, "unsupported key codec"]
|
72
144
|
end
|
73
145
|
end
|
74
146
|
|
75
|
-
def self.
|
76
|
-
|
147
|
+
def self.getPubKeyFromDID(did)
|
148
|
+
identifier = did.split(LOCATION_PREFIX).first.split(CGI.escape LOCATION_PREFIX).first rescue did
|
149
|
+
identifier = identifier.delete_prefix("did:oyd:")
|
150
|
+
|
151
|
+
# check if identifier is already PubKey
|
152
|
+
if decode_public_key(identifier).first.nil?
|
153
|
+
did_document, msg = read(did, {})
|
154
|
+
if did_document.nil?
|
155
|
+
return [nil, msg]
|
156
|
+
exit
|
157
|
+
end
|
158
|
+
pubKey = did_document["doc"]["key"].split(":").first rescue nil
|
159
|
+
if pubKey.nil?
|
160
|
+
return [nil, "cannot resolve " + did.to_s]
|
161
|
+
else
|
162
|
+
return [pubKey, ""]
|
163
|
+
end
|
164
|
+
else
|
165
|
+
return [identifier, ""]
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def self.sign(message, private_key, options)
|
170
|
+
code, length, digest = multi_decode(private_key).first.unpack('SCa*')
|
77
171
|
case Multicodecs[code].name
|
78
172
|
when 'ed25519-priv'
|
79
|
-
|
173
|
+
encoded = multi_encode(Ed25519::SigningKey.new(digest).sign(message), options)
|
174
|
+
if encoded.first.nil?
|
175
|
+
return [nil, encoded.last]
|
176
|
+
else
|
177
|
+
return [encoded.first, ""]
|
178
|
+
end
|
80
179
|
else
|
81
180
|
return [nil, "unsupported key codec"]
|
82
181
|
end
|
@@ -84,13 +183,13 @@ class Oydid
|
|
84
183
|
|
85
184
|
def self.verify(message, signature, public_key)
|
86
185
|
begin
|
87
|
-
code, length, digest =
|
186
|
+
code, length, digest = multi_decode(public_key).first.unpack('CCa*')
|
88
187
|
case Multicodecs[code].name
|
89
188
|
when 'ed25519-pub'
|
90
189
|
verify_key = Ed25519::VerifyKey.new(digest)
|
91
190
|
signature_verification = false
|
92
191
|
begin
|
93
|
-
verify_key.verify(
|
192
|
+
verify_key.verify(multi_decode(signature).first, message)
|
94
193
|
signature_verification = true
|
95
194
|
rescue Ed25519::VerifyError
|
96
195
|
signature_verification = false
|
@@ -104,9 +203,9 @@ class Oydid
|
|
104
203
|
end
|
105
204
|
end
|
106
205
|
|
107
|
-
def self.encrypt(message, public_key)
|
206
|
+
def self.encrypt(message, public_key, options)
|
108
207
|
begin
|
109
|
-
code, length, digest =
|
208
|
+
code, length, digest = multi_decode(public_key).first.unpack('CCa*')
|
110
209
|
case Multicodecs[code].name
|
111
210
|
when 'x25519-pub'
|
112
211
|
pubKey = RbNaCl::PublicKey.new(digest)
|
@@ -130,11 +229,11 @@ class Oydid
|
|
130
229
|
end
|
131
230
|
end
|
132
231
|
|
133
|
-
def self.decrypt(message, private_key)
|
232
|
+
def self.decrypt(message, private_key, options)
|
134
233
|
begin
|
135
234
|
cipher = [JSON.parse(message)["value"]].pack('H*')
|
136
235
|
nonce = [JSON.parse(message)["nonce"]].pack('H*')
|
137
|
-
code, length, digest =
|
236
|
+
code, length, digest = multi_decode(private_key).first.unpack('SCa*')
|
138
237
|
case Multicodecs[code].name
|
139
238
|
when 'ed25519-priv'
|
140
239
|
privKey = RbNaCl::PrivateKey.new(digest)
|
@@ -151,7 +250,7 @@ class Oydid
|
|
151
250
|
end
|
152
251
|
end
|
153
252
|
|
154
|
-
def self.read_private_key(filename)
|
253
|
+
def self.read_private_key(filename, options)
|
155
254
|
begin
|
156
255
|
f = File.open(filename)
|
157
256
|
key_encoded = f.read
|
@@ -159,12 +258,12 @@ class Oydid
|
|
159
258
|
rescue
|
160
259
|
return [nil, "cannot read file"]
|
161
260
|
end
|
162
|
-
decode_private_key(key_encoded)
|
261
|
+
decode_private_key(key_encoded, options)
|
163
262
|
end
|
164
263
|
|
165
|
-
def self.decode_private_key(key_encoded)
|
264
|
+
def self.decode_private_key(key_encoded, options)
|
166
265
|
begin
|
167
|
-
code, length, digest =
|
266
|
+
code, length, digest = multi_decode(key_encoded).first.unpack('SCa*')
|
168
267
|
case Multicodecs[code].name
|
169
268
|
when 'ed25519-priv'
|
170
269
|
private_key = Ed25519::SigningKey.new(digest).to_bytes
|
@@ -172,12 +271,27 @@ class Oydid
|
|
172
271
|
return [nil, "unsupported key codec"]
|
173
272
|
end
|
174
273
|
length = private_key.bytesize
|
175
|
-
return
|
274
|
+
return multi_encode([code, length, private_key].pack("SCa#{length}"), options)
|
176
275
|
rescue
|
177
276
|
return [nil, "invalid key"]
|
178
277
|
end
|
179
278
|
end
|
180
279
|
|
280
|
+
def self.decode_public_key(key_encoded)
|
281
|
+
begin
|
282
|
+
code, length, digest = multi_decode(key_encoded).first.unpack('CCa*')
|
283
|
+
case Multicodecs[code].name
|
284
|
+
when 'ed25519-pub'
|
285
|
+
verify_key = Ed25519::VerifyKey.new(digest)
|
286
|
+
return [verify_key, ""]
|
287
|
+
else
|
288
|
+
return [nil, "unsupported key codec"]
|
289
|
+
end
|
290
|
+
rescue
|
291
|
+
return [nil, "unknown key codec"]
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
181
295
|
# storage functions -----------------------------
|
182
296
|
def self.write_private_storage(payload, filename)
|
183
297
|
File.open(filename, 'w') {|f| f.write(payload)}
|
@@ -205,7 +319,7 @@ class Oydid
|
|
205
319
|
end
|
206
320
|
end
|
207
321
|
|
208
|
-
def self.retrieve_document(
|
322
|
+
def self.retrieve_document(doc_identifier, doc_file, doc_location, options)
|
209
323
|
if doc_location == ""
|
210
324
|
doc_location = DEFAULT_LOCATION
|
211
325
|
end
|
@@ -214,18 +328,17 @@ class Oydid
|
|
214
328
|
doc_location = "https://" + doc_location
|
215
329
|
end
|
216
330
|
end
|
217
|
-
|
218
331
|
case doc_location
|
219
332
|
when /^http/
|
220
|
-
doc_location = doc_location.sub("%3A%2F%2F","://")
|
221
|
-
retVal = HTTParty.get(doc_location + "/doc/" +
|
333
|
+
doc_location = doc_location.sub("%3A%2F%2F","://").sub("%3A", ":")
|
334
|
+
retVal = HTTParty.get(doc_location + "/doc/" + doc_identifier)
|
222
335
|
if retVal.code != 200
|
223
|
-
msg = retVal.parsed_response("error").to_s rescue "invalid response from " + doc_location.to_s + "/doc/" +
|
336
|
+
msg = retVal.parsed_response("error").to_s rescue "invalid response from " + doc_location.to_s + "/doc/" + doc_identifier.to_s
|
224
337
|
return [nil, msg]
|
225
338
|
end
|
226
339
|
if options.transform_keys(&:to_s)["trace"]
|
227
340
|
if options[:silent].nil? || !options[:silent]
|
228
|
-
puts "GET " +
|
341
|
+
puts "GET " + doc_identifier + " from " + doc_location
|
229
342
|
end
|
230
343
|
end
|
231
344
|
return [retVal.parsed_response, ""]
|
@@ -240,6 +353,9 @@ class Oydid
|
|
240
353
|
end
|
241
354
|
|
242
355
|
def self.retrieve_document_raw(doc_hash, doc_file, doc_location, options)
|
356
|
+
doc_hash = doc_hash.split(LOCATION_PREFIX).first.split(CGI.escape LOCATION_PREFIX).first rescue doc_hash
|
357
|
+
doc_hash = doc_hash.delete_prefix("did:oyd:")
|
358
|
+
|
243
359
|
if doc_location == ""
|
244
360
|
doc_location = DEFAULT_LOCATION
|
245
361
|
end
|
@@ -251,7 +367,7 @@ class Oydid
|
|
251
367
|
|
252
368
|
case doc_location
|
253
369
|
when /^http/
|
254
|
-
doc_location = doc_location.sub("%3A%2F%2F","://")
|
370
|
+
doc_location = doc_location.sub("%3A%2F%2F","://").sub("%3A", ":")
|
255
371
|
retVal = HTTParty.get(doc_location + "/doc_raw/" + doc_hash)
|
256
372
|
if retVal.code != 200
|
257
373
|
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
@@ -21,7 +21,7 @@ class Oydid
|
|
21
21
|
# DIDComm Signed Message --------------------
|
22
22
|
def self.dcsm(payload, private_key_encoded, options)
|
23
23
|
error = ""
|
24
|
-
code, length, digest =
|
24
|
+
code, length, digest = multi_decode(private_key_encoded).first.unpack('SCa*')
|
25
25
|
case Multicodecs[code].name
|
26
26
|
when 'ed25519-priv'
|
27
27
|
private_key = RbNaCl::Signatures::Ed25519::SigningKey.new(digest)
|
@@ -40,7 +40,7 @@ class Oydid
|
|
40
40
|
result, msg = Oydid.read(pubkey_did, options)
|
41
41
|
public_key_encoded = Oydid.w3c(result, options)["authentication"].first["publicKeyMultibase"]
|
42
42
|
begin
|
43
|
-
code, length, digest =
|
43
|
+
code, length, digest = multi_decode(public_key_encoded).first.unpack('CCa*')
|
44
44
|
case Multicodecs[code].name
|
45
45
|
when 'ed25519-pub'
|
46
46
|
public_key = RbNaCl::Signatures::Ed25519::VerifyKey.new(digest)
|
@@ -56,9 +56,9 @@ class Oydid
|
|
56
56
|
end
|
57
57
|
|
58
58
|
# encryption -----------------------------------
|
59
|
-
def self.msg_encrypt(payload, private_key_encoded, did)
|
59
|
+
def self.msg_encrypt(payload, private_key_encoded, did, options)
|
60
60
|
error = ""
|
61
|
-
code, length, digest =
|
61
|
+
code, length, digest = multi_decode(private_key_encoded).first.unpack('SCa*')
|
62
62
|
case Multicodecs[code].name
|
63
63
|
when 'ed25519-priv'
|
64
64
|
private_key = RbNaCl::Signatures::Ed25519::SigningKey.new(digest)
|
@@ -70,9 +70,9 @@ class Oydid
|
|
70
70
|
return [token, error]
|
71
71
|
end
|
72
72
|
|
73
|
-
def self.msg_decrypt(token, public_key_encoded)
|
73
|
+
def self.msg_decrypt(token, public_key_encoded, options)
|
74
74
|
error = ""
|
75
|
-
code, length, digest = Oydid.
|
75
|
+
code, length, digest = Oydid.multi_decode(public_key_encoded).first.unpack('CCa*')
|
76
76
|
case Multicodecs[code].name
|
77
77
|
when 'ed25519-pub'
|
78
78
|
public_key = RbNaCl::Signatures::Ed25519::VerifyKey.new(digest)
|
@@ -100,14 +100,14 @@ class Oydid
|
|
100
100
|
end
|
101
101
|
|
102
102
|
# DID Auth for data container with challenge ---
|
103
|
-
def self.token_from_challenge(host, pwd)
|
103
|
+
def self.token_from_challenge(host, pwd, options = {})
|
104
104
|
sid = SecureRandom.hex(20).to_s
|
105
105
|
retVal = HTTParty.post(host + "/oydid/init",
|
106
106
|
headers: { 'Content-Type' => 'application/json' },
|
107
107
|
body: { "session_id": sid }.to_json )
|
108
108
|
challenge = retVal.parsed_response["challenge"]
|
109
|
-
signed_challenge =
|
110
|
-
public_key =
|
109
|
+
signed_challenge = sign(challenge, Oydid.generate_private_key(pwd, options).first, options).first
|
110
|
+
public_key = public_key(generate_private_key(pwd, options).first, options).first
|
111
111
|
retVal = HTTParty.post(host + "/oydid/token",
|
112
112
|
headers: { 'Content-Type' => 'application/json' },
|
113
113
|
body: {
|
data/lib/oydid/log.rb
CHANGED
@@ -7,9 +7,9 @@ class Oydid
|
|
7
7
|
log.map do |item|
|
8
8
|
i = item.dup
|
9
9
|
i.delete("previous")
|
10
|
-
item["entry-hash"] =
|
10
|
+
item["entry-hash"] = multi_hash(canonical(item), LOG_HASH_OPTIONS).first
|
11
11
|
if item.transform_keys(&:to_s)["op"] == 1
|
12
|
-
item["sub-entry-hash"] =
|
12
|
+
item["sub-entry-hash"] = multi_hash(canonical(i), LOG_HASH_OPTIONS).first
|
13
13
|
end
|
14
14
|
item
|
15
15
|
end
|
@@ -79,11 +79,14 @@ class Oydid
|
|
79
79
|
if el["op"].to_i == 0
|
80
80
|
terminate_indices << i
|
81
81
|
end
|
82
|
-
|
82
|
+
log_options = options.dup
|
83
|
+
el_hash = el["doc"].split(LOCATION_PREFIX).first.split(CGI.escape LOCATION_PREFIX).first
|
84
|
+
log_options[:digest] = Oydid.get_digest(el_hash).first
|
85
|
+
log_options[:encode] = Oydid.get_encoding(el_hash).first
|
86
|
+
log_hash << Oydid.multi_hash(Oydid.canonical(el), LOG_HASH_OPTIONS).first
|
83
87
|
dag_log << dag.add_vertex(id: i)
|
84
88
|
i += 1
|
85
89
|
end unless logs.nil?
|
86
|
-
|
87
90
|
if create_entries != 1
|
88
91
|
return [nil, nil, nil, "wrong number of CREATE entries (" + create_entries.to_s + ") in log" ]
|
89
92
|
end
|
@@ -238,7 +241,11 @@ class Oydid
|
|
238
241
|
log_location = DEFAULT_LOCATION
|
239
242
|
end
|
240
243
|
term = term.split(LOCATION_PREFIX).first
|
241
|
-
|
244
|
+
log_options = options.dup
|
245
|
+
el_hash = el["doc"].split(LOCATION_PREFIX).first.split(CGI.escape LOCATION_PREFIX).first
|
246
|
+
log_options[:digest] = Oydid.get_digest(el_hash).first
|
247
|
+
log_options[:encode] = Oydid.get_encoding(el_hash).first
|
248
|
+
if multi_hash(canonical(el), log_options).first != term
|
242
249
|
currentDID["error"] = 1
|
243
250
|
currentDID["message"] = "Log reference and record don't match"
|
244
251
|
if verification_output
|
@@ -267,7 +274,7 @@ class Oydid
|
|
267
274
|
if log_el["op"].to_i == 1 # TERMINATE
|
268
275
|
log_el_structure.delete("previous")
|
269
276
|
end
|
270
|
-
if
|
277
|
+
if multi_hash(canonical(log_el_structure), log_options).first == revoc_term
|
271
278
|
revoc_term_found = true
|
272
279
|
revocation_record = log_el.dup
|
273
280
|
if verification_output
|
@@ -307,7 +314,7 @@ class Oydid
|
|
307
314
|
update_term_found = false
|
308
315
|
log_array.each do |log_el|
|
309
316
|
if log_el["op"].to_i == 3
|
310
|
-
if log_el["previous"].include?(
|
317
|
+
if log_el["previous"].include?(multi_hash(canonical(revocation_record), LOG_HASH_OPTIONS).first)
|
311
318
|
update_term_found = true
|
312
319
|
message = log_el["doc"].to_s
|
313
320
|
|