oydid 0.4.3 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/lib/oydid/basic.rb +204 -26
  4. data/lib/oydid/didcomm.rb +25 -6
  5. data/lib/oydid/log.rb +15 -7
  6. data/lib/oydid/vc.rb +264 -0
  7. data/lib/oydid.rb +286 -111
  8. data/spec/input/basic/sample_b16_dec.doc +1 -0
  9. data/spec/input/basic/{sample_enc.doc → sample_b16_enc.doc} +0 -0
  10. data/spec/input/basic/sample_b17_edec.doc +1 -0
  11. data/spec/input/basic/{sample_hash.doc → sample_b17_enc.doc} +0 -0
  12. data/spec/input/basic/sample_b32_dec.doc +1 -0
  13. data/spec/{output/basic/sample_dec.doc → input/basic/sample_b32_enc.doc} +0 -0
  14. data/spec/input/basic/{sample_dec.doc → sample_b58_dec.doc} +0 -0
  15. data/spec/input/basic/sample_b58_enc.doc +1 -0
  16. data/spec/input/basic/sample_b64_dec.doc +1 -0
  17. data/spec/input/basic/sample_b64_enc.doc +1 -0
  18. data/spec/input/basic/sample_blake2b-16_b16_hash.doc +1 -0
  19. data/spec/input/basic/sample_blake2b-32_b32_hash.doc +1 -0
  20. data/spec/input/basic/sample_blake2b-64_b58_hash.doc +1 -0
  21. data/spec/input/basic/sample_invalid2_readkey.doc +1 -1
  22. data/spec/input/basic/sample_invalid3_readkey.doc +1 -1
  23. data/spec/input/basic/sample_readkey.doc +1 -1
  24. data/spec/input/basic/sample_sha2-256_b58_hash.doc +1 -0
  25. data/spec/input/basic/sample_sha2-512_b58_hash.doc +1 -0
  26. data/spec/input/basic/sample_sha3-224_b64_hash.doc +1 -0
  27. data/spec/output/basic/sample_b16_dec.doc +1 -0
  28. data/spec/output/basic/sample_b16_enc.doc +1 -0
  29. data/spec/output/basic/sample_b17_edec.doc +2 -0
  30. data/spec/output/basic/sample_b17_enc.doc +1 -0
  31. data/spec/output/basic/sample_b32_dec.doc +1 -0
  32. data/spec/output/basic/sample_b32_enc.doc +1 -0
  33. data/spec/output/basic/sample_b58_dec.doc +1 -0
  34. data/spec/output/basic/{sample_enc.doc → sample_b58_enc.doc} +0 -0
  35. data/spec/output/basic/sample_b64_dec.doc +1 -0
  36. data/spec/output/basic/sample_b64_enc.doc +1 -0
  37. data/spec/output/basic/sample_blake2b-16_b16_hash.doc +1 -0
  38. data/spec/output/basic/sample_blake2b-32_b32_hash.doc +1 -0
  39. data/spec/output/basic/sample_blake2b-64_b58_hash.doc +1 -0
  40. data/spec/output/basic/{sample_hash.doc → sample_sha2-256_b58_hash.doc} +0 -0
  41. data/spec/output/basic/sample_sha2-512_b58_hash.doc +1 -0
  42. data/spec/output/basic/sample_sha3-224_b64_hash.doc +1 -0
  43. data/spec/oydid_spec.rb +95 -13
  44. metadata +72 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 20d91a8c36a05670346244339ea68ec0288c1550994a421e51d4eeb4c6906234
4
- data.tar.gz: 32722af4d3ab83842ad7cc3428834bccecdf0a987c3cb5c86683c7b5208fabe8
3
+ metadata.gz: 872454b12ba811fdab1ac25967a94f2555b3a3eb5e0b9e33128f671084c1c8ba
4
+ data.tar.gz: ba79bd15b747a1ff8344bb0084184bdd6f810cc4f13dde5e2abda974459d6576
5
5
  SHA512:
