Skip to content

Commit d55b511

Browse files
feat(sample): Forth batch of sample app code
1 parent b79e11f commit d55b511

File tree

62 files changed

+836
-303
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+836
-303
lines changed

Apollo/Sources/ApolloImpl+Public.swift

+22
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Domain
22
import Foundation
3+
import SwiftJWT
34

45
extension ApolloImpl: Apollo {
56
public func createRandomMnemonics() -> [String] {
@@ -94,4 +95,25 @@ returns random mnemonics nerver returns invalid mnemonics
9495
else { throw CommonError.somethingWentWrongError }
9596
return jsonString
9697
}
98+
99+
public func verifyJWT(jwk: String, publicKey: PublicKey) throws -> String {
100+
switch publicKey.curve {
101+
case "secp256k1":
102+
let verifier = JWTVerifier.es256(publicKey: publicKey.value)
103+
let decoder = JWTDecoder.init(jwtVerifier: verifier)
104+
let jwt = try decoder.decode(JWT<MyClaims>.self, fromString: jwk)
105+
return jwk
106+
default:
107+
let verifier = JWTVerifier.none
108+
let decoder = JWTDecoder.init(jwtVerifier: verifier)
109+
let jwt = try decoder.decode(JWT<MyClaims>.self, fromString: jwk)
110+
return jwk
111+
}
112+
}
113+
}
114+
115+
struct MyClaims: Claims {
116+
let iss: String
117+
let sub: String
118+
let exp: Date
97119
}

Builders/Sources/PolluxBuilder.swift

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import Pollux
2+
import Domain
3+
4+
public struct PolluxBuilder {
5+
let castor: Castor
6+
7+
public init(castor: Castor) {
8+
self.castor = castor
9+
}
10+
11+
public func build() -> Pollux {
12+
PolluxImpl(castor: castor)
13+
}
14+
}

Castor/Tests/PeerDIDCreationTests.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,12 @@ final class PeerDIDCreationTests: XCTestCase {
6262
let mypeerDID = DID(
6363
schema: "did",
6464
method: "peer",
65-
methodId: "2.Ez6LSfuJvTtcmcFrjNYYSAuD32tMZWQUD2HYDfXrJqy3ui6MQ.Vz6MkoPyvuxAecSezqmL4ERE7eW2XPbiUEHRH9aqay6LA8Eqr.SeyJ0IjoiZG0iLCJzIjoiaHR0cDovL2hvc3QuZG9ja2VyLmludGVybmFsOjgwL2RpZGNvbW0vIiwiciI6W10sImEiOlsiZGlkY29tbS92MiJdfQ"
65+
methodId: "2.Ez6LSms555YhFthn1WV8ciDBpZm86hK9tp83WojJUmxPGk1hZ.Vz6MkmdBjMyB4TS5UbbQw54szm8yvMMf1ftGV2sQVYAxaeWhE.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL21lZGlhdG9yLnJvb3RzaWQuY2xvdWQiLCJhIjpbImRpZGNvbW0vdjIiXX0"
6666
)
6767

6868
let apollo = ApolloImpl()
6969
let castor = CastorImpl(apollo: apollo)
7070
let document = try await castor.resolveDID(did: mypeerDID)
71+
print(document)
7172
}
7273
}

Core/Sources/Helpers/First+AsyncAwait.swift

+9
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,12 @@ public extension Publishers.First where Failure == Error {
1212
throw Publishers.MissingOutputError()
1313
}
1414
}
15+
16+
public extension Publishers.FirstWhere where Failure == Error {
17+
func await() async throws -> Output {
18+
for try await output in values {
19+
return output
20+
}
21+
throw Publishers.MissingOutputError()
22+
}
23+
}

Domain/Sources/BBs/Pollux.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Foundation
22

33
public protocol Pollux {
4-
func parseVerifiableCredential(jsonString: String) throws -> VerifiableCredential
4+
func parseVerifiableCredential(jwtString: String) throws -> VerifiableCredential
55
}

Domain/Sources/Logging.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,5 @@ public enum LogComponent: String {
3737
case mercury
3838
case pluto
3939
case pollux
40-
case experiences
40+
case prismAgent
4141
}

Domain/Sources/Models/Errors.swift

+1
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,5 @@ public enum PlutoError: Error {
4646

4747
public enum PolluxError: Error {
4848
case invalidCredentialError
49+
case invalidJWTString
4950
}

Domain/Sources/Models/JWTVerifiableCredential+Codable.swift

+6-6
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ extension JWTCredentialPayload.JWTVerfiableCredential: Codable {
1414

1515
public func encode(to encoder: Encoder) throws {
1616
var container = encoder.container(keyedBy: CodingKeys.self)
17-
try container.encode(self.context, forKey: .context)
17+
try? container.encode(self.context, forKey: .context)
1818
if self.type.count != 1 {
1919
try container.encode(self.type, forKey: .type)
2020
} else if let value = self.type.first {
@@ -30,14 +30,14 @@ extension JWTCredentialPayload.JWTVerfiableCredential: Codable {
3030

3131
public init(from decoder: Decoder) throws {
3232
let container = try decoder.container(keyedBy: CodingKeys.self)
33-
let context = try container.decode(Set<String>.self, forKey: .context)
33+
let context = (try? container.decode(Set<String>.self, forKey: .context)) ?? Set<String>()
3434
let type: Set<String>
3535
if let value = try? container.decode(String.self, forKey: .type) {
3636
type = Set([value])
3737
} else {
38-
type = try container.decode(Set<String>.self, forKey: .type)
38+
type = (try? container.decode(Set<String>.self, forKey: .type)) ?? Set<String>()
3939
}
40-
let credentialSubject = try container.decode(String.self, forKey: .credentialSubject)
40+
let credentialSubject = try container.decode([String: String].self, forKey: .credentialSubject)
4141
let credentialStatus = try? container.decode(
4242
VerifiableCredentialTypeContainer.self,
4343
forKey: .credentialStatus
@@ -107,10 +107,10 @@ extension JWTCredentialPayload: Codable {
107107
Date.self,
108108
forKey: .exp
109109
)
110-
let jti = try container.decode(
110+
let jti = (try? container.decode(
111111
String.self,
112112
forKey: .jti
113-
)
113+
)) ?? ""
114114
let aud = (try? container.decode(
115115
Set<String>.self,
116116
forKey: .aud

Domain/Sources/Models/JWTVerifiableCredential.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public struct JWTCredentialPayload {
55
public let context: Set<String>
66
public let type: Set<String>
77
public let credentialSchema: VerifiableCredentialTypeContainer?
8-
public let credentialSubject: String
8+
public let credentialSubject: [String: String]
99
public let credentialStatus: VerifiableCredentialTypeContainer?
1010
public let refreshService: VerifiableCredentialTypeContainer?
1111
public let evidence: VerifiableCredentialTypeContainer?
@@ -15,7 +15,7 @@ public struct JWTCredentialPayload {
1515
context: Set<String> = Set(),
1616
type: Set<String> = Set(),
1717
credentialSchema: VerifiableCredentialTypeContainer? = nil,
18-
credentialSubject: String,
18+
credentialSubject: [String: String],
1919
credentialStatus: VerifiableCredentialTypeContainer? = nil,
2020
refreshService: VerifiableCredentialTypeContainer? = nil,
2121
evidence: VerifiableCredentialTypeContainer? = nil,
@@ -67,7 +67,7 @@ extension JWTCredentialPayload: VerifiableCredential {
6767
public var issuanceDate: Date { nbf }
6868
public var expirationDate: Date? { exp }
6969
public var credentialSchema: VerifiableCredentialTypeContainer? { verifiableCredential.credentialSchema }
70-
public var credentialSubject: String { verifiableCredential.credentialSubject }
70+
public var credentialSubject: [String: String] { verifiableCredential.credentialSubject }
7171
public var credentialStatus: VerifiableCredentialTypeContainer? { verifiableCredential.credentialStatus }
7272
public var refreshService: VerifiableCredentialTypeContainer? { verifiableCredential.refreshService }
7373
public var evidence: Domain.VerifiableCredentialTypeContainer? { verifiableCredential.evidence }

Domain/Sources/Models/VerifiableCredential.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public protocol VerifiableCredential {
3737
var issuanceDate: Date { get }
3838
var expirationDate: Date? { get }
3939
var credentialSchema: VerifiableCredentialTypeContainer? { get }
40-
var credentialSubject: String { get }
40+
var credentialSubject: [String: String] { get }
4141
var credentialStatus: VerifiableCredentialTypeContainer? { get }
4242
var refreshService: VerifiableCredentialTypeContainer? { get }
4343
var evidence: VerifiableCredentialTypeContainer? { get }

Domain/Sources/Models/W3CVerifiableCredential+Codable.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ extension W3CVerifiableCredential: Codable {
6262
let validUntil = try? container.decode(VerifiableCredentialTypeContainer.self, forKey: .validUntil)
6363
let proof = try? container.decode(String.self, forKey: .proof)
6464
let aud = (try? container.decode(Set<String>.self, forKey: .proof)) ?? Set()
65-
let credentialSubject = try container.decode(String.self, forKey: .credentialSubject)
65+
let credentialSubject = try container.decode([String: String].self, forKey: .credentialSubject)
6666
let credentialStatus = try? container.decode(
6767
VerifiableCredentialTypeContainer.self,
6868
forKey: .credentialStatus

Domain/Sources/Models/W3CVerifiableCredential.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public struct W3CVerifiableCredential: VerifiableCredential {
99
public let issuanceDate: Date
1010
public let expirationDate: Date?
1111
public let credentialSchema: VerifiableCredentialTypeContainer?
12-
public let credentialSubject: String
12+
public let credentialSubject: [String: String]
1313
public let credentialStatus: VerifiableCredentialTypeContainer?
1414
public let refreshService: VerifiableCredentialTypeContainer?
1515
public let evidence: VerifiableCredentialTypeContainer?
@@ -27,7 +27,7 @@ public struct W3CVerifiableCredential: VerifiableCredential {
2727
issuanceDate: Date,
2828
expirationDate: Date? = nil,
2929
credentialSchema: VerifiableCredentialTypeContainer? = nil,
30-
credentialSubject: String,
30+
credentialSubject: [String: String],
3131
credentialStatus: VerifiableCredentialTypeContainer? = nil,
3232
refreshService: VerifiableCredentialTypeContainer? = nil,
3333
evidence: VerifiableCredentialTypeContainer? = nil,

Mercury/Sources/DIDCommWrappers/DIDCommSecretsResolverWrapper.swift

+6
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ extension DIDCommSecretsResolverWrapper: SecretsResolver {
7070
.map { $0.first { $0.id == secretid } }
7171
.sink {
7272
do {
73+
if $0 == nil {
74+
print("Secret not found: \(secretid)")
75+
}
7376
try cb.success(result: $0.map { DIDCommxSwift.Secret(from: $0) })
7477
} catch {
7578
print(error.localizedDescription)
@@ -92,6 +95,9 @@ extension DIDCommSecretsResolverWrapper: SecretsResolver {
9295
}
9396
.sink {
9497
do {
98+
if $0.isEmpty {
99+
print("Secrets not found: \(secretids)")
100+
}
95101
try cb.success(result: $0)
96102
} catch {
97103
print(error.localizedDescription)

Mercury/Sources/DIDCommWrappers/PackEncryptedOperation.swift

+6-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ final class PackEncryptedOperation: OnPackEncryptedResult {
2727
case .finished:
2828
break
2929
case let .failure(error):
30+
print("Error packing message type:\(msg.piuri)")
31+
print("Error packing message from:\(fromDID.string)")
32+
print("Error packing message to:\(toDID.string)")
3033
continuation.resume(throwing: error)
3134
}
3235
}, receiveValue: {
@@ -41,8 +44,8 @@ final class PackEncryptedOperation: OnPackEncryptedResult {
4144
signBy: nil,
4245
options: .init(
4346
protectSender: false,
44-
forward: true,
45-
forwardHeaders: [:],
47+
forward: false,
48+
forwardHeaders: nil,
4649
messagingService: nil,
4750
encAlgAuth: .a256cbcHs512Ecdh1puA256kw,
4851
encAlgAnon: .xc20pEcdhEsA256kw
@@ -68,6 +71,7 @@ final class PackEncryptedOperation: OnPackEncryptedResult {
6871
}
6972

7073
func error(err: DIDCommxSwift.ErrorKind, msg: String) {
74+
print("Error packing message: \(msg)")
7175
published.send(completion: .failure(MercuryError.didcommError(msg: msg)))
7276
}
7377
}

Mercury/Sources/Helpers/Session.swift

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ struct SessionManager {
3434
let (data, response) = try await session.data(for: request)
3535
if let urlResponse = response as? HTTPURLResponse {
3636
guard 200...299 ~= urlResponse.statusCode else {
37+
print("HTTP Error: \(urlResponse.statusCode)")
3738
throw MercuryError.urlSessionError(
3839
statusCode: urlResponse.statusCode,
3940
error: nil,

Mercury/Sources/MercuryImpl+Public.swift

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,17 @@ extension MercuryImpl: Mercury {
1313
}
1414

1515
public func sendMessage(msg: Domain.Message) async throws -> Data? {
16+
print("Preparing message of type: \(msg.piuri)")
17+
print("From: \(msg.from?.string)")
18+
print("to: \(msg.to?.string)")
1619
guard let toDID = msg.to else { throw MercuryError.noDIDReceiverSetError }
1720
let document = try await castor.resolveDID(did: toDID)
1821
guard
1922
let urlString = document.services.first?.serviceEndpoint.uri,
2023
let url = URL(string: urlString)
2124
else { throw MercuryError.noValidServiceFoundError }
2225
let packedMessage = try await packMessage(msg: msg)
23-
26+
print("Sending message of type: \(msg.piuri)")
2427
return try await session.post(
2528
url: url,
2629
body: packedMessage.data(using: .utf8),
@@ -33,6 +36,6 @@ extension MercuryImpl: Mercury {
3336
let msgData = try await sendMessage(msg: msg),
3437
let msgStr = String(data: msgData, encoding: .utf8)
3538
else { return nil }
36-
return try await self.unpackMessage(msg: msgStr)
39+
return try? await self.unpackMessage(msg: msgStr)
3740
}
3841
}

Mercury/Sources/MercuryImpl.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public struct MercuryImpl {
1111

1212
public init(
1313
session: URLSession = .shared,
14-
timeout: TimeInterval = 30,
14+
timeout: TimeInterval = 999,
1515
apollo: Apollo,
1616
castor: Castor,
1717
pluto: Pluto

Package.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ let package = Package(
5555
.package(url: "https://github.com/antlr/antlr4", branch: "master"),
5656
.package(url: "https://github.com/input-output-hk/atala-prism-didcomm-swift", from: "0.3.4"),
5757
.package(url: "https://github.com/input-output-hk/atala-prism-crypto-sdk-sp", from: "1.4.1"),
58-
.package(url: "https://github.com/swift-libp2p/swift-multibase", branch: "main")
58+
.package(url: "https://github.com/swift-libp2p/swift-multibase", branch: "main"),
59+
.package(url:"https://github.com/IBM-Swift/Swift-JWT", from: "4.0.0")
5960
],
6061
targets: [
6162
.target(
@@ -72,7 +73,8 @@ let package = Package(
7273
dependencies: [
7374
"Domain",
7475
"Core",
75-
.product(name: "PrismAPI", package: "atala-prism-crypto-sdk-sp")
76+
.product(name: "PrismAPI", package: "atala-prism-crypto-sdk-sp"),
77+
.product(name: "SwiftJWT", package: "Swift-JWT")
7678
],
7779
path: "Apollo/Sources"
7880
),

Pluto/Sources/PersistentStorage/DAO/CDVerifiableCredentialDAO+VerifiableCredentialProvider.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import Domain
55
extension CDVerifiableCredentialDAO: VerifiableCredentialProvider {
66
func getAll() -> AnyPublisher<[VerifiableCredential], Error> {
77
fetchController(context: readContext)
8-
.tryMap { try $0.map { try $0.toDomain() } }
8+
.tryMap {
9+
try $0.map { try $0.toDomain() }
10+
}
911
.eraseToAnyPublisher()
1012
}
1113

@@ -24,7 +26,7 @@ extension CDVerifiableCredentialDAO: VerifiableCredentialProvider {
2426

2527
extension CDVerifiableCredential {
2628
func toDomain() throws -> VerifiableCredential {
27-
switch self.credentialId {
29+
switch self.credentialType {
2830
case "jwt":
2931
return try JSONDecoder()
3032
.decode(JWTCredentialPayload.self, from: self.verifiableCredetialJson)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import CoreData
2+
import Foundation
3+
4+
@objc(CDIssueCredentialProtocol)
5+
class CDIssueCredentialProtocol: NSManagedObject {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import CoreData
2+
import Foundation
3+
4+
extension CDIssueCredentialProtocol {
5+
@nonobjc class func createFetchRequest() -> NSFetchRequest<CDIssueCredentialProtocol> {
6+
return NSFetchRequest<CDIssueCredentialProtocol>(entityName: "CDIssueCredentialProtocol")
7+
}
8+
9+
@NSManaged var protocolId: String
10+
@NSManaged var threadId: String?
11+
@NSManaged var credential: CDVerifiableCredential?
12+
@NSManaged var issue: CDMessage?
13+
@NSManaged var offer: CDMessage?
14+
@NSManaged var propose: CDMessage?
15+
@NSManaged var request: CDMessage?
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import CoreData
2+
import Foundation
3+
4+
@objc(CDProofProtocol)
5+
class CDProofProtocol: NSManagedObject {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import CoreData
2+
import Foundation
3+
4+
extension CDProofProtocol {
5+
@nonobjc class func createFetchRequest() -> NSFetchRequest<CDProofProtocol> {
6+
return NSFetchRequest<CDProofProtocol>(entityName: "CDProofProtocol")
7+
}
8+
9+
@NSManaged var protocolId: String
10+
@NSManaged var threadId: String?
11+
@NSManaged var presentation: CDMessage?
12+
@NSManaged var propose: CDMessage?
13+
@NSManaged var request: CDMessage?
14+
}

0 commit comments

Comments
 (0)