oydid 0.4.3 → 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.
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