6
- metadata.gz: 965132e50470d2423fce55a6f9cef44c34747585c3a46646f4ed1d546f9acfb25058bfe1cff3dcef1cd151e7ed40964f4f5f5cb55943872534c55610fc90ed1f
7
- data.tar.gz: 06e4978da7ae725b69ae07e95fd92638b966c4ae3a111d5a18202739ba4bb0a9496c85f3cd4aae76041958f321d8a3337f94a5774d3df3600287677338442f76
6
+ metadata.gz: 6f365d7a094576d29cf1dc056a6c0ac6ff869b3f7ebe26d99817f439b369f7537caef79f170d1fbe8201eb7d44b36f29f0a0028f858d5ba0bace8de10f6972f6
7
+ data.tar.gz: 6e7425342af56e8bb2139138ad3162a82fc5023af0db7ba8d005abf5231e098df5d9718af1ee144ca4d8100a69c57e448dd5a4c3c20bc10127be317e1e05eff5
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.3
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
- def self.encode(message, method = "base58btc")
8
- Multibases.pack(method, message).to_s
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.decode(message)
12
- Multibases.unpack(message).decode.to_s('ASCII-8BIT')
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
- encode(Multihashes.encode(RbNaCl::Hash.sha256(message), "sha2-256").unpack('C*'))
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)
@@ -25,8 +88,13 @@ class Oydid
25
88
  message.to_json_c14n
26
89
  end
27
90
 
91
+ def self.percent_encode(did)
92
+ # remove "https://" from string as it is default
93
+ did = did.sub("https://","").sub("@", "%40").sub("http://","http%3A%2F%2F").gsub(":","%3A").sub("did%3Aoyd%3A", "did:oyd:")
94
+ end
95
+
28
96
  # key management ----------------------------
29
- def self.generate_private_key(input, method = "ed25519-priv")
97
+ def self.generate_private_key(input, method = "ed25519-priv", options)
30
98
  begin
31
99
  omc = Multicodecs[method].code
32
100
  rescue
@@ -44,26 +112,70 @@ class Oydid
44
112
  return [nil, "unsupported key codec"]
45
113
  end
46
114
  length = raw_key.bytesize
47
- return [encode([omc, length, raw_key].pack("SCa#{length}")), ""]
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
48
121
  end
49
122
 
50
- def self.public_key(private_key)
51
- code, length, digest = decode(private_key).unpack('SCa*')
123
+ def self.public_key(private_key, options, method = "ed25519-pub")
124
+ code, length, digest = multi_decode(private_key).first.unpack('SCa*')
52
125
  case Multicodecs[code].name
53
126
  when 'ed25519-priv'
54
- public_key = Ed25519::SigningKey.new(digest).verify_key
127
+ case method
128
+ when 'ed25519-pub'
129
+ public_key = Ed25519::SigningKey.new(digest).verify_key
130
+ when 'x25519-pub'
131
+ public_key = RbNaCl::PrivateKey.new(digest).public_key
132
+ else
133
+ return [nil, "unsupported key codec"]
134
+ end
55
135
  length = public_key.to_bytes.bytesize
56
- return [encode([Multicodecs['ed25519-pub'].code, length, public_key].pack("CCa#{length}")), ""]
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
57
142
  else
58
143
  return [nil, "unsupported key codec"]
59
144
  end
60
145
  end
61
146
 
62
- def self.sign(message, private_key)
63
- code, length, digest = decode(private_key).unpack('SCa*')
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*')
64
171
  case Multicodecs[code].name
65
172
  when 'ed25519-priv'
66
- return [encode(Ed25519::SigningKey.new(digest).sign(message)), ""]
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
67
179
  else
68
180
  return [nil, "unsupported key codec"]
69
181
  end
@@ -71,13 +183,13 @@ class Oydid
71
183
 
72
184
  def self.verify(message, signature, public_key)
73
185
  begin
74
- code, length, digest = decode(public_key).unpack('CCa*')
186
+ code, length, digest = multi_decode(public_key).first.unpack('CCa*')
75
187
  case Multicodecs[code].name
76
188
  when 'ed25519-pub'
77
189
  verify_key = Ed25519::VerifyKey.new(digest)
78
190
  signature_verification = false
79
191
  begin
80
- verify_key.verify(decode(signature), message)
192
+ verify_key.verify(multi_decode(signature).first, message)
81
193
  signature_verification = true
82
194
  rescue Ed25519::VerifyError
83
195
  signature_verification = false
