oydid 0.5.3 → 0.5.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 +4 -4
- data/VERSION +1 -1
- data/lib/oydid/vc.rb +59 -15
- data/lib/oydid.rb +32 -9
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 171ab373123506d42a8dd20b80df654ebd3cf35ac1d53e65f36580b4a3d92374
|
4
|
+
data.tar.gz: 2bab378e7f1d284f7e730f32acb52964f7c84456ae5a41a786429d0f6ff11134
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3d84952f40b4b7680f1c49cb351516b25b901f696f4db73222a3a5f82a645ee23da62881f24237e29cac195da2857f4392ab289ba78d29f83a14332d970ea91
|
7
|
+
data.tar.gz: 555e144d9581d897b91eadd480267c9e76bfed1145077cf524537d13cc571be3efca39512aefdb7ce798390de22fc87ea922ac6e53db3e67dfba8dfa65cedd08
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.4
|
data/lib/oydid/vc.rb
CHANGED
@@ -19,7 +19,7 @@ class Oydid
|
|
19
19
|
exit
|
20
20
|
end
|
21
21
|
|
22
|
-
private_key = options[:
|
22
|
+
private_key = options[:holder_privateKey].to_s rescue nil
|
23
23
|
if private_key.to_s == ""
|
24
24
|
msg = "missing private document key information"
|
25
25
|
return [nil, msg]
|
@@ -69,29 +69,70 @@ class Oydid
|
|
69
69
|
def self.create_vc(content, options)
|
70
70
|
vercred = {}
|
71
71
|
# set the context, which establishes the special terms used
|
72
|
-
|
73
|
-
|
74
|
-
|
72
|
+
if content["@context"].nil?
|
73
|
+
vercred["@context"] = ["https://www.w3.org/ns/credentials/v2"]
|
74
|
+
else
|
75
|
+
vercred["@context"] = content["@context"]
|
76
|
+
end
|
77
|
+
if vercred["@context"].to_s == "" || vercred["@context"].to_s == "{}" || vercred["@context"].to_s == "[]"
|
78
|
+
return [nil, "invalid '@context'"]
|
79
|
+
end
|
80
|
+
if content["type"].nil?
|
81
|
+
vercred["type"] = ["VerifiableCredential"]
|
82
|
+
else
|
83
|
+
vercred["type"] = content["type"]
|
84
|
+
end
|
85
|
+
if vercred["type"].to_s == "" || vercred["type"].to_s == "{}" || vercred["type"].to_s == "[]"
|
86
|
+
return [nil, "invalid 'type'"]
|
87
|
+
end
|
88
|
+
if content["issuer"].nil?
|
89
|
+
vercred["issuer"] = options[:issuer]
|
90
|
+
else
|
91
|
+
vercred["issuer"] = content["issuer"]
|
92
|
+
end
|
93
|
+
if vercred["issuer"].to_s == "" || vercred["issuer"].to_s == "{}" || vercred["issuer"].to_s == "[]"
|
94
|
+
return [nil, "invalid 'issuer'"]
|
95
|
+
end
|
75
96
|
if options[:ts].nil?
|
76
97
|
vercred["issuanceDate"] = Time.now.utc.iso8601
|
77
98
|
else
|
78
99
|
vercred["issuanceDate"] = Time.at(options[:ts]).utc.iso8601
|
79
100
|
end
|
80
|
-
|
101
|
+
if content["credentialSubject"].nil?
|
102
|
+
vercred["credentialSubject"] = {"id": options[:holder]}.merge(content)
|
103
|
+
else
|
104
|
+
vercred["credentialSubject"] = content["credentialSubject"]
|
105
|
+
end
|
106
|
+
if vercred["credentialSubject"].to_s == "" || vercred["credentialSubject"].to_s == "{}" || vercred["credentialSubject"].to_s == "[]"
|
107
|
+
return [nil, "invalid 'credentialSubject'"]
|
108
|
+
end
|
109
|
+
if content["proof"].nil?
|
110
|
+
proof = {}
|
111
|
+
proof["type"] = "Ed25519Signature2020"
|
112
|
+
proof["verificationMethod"] = options[:issuer].to_s
|
113
|
+
proof["proofPurpose"] = "assertionMethod"
|
114
|
+
proof["proofValue"] = sign(vercred["credentialSubject"].to_json_c14n, options[:issuer_privateKey], []).first
|
115
|
+
vercred["proof"] = proof
|
116
|
+
else
|
117
|
+
vercred["proof"] = content["proof"]
|
118
|
+
end
|
119
|
+
if vercred["proof"].to_s == "" || vercred["proof"].to_s == "{}" || vercred["proof"].to_s == "[]"
|
120
|
+
return [nil, "invalid 'proof'"]
|
121
|
+
end
|
81
122
|
|
123
|
+
# specify the identifier of the credential
|
124
|
+
vercred["identifier"] = hash(vercred.to_json)
|
125
|
+
return [vercred, ""]
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.create_vc_proof(content, options)
|
82
129
|
proof = {}
|
83
130
|
proof["type"] = "Ed25519Signature2020"
|
84
131
|
proof["verificationMethod"] = options[:issuer].to_s
|
85
132
|
proof["proofPurpose"] = "assertionMethod"
|
86
|
-
|
87
|
-
# private_key = generate_private_key(options[:issuer_privateKey], "ed25519-priv", []).first
|
88
133
|
proof["proofValue"] = sign(content.to_json_c14n, options[:issuer_privateKey], []).first
|
89
134
|
|
90
|
-
|
91
|
-
|
92
|
-
# specify the identifier of the credential
|
93
|
-
vercred["identifier"] = hash(vercred.to_json)
|
94
|
-
return [vercred, ""]
|
135
|
+
return [proof, ""]
|
95
136
|
end
|
96
137
|
|
97
138
|
def self.publish_vc(vc, options)
|
@@ -101,8 +142,11 @@ class Oydid
|
|
101
142
|
return [nil, "invalid format (missing identifier"]
|
102
143
|
exit
|
103
144
|
end
|
104
|
-
|
105
|
-
|
145
|
+
if vc["credentialSubject"].is_a?(Array)
|
146
|
+
cs = vc["credentialSubject"].last.transform_keys(&:to_s) rescue nil
|
147
|
+
else
|
148
|
+
cs = vc["credentialSubject"].transform_keys(&:to_s) rescue nil
|
149
|
+
end
|
106
150
|
holder = cs["id"] rescue nil
|
107
151
|
if holder.nil?
|
108
152
|
return [nil, "invalid format (missing holder)"]
|
@@ -155,7 +199,7 @@ class Oydid
|
|
155
199
|
def self.create_vp(content, options)
|
156
200
|
verpres = {}
|
157
201
|
# set the context, which establishes the special terms used
|
158
|
-
verpres["@context"] = ["https://www.w3.org/
|
202
|
+
verpres["@context"] = ["https://www.w3.org/ns/credentials/v2"]
|
159
203
|
verpres["type"] = ["VerifiablePresentation"]
|
160
204
|
verpres["verifiableCredential"] = [content].flatten
|
161
205
|
|
data/lib/oydid.rb
CHANGED
@@ -201,7 +201,18 @@ class Oydid
|
|
201
201
|
end
|
202
202
|
end
|
203
203
|
else # mode == "update" => read information
|
204
|
+
# if a location is provided this is only relevant for writing the DID
|
205
|
+
update_location = options[:location]
|
206
|
+
update_doc_location = options[:doc_location]
|
207
|
+
update_log_location = options[:log_location]
|
208
|
+
options[:location] = nil
|
209
|
+
options[:doc_location] = nil
|
210
|
+
options[:log_location] = nil
|
204
211
|
did_info, msg = read(did, options)
|
212
|
+
options[:location] = options[:location]
|
213
|
+
options[:doc_location] = options[:doc_location]
|
214
|
+
options[:log_location] = options[:log_location]
|
215
|
+
|
205
216
|
if did_info.nil?
|
206
217
|
return [nil, nil, nil, "cannot resolve DID (on updating DID)"]
|
207
218
|
end
|
@@ -314,6 +325,13 @@ class Oydid
|
|
314
325
|
pubRevoKey = public_key(revocationKey, options).first
|
315
326
|
did_key = publicKey + ":" + pubRevoKey
|
316
327
|
|
328
|
+
# check if pubKeys matches with existing DID Document
|
329
|
+
if mode == "update"
|
330
|
+
if did_key_old.to_s != did_info["doc"]["key"].to_s
|
331
|
+
return [nil, nil, nil, "keys from original DID don't match"]
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
317
335
|
# build new revocation document
|
318
336
|
subDid = {"doc": did_doc, "key": did_key}.to_json
|
319
337
|
retVal = multi_hash(canonical(subDid), LOG_HASH_OPTIONS)
|
@@ -406,7 +424,6 @@ class Oydid
|
|
406
424
|
:privateKey => privateKey,
|
407
425
|
:revocationKey => revocationKey
|
408
426
|
}
|
409
|
-
|
410
427
|
return [did_doc, did_key, did_log, ""]
|
411
428
|
# return [did, didDocument, revoc_log, l1, l2, r1, privateKey, revocationKey, did_old, log_old, ""]
|
412
429
|
end
|
@@ -455,6 +472,9 @@ class Oydid
|
|
455
472
|
|
456
473
|
def self.write(content, did, mode, options)
|
457
474
|
did_doc, did_key, did_log, msg = generate_base(content, did, mode, options)
|
475
|
+
if msg != ""
|
476
|
+
return [nil, msg]
|
477
|
+
end
|
458
478
|
did = did_doc[:did]
|
459
479
|
didDocument = did_doc[:didDocument]
|
460
480
|
did_old = did_doc[:did_old]
|
@@ -467,9 +487,6 @@ class Oydid
|
|
467
487
|
revocationKey = did_key[:revocationKey]
|
468
488
|
# did, didDocument, revoc_log, l1, l2, r1, privateKey, revocationKey, did_old, log_old, msg = generate_base(content, did, mode, options)
|
469
489
|
|
470
|
-
if msg != ""
|
471
|
-
return [nil, msg]
|
472
|
-
end
|
473
490
|
did_hash = did.delete_prefix("did:oyd:")
|
474
491
|
did10 = did_hash[0,10]
|
475
492
|
did_old_hash = did_old.delete_prefix("did:oyd:") rescue nil
|
@@ -776,11 +793,17 @@ class Oydid
|
|
776
793
|
location = get_location(did_info["did"].to_s)
|
777
794
|
end
|
778
795
|
wd = wd.merge(didDoc["doc"])
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
796
|
+
if wd["service"] != []
|
797
|
+
if wd["service"].is_a?(Array)
|
798
|
+
wdf = wd["service"].first
|
799
|
+
else
|
800
|
+
wdf = wd["service"]
|
801
|
+
end
|
802
|
+
wdf = { "id": did + "#payload",
|
803
|
+
"type": "Custom",
|
804
|
+
"serviceEndpoint": location }.merge(wdf)
|
805
|
+
wd["service"] = [wdf] + wd["service"].drop(1)
|
806
|
+
end
|
784
807
|
else
|
785
808
|
payload = nil
|
786
809
|
if didDoc["doc"].is_a?(Hash)
|
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.5.
|
4
|
+
version: 0.5.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: 2023-
|
11
|
+
date: 2023-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dag
|