File tree 6 files changed +55
-31
lines changed
6 files changed +55
-31
lines changed Original file line number Diff line number Diff line change @@ -54,24 +54,19 @@ public extension DIDCommAgent {
54
54
55
55
let subjectDID = try DID ( string: subjectDIDString)
56
56
57
- let privateKeys = try await pluto. getDIDPrivateKeys ( did: subjectDID) . first ( ) . await ( )
58
-
59
57
guard
60
- let storedPrivateKey = privateKeys ? . first
58
+ let storedPrivateKeys = try await pluto . getDIDPrivateKeys ( did : subjectDID ) . first ( ) . await ( )
61
59
else { throw EdgeAgentError . cannotFindDIDKeyPairIndex }
62
60
63
- let privateKey = try await apollo. restorePrivateKey ( storedPrivateKey)
64
-
65
- guard
66
- let exporting = privateKey. exporting
67
- else { throw EdgeAgentError . cannotFindDIDKeyPairIndex }
61
+ let privateKeys = try await storedPrivateKeys. asyncMap { try await apollo. restorePrivateKey ( $0) }
62
+ let exporting = privateKeys. compactMap ( \. exporting)
68
63
69
64
format
= requestType
== " prism/jwt " ? " prism/jwt " : " dif/presentation-exchange/[email protected] "
70
65
71
66
presentationString = try proofableCredential. presentation (
72
67
request: request. makeMessage ( ) ,
73
68
options: options + [
74
- . exportableKey ( exporting) ,
69
+ . exportableKeys ( exporting) ,
75
70
. subjectDID( subjectDID)
76
71
]
77
72
)
Original file line number Diff line number Diff line change @@ -110,6 +110,28 @@ Could not find key in storage please use Castor instead and provide the private
110
110
] )
111
111
usingKeys. append ( ( . master, usingPrivateKey) )
112
112
}
113
+
114
+ if usingKeys. count == 1 {
115
+ let lastKeyPairIndex = try await pluto
116
+ . getPrismLastKeyPairIndex ( )
117
+ . first ( )
118
+ . await ( )
119
+
120
+ // If the user provided a key path index use it, if not use the last + 1
121
+ let index = keyPathIndex ?? ( lastKeyPairIndex + 1 )
122
+ // Create the key pair
123
+ let usingPrivateKey = try apollo. createPrivateKey ( parameters: [
124
+ KeyProperties . type. rawValue: " EC " ,
125
+ KeyProperties . seed. rawValue: seed. value. base64Encoded ( ) ,
126
+ KeyProperties . curve. rawValue: KnownKeyCurves . secp256k1. rawValue,
127
+ KeyProperties . derivationPath. rawValue: EdgeAgentDerivationPath (
128
+ keyPurpose: . authentication,
129
+ keyIndex: index
130
+ ) . derivationPath. keyPathString ( )
131
+ ] )
132
+ usingKeys. append ( ( . authentication, usingPrivateKey) )
133
+ }
134
+
113
135
let groupedKeys = Dictionary ( grouping: usingKeys, by: { $0. 0 } )
114
136
let finalKeys = groupedKeys. flatMap { ( key, value) in
115
137
value. enumerated ( ) . map {
Original file line number Diff line number Diff line change @@ -53,24 +53,21 @@ public extension EdgeAgent {
53
53
54
54
let subjectDID = try DID ( string: subjectDIDString)
55
55
56
- let privateKeys = try await pluto. getDIDPrivateKeys ( did: subjectDID) . first ( ) . await ( )
57
-
58
56
guard
59
- let storedPrivateKey = privateKeys ? . first
60
- else { throw EdgeAgentError . cannotFindDIDKeyPairIndex }
61
-
62
- let privateKey = try await apollo . restorePrivateKey ( storedPrivateKey )
57
+ let storedPrivateKeys = try await pluto . getDIDPrivateKeys ( did : subjectDID ) . first ( ) . await ( )
58
+ else {
59
+ throw EdgeAgentError . cannotFindDIDKeyPairIndex
60
+ }
63
61
64
- guard
65
- let exporting = privateKey. exporting
66
- else { throw EdgeAgentError . cannotFindDIDKeyPairIndex }
62
+ let privateKeys = try await storedPrivateKeys. asyncMap { try await apollo. restorePrivateKey ( $0) }
63
+ let exporting = privateKeys. compactMap ( \. exporting)
67
64
68
65
format
= requestType
== " prism/jwt " ? " prism/jwt " : " dif/presentation-exchange/[email protected] "
69
66
70
67
presentationString = try proofableCredential. presentation (
71
68
request: request. makeMessage ( ) ,
72
69
options: [
73
- . exportableKey ( exporting) ,
70
+ . exportableKeys ( exporting) ,
74
71
. subjectDID( subjectDID) ,
75
72
. disclosingClaims( claims: credential. claims. map ( \. key) )
76
73
]
Original file line number Diff line number Diff line change @@ -38,7 +38,7 @@ final class PresentationExchangeFlowTests: XCTestCase {
38
38
let credential = try JWTCredential ( data: jwt. tryToData ( ) )
39
39
40
40
logger. info ( " Creating presentation request " )
41
- let message = try await edgeAgent. initiatePresentationRequest (
41
+ let message = try edgeAgent. initiatePresentationRequest (
42
42
type: . jwt,
43
43
fromDID: DID ( method: " test " , methodId: " alice " ) ,
44
44
toDID: DID ( method: " test " , methodId: " bob " ) ,
@@ -108,7 +108,7 @@ final class PresentationExchangeFlowTests: XCTestCase {
108
108
let credential = try SDJWTCredential ( sdjwtString: sdjwt)
109
109
110
110
logger. info ( " Creating presentation request " )
111
- let message = try await edgeAgent. initiatePresentationRequest (
111
+ let message = try edgeAgent. initiatePresentationRequest (
112
112
type: . jwt,
113
113
fromDID: DID ( method: " test " , methodId: " alice " ) ,
114
114
toDID: DID ( method: " test " , methodId: " bob " ) ,
Original file line number Diff line number Diff line change @@ -53,11 +53,16 @@ struct JWTPresentation {
53
53
}
54
54
55
55
guard
56
- let exportableKeyOption = options. first ( where: {
57
- if case . exportableKey = $0 { return true }
56
+ let exportableKeysOption = options. first ( where: {
57
+ if case . exportableKeys = $0 { return true }
58
58
return false
59
59
} ) ,
60
- case let CredentialOperationsOptions . exportableKey( exportableKey) = exportableKeyOption
60
+ case let CredentialOperationsOptions . exportableKeys( exportableKeys) = exportableKeysOption,
61
+ let exportableFirstKey = exportableKeys
62
+ . filter ( {
63
+ $0. jwk. crv? . lowercased ( ) == " secp256k1 "
64
+ && !( $0. jwk. kid? . contains ( " #master " ) ?? true ) // TODO: This is a hardcoded fix, since prism DID doesnt not recognize master key
65
+ } ) . first
61
66
else {
62
67
throw PolluxError . requiresExportableKeyForOperation ( operation: " Create Presentation JWT Credential " )
63
68
}
@@ -68,7 +73,7 @@ struct JWTPresentation {
68
73
credential: credential,
69
74
request: requestData,
70
75
did: did,
71
- exportableKey: exportableKey
76
+ exportableKey: exportableFirstKey
72
77
)
73
78
default :
74
79
let payload = try vcPresentation (
@@ -79,7 +84,7 @@ struct JWTPresentation {
79
84
80
85
return try vcPresentationJWTString (
81
86
payload: payload,
82
- exportableKey: exportableKey
87
+ exportableKey: exportableFirstKey
83
88
)
84
89
}
85
90
}
Original file line number Diff line number Diff line change @@ -12,11 +12,16 @@ struct SDJWTPresentation {
12
12
options: [ CredentialOperationsOptions ]
13
13
) throws -> String {
14
14
guard
15
- let exportableKeyOption = options. first ( where: {
16
- if case . exportableKey = $0 { return true }
15
+ let exportableKeysOption = options. first ( where: {
16
+ if case . exportableKeys = $0 { return true }
17
17
return false
18
18
} ) ,
19
- case let CredentialOperationsOptions . exportableKey( exportableKey) = exportableKeyOption
19
+ case let CredentialOperationsOptions . exportableKeys( exportableKeys) = exportableKeysOption,
20
+ let exportableFirstKey = exportableKeys
21
+ . filter ( {
22
+ $0. jwk. crv? . lowercased ( ) == " secp256k1 "
23
+ && !( $0. jwk. kid? . contains ( " #master " ) ?? true ) // TODO: This is a hardcoded fix, since prism DID doesnt not recognize master key
24
+ } ) . first
20
25
else {
21
26
throw PolluxError . requiresExportableKeyForOperation ( operation: " Create Presentation for SD-JWT Credential " )
22
27
}
@@ -41,14 +46,14 @@ struct SDJWTPresentation {
41
46
credential: credential,
42
47
request: requestData,
43
48
disclosingClaims: disclosingClaims,
44
- key: exportableKey
49
+ key: exportableFirstKey
45
50
)
46
51
default :
47
52
return try vcPresentation (
48
53
credential: credential,
49
54
request: requestData,
50
55
disclosingClaims: disclosingClaims,
51
- key: exportableKey
56
+ key: exportableFirstKey
52
57
)
53
58
}
54
59
}
You can’t perform that action at this time.
0 commit comments