Skip to content

Commit ce16774

Browse files
fix: presentation now selects the proper key
1 parent a6494c6 commit ce16774

File tree

6 files changed

+55
-31
lines changed

6 files changed

+55
-31
lines changed

EdgeAgentSDK/EdgeAgent/Sources/DIDCommAgent/DIDCommAgent+Proof.swift

+4-9
Original file line numberDiff line numberDiff line change
@@ -54,24 +54,19 @@ public extension DIDCommAgent {
5454

5555
let subjectDID = try DID(string: subjectDIDString)
5656

57-
let privateKeys = try await pluto.getDIDPrivateKeys(did: subjectDID).first().await()
58-
5957
guard
60-
let storedPrivateKey = privateKeys?.first
58+
let storedPrivateKeys = try await pluto.getDIDPrivateKeys(did: subjectDID).first().await()
6159
else { throw EdgeAgentError.cannotFindDIDKeyPairIndex }
6260

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)
6863

6964
format = requestType == "prism/jwt" ? "prism/jwt" : "dif/presentation-exchange/[email protected]"
7065

7166
presentationString = try proofableCredential.presentation(
7267
request: request.makeMessage(),
7368
options: options + [
74-
.exportableKey(exporting),
69+
.exportableKeys(exporting),
7570
.subjectDID(subjectDID)
7671
]
7772
)

EdgeAgentSDK/EdgeAgent/Sources/EdgeAgent+DIDHigherFucntions.swift

+22
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,28 @@ Could not find key in storage please use Castor instead and provide the private
110110
])
111111
usingKeys.append((.master, usingPrivateKey))
112112
}
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+
113135
let groupedKeys = Dictionary(grouping: usingKeys, by: { $0.0 })
114136
let finalKeys = groupedKeys.flatMap { (key, value) in
115137
value.enumerated().map {

EdgeAgentSDK/EdgeAgent/Sources/EdgeAgent+Proof.swift

+7-10
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,21 @@ public extension EdgeAgent {
5353

5454
let subjectDID = try DID(string: subjectDIDString)
5555

56-
let privateKeys = try await pluto.getDIDPrivateKeys(did: subjectDID).first().await()
57-
5856
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+
}
6361

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)
6764

6865
format = requestType == "prism/jwt" ? "prism/jwt" : "dif/presentation-exchange/[email protected]"
6966

7067
presentationString = try proofableCredential.presentation(
7168
request: request.makeMessage(),
7269
options: [
73-
.exportableKey(exporting),
70+
.exportableKeys(exporting),
7471
.subjectDID(subjectDID),
7572
.disclosingClaims(claims: credential.claims.map(\.key))
7673
]

EdgeAgentSDK/EdgeAgent/Tests/PresentationExchangeTests.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ final class PresentationExchangeFlowTests: XCTestCase {
3838
let credential = try JWTCredential(data: jwt.tryToData())
3939

4040
logger.info("Creating presentation request")
41-
let message = try await edgeAgent.initiatePresentationRequest(
41+
let message = try edgeAgent.initiatePresentationRequest(
4242
type: .jwt,
4343
fromDID: DID(method: "test", methodId: "alice"),
4444
toDID: DID(method: "test", methodId: "bob"),
@@ -108,7 +108,7 @@ final class PresentationExchangeFlowTests: XCTestCase {
108108
let credential = try SDJWTCredential(sdjwtString: sdjwt)
109109

110110
logger.info("Creating presentation request")
111-
let message = try await edgeAgent.initiatePresentationRequest(
111+
let message = try edgeAgent.initiatePresentationRequest(
112112
type: .jwt,
113113
fromDID: DID(method: "test", methodId: "alice"),
114114
toDID: DID(method: "test", methodId: "bob"),

EdgeAgentSDK/Pollux/Sources/Models/JWT/JWTPresentation.swift

+10-5
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,16 @@ struct JWTPresentation {
5353
}
5454

5555
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 }
5858
return false
5959
}),
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
6166
else {
6267
throw PolluxError.requiresExportableKeyForOperation(operation: "Create Presentation JWT Credential")
6368
}
@@ -68,7 +73,7 @@ struct JWTPresentation {
6873
credential: credential,
6974
request: requestData,
7075
did: did,
71-
exportableKey: exportableKey
76+
exportableKey: exportableFirstKey
7277
)
7378
default:
7479
let payload = try vcPresentation(
@@ -79,7 +84,7 @@ struct JWTPresentation {
7984

8085
return try vcPresentationJWTString(
8186
payload: payload,
82-
exportableKey: exportableKey
87+
exportableKey: exportableFirstKey
8388
)
8489
}
8590
}

EdgeAgentSDK/Pollux/Sources/Models/SDJWT/SDJWTPresentation.swift

+10-5
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,16 @@ struct SDJWTPresentation {
1212
options: [CredentialOperationsOptions]
1313
) throws -> String{
1414
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 }
1717
return false
1818
}),
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
2025
else {
2126
throw PolluxError.requiresExportableKeyForOperation(operation: "Create Presentation for SD-JWT Credential")
2227
}
@@ -41,14 +46,14 @@ struct SDJWTPresentation {
4146
credential: credential,
4247
request: requestData,
4348
disclosingClaims: disclosingClaims,
44-
key: exportableKey
49+
key: exportableFirstKey
4550
)
4651
default:
4752
return try vcPresentation(
4853
credential: credential,
4954
request: requestData,
5055
disclosingClaims: disclosingClaims,
51-
key: exportableKey
56+
key: exportableFirstKey
5257
)
5358
}
5459
}

0 commit comments

Comments
 (0)