@@ -91,7 +203,54 @@ class Oydid
91
203
  end
92
204
  end
93
205
 
94
- def self.read_private_key(filename)
206
+ def self.encrypt(message, public_key, options)
207
+ begin
208
+ code, length, digest = multi_decode(public_key).first.unpack('CCa*')
209
+ case Multicodecs[code].name
210
+ when 'x25519-pub'
211
+ pubKey = RbNaCl::PublicKey.new(digest)
212
+ authHash = RbNaCl::Hash.sha256('auth'.dup.force_encoding('ASCII-8BIT'))
213
+ authKey = RbNaCl::PrivateKey.new(authHash)
214
+ box = RbNaCl::Box.new(pubKey, authKey)
215
+ nonce = RbNaCl::Random.random_bytes(box.nonce_bytes)
216
+ msg = message.force_encoding('ASCII-8BIT')
217
+ cipher = box.encrypt(nonce, msg)
218
+ return [
219
+ {
220
+ value: cipher.unpack('H*')[0],
221
+ nonce: nonce.unpack('H*')[0]
222
+ }, ""
223
+ ]
224
+ else
225
+ return [nil, "unsupported key codec"]
226
+ end
227
+ rescue
228
+ return [nil, "encryption failed"]
229
+ end
230
+ end
231
+
232
+ def self.decrypt(message, private_key, options)
233
+ begin
234
+ cipher = [JSON.parse(message)["value"]].pack('H*')
235
+ nonce = [JSON.parse(message)["nonce"]].pack('H*')
236
+ code, length, digest = multi_decode(private_key).first.unpack('SCa*')
237
+ case Multicodecs[code].name
238
+ when 'ed25519-priv'
239
+ privKey = RbNaCl::PrivateKey.new(digest)
240
+ authHash = RbNaCl::Hash.sha256('auth'.dup.force_encoding('ASCII-8BIT'))
241
+ authKey = RbNaCl::PrivateKey.new(authHash).public_key
242
+ box = RbNaCl::Box.new(authKey, privKey)
243
+ retVal = box.decrypt(nonce, cipher)
244
+ return [retVal, ""]
245
+ else
246
+ return [nil, "unsupported key codec"]
247
+ end
248
+ rescue
249
+ return [nil, "decryption failed"]
250
+ end
251
+ end
252
+
253
+ def self.read_private_key(filename, options)
95
254
  begin
96
255
  f = File.open(filename)
97
256
  key_encoded = f.read
@@ -99,12 +258,12 @@ class Oydid
99
258
  rescue
100
259
  return [nil, "cannot read file"]
101
260
  end
102
- decode_private_key(key_encoded)
261
+ decode_private_key(key_encoded, options)
103
262
  end
104
263
 
105
- def self.decode_private_key(key_encoded)
264
+ def self.decode_private_key(key_encoded, options)
106
265
  begin
107
- code, length, digest = decode(key_encoded).unpack('SCa*')
266
+ code, length, digest = multi_decode(key_encoded).first.unpack('SCa*')
108
267
  case Multicodecs[code].name
109
268
  when 'ed25519-priv'
110
269
  private_key = Ed25519::SigningKey.new(digest).to_bytes
@@ -112,12 +271,27 @@ class Oydid
112
271
  return [nil, "unsupported key codec"]
113
272
  end
114
273
  length = private_key.bytesize
115
- return [Oydid.encode([code, length, private_key].pack("SCa#{length}")), ""]
274
+ return multi_encode([code, length, private_key].pack("SCa#{length}"), options)
116
275
  rescue
117
276
  return [nil, "invalid key"]
118
277
  end
119
278
  end
120
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
+
121
295
  # storage functions -----------------------------
122
296
  def self.write_private_storage(payload, filename)
123
297
  File.open(filename, 'w') {|f| f.write(payload)}
@@ -145,7 +319,7 @@ class Oydid
145
319
  end
146
320
  end
147
321
 
148
- def self.retrieve_document(doc_hash, doc_file, doc_location, options)
322
+ def self.retrieve_document(doc_identifier, doc_file, doc_location, options)
149
323
  if doc_location == ""
150
324
  doc_location = DEFAULT_LOCATION
151
325
  end
@@ -154,17 +328,17 @@ class Oydid
154
328
  doc_location = "https://" + doc_location
155
329
  end
156
330
  end
157
-
158
331
  case doc_location
159
332
  when /^http/
160
- retVal = HTTParty.get(doc_location + "/doc/" + doc_hash)
333
+ doc_location = doc_location.sub("%3A%2F%2F","://").sub("%3A", ":")
334
+ retVal = HTTParty.get(doc_location + "/doc/" + doc_identifier)
161
335
  if retVal.code != 200
162
- msg = retVal.parsed_response("error").to_s rescue "invalid response from " + doc_location.to_s + "/doc/" + doc_hash.to_s
336
+ msg = retVal.parsed_response("error").to_s rescue "invalid response from " + doc_location.to_s + "/doc/" + doc_identifier.to_s
163
337
  return [nil, msg]
164
338
  end
165
339
  if options.transform_keys(&:to_s)["trace"]
166
340
  if options[:silent].nil? || !options[:silent]
167
- puts "GET " + doc_hash + " from " + doc_location
341
+ puts "GET " + doc_identifier + " from " + doc_location
168
342
  end
169
343
  end
170
344
  return [retVal.parsed_response, ""]
@@ -179,6 +353,9 @@ class Oydid
179
353
  end
180
354
 
181
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
+
182
359
  if doc_location == ""
183
360
  doc_location = DEFAULT_LOCATION
184
361
  end
@@ -190,6 +367,7 @@ class Oydid
190
367
 
191
368
  case doc_location
192
369
  when /^http/
370
+ doc_location = doc_location.sub("%3A%2F%2F","://").sub("%3A", ":")
193
371
  retVal = HTTParty.get(doc_location + "/doc_raw/" + doc_hash)
194
372
  if retVal.code != 200
195
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 = decode(private_key_encoded).unpack('SCa*')
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 = Oydid.decode(public_key_encoded).unpack('CCa*')
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 = decode(private_key_encoded).unpack('SCa*')
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.decode(public_key_encoded).unpack('CCa*')
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)
@@ -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, options = {})
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 = 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
+ 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
@@ -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"] = hash(canonical(item))
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"] = hash(canonical(i))
12
+ item["sub-entry-hash"] = multi_hash(canonical(i), LOG_HASH_OPTIONS).first
13
13
  end
14
14
  item
15
15
  end
@@ -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
@@ -78,11 +79,14 @@ class Oydid
78
79
  if el["op"].to_i == 0
79
80
  terminate_indices << i
80
81
  end
81
- log_hash << Oydid.hash(Oydid.canonical(el))
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
82
87
  dag_log << dag.add_vertex(id: i)
83
88
  i += 1
84
89
  end unless logs.nil?
85
-
86
90
  if create_entries != 1
87
91
  return [nil, nil, nil, "wrong number of CREATE entries (" + create_entries.to_s + ") in log" ]
88
92
  end
@@ -237,7 +241,11 @@ class Oydid
237
241
  log_location = DEFAULT_LOCATION
238
242
  end
239
243
  term = term.split(LOCATION_PREFIX).first
240
- if hash(canonical(el)) != term
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
241
249
  currentDID["error"] = 1
242
250
  currentDID["message"] = "Log reference and record don't match"
243
251
  if verification_output
@@ -266,7 +274,7 @@ class Oydid
266
274
  if log_el["op"].to_i == 1 # TERMINATE
267
275
  log_el_structure.delete("previous")
268
276
  end
269
- if hash(canonical(log_el_structure)) == revoc_term
277
+ if multi_hash(canonical(log_el_structure), log_options).first == revoc_term
270
278
  revoc_term_found = true
271
279
  revocation_record = log_el.dup
272
280
  if verification_output
@@ -306,7 +314,7 @@ class Oydid
306
314
  update_term_found = false
307
315
  log_array.each do |log_el|
308
316
  if log_el["op"].to_i == 3
309
- if log_el["previous"].include?(hash(canonical(revocation_record)))
317
+ if log_el["previous"].include?(multi_hash(canonical(revocation_record), LOG_HASH_OPTIONS).first)
310
318
  update_term_found = true
311
319
  message = log_el["doc"].to_s
312
320