diff --git a/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/credentialstatus/controller/http/StatusListCredential.scala b/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/credentialstatus/controller/http/StatusListCredential.scala index 8d59f50530..7627d75bb1 100644 --- a/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/credentialstatus/controller/http/StatusListCredential.scala +++ b/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/credentialstatus/controller/http/StatusListCredential.scala @@ -22,7 +22,7 @@ case class StatusListCredential( `type`: Set[String], @description(annotations.issuer.description) @encodedExample(annotations.issuer.example) - issuer: Either[String, CredentialIssuer], + issuer: String | CredentialIssuer, @description(annotations.id.description) @encodedExample(annotations.id.example) id: String, @@ -156,11 +156,18 @@ object StatusListCredential { given credentialIssuerDecoder: JsonDecoder[CredentialIssuer] = DeriveJsonDecoder.gen[CredentialIssuer] - given eitherStringOrCredentialIssuerEncoder: JsonEncoder[Either[String, CredentialIssuer]] = - JsonEncoder[String].orElseEither(JsonEncoder[CredentialIssuer]) + given stringOrCredentialIssuerEncoder: JsonEncoder[String | CredentialIssuer] = + JsonEncoder[String] + .orElseEither(JsonEncoder[CredentialIssuer]) + .contramap[String | CredentialIssuer] { + case string: String => Left(string) + case credentialIssuer: CredentialIssuer => Right(credentialIssuer) + } - given eitherStringOrCredentialIssuerDecoder: JsonDecoder[Either[String, CredentialIssuer]] = - JsonDecoder[CredentialIssuer].map(Right(_)).orElse(JsonDecoder[String].map(Left(_))) + given stringOrCredentialIssuerDecoder: JsonDecoder[String | CredentialIssuer] = + JsonDecoder[CredentialIssuer] + .map(issuer => issuer: String | CredentialIssuer) + .orElse(JsonDecoder[String].map(schemaId => schemaId: String | CredentialIssuer)) given statusListCredentialEncoder: JsonEncoder[StatusListCredential] = DeriveJsonEncoder.gen[StatusListCredential] @@ -180,6 +187,16 @@ object StatusListCredential { given credentialIssuerSchema: Schema[CredentialIssuer] = Schema.derived + given schemaIssuer: Schema[String | CredentialIssuer] = Schema + .schemaForEither(Schema.schemaForString, Schema.derived[CredentialIssuer]) + .map[String | CredentialIssuer] { + case Left(string) => Some(string) + case Right(credentialIssuer) => Some(credentialIssuer) + } { + case string: String => Left(string) + case credentialIssuer: CredentialIssuer => Right(credentialIssuer) + } + given statusListCredentialSchema: Schema[StatusListCredential] = Schema.derived } diff --git a/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/oid4vci/service/OIDCCredentialIssuerService.scala b/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/oid4vci/service/OIDCCredentialIssuerService.scala index 839f1a4d8e..d57bb12493 100644 --- a/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/oid4vci/service/OIDCCredentialIssuerService.scala +++ b/cloud-agent/service/server/src/main/scala/org/hyperledger/identus/oid4vci/service/OIDCCredentialIssuerService.scala @@ -199,7 +199,7 @@ case class OIDCCredentialIssuerServiceImpl( `type` = Set( "VerifiableCredential" ) ++ credentialDefinition.`type`, // TODO: This information should come from Schema registry by record.schemaId - issuer = Left(issuerDid.toString), + issuer = issuerDid.toString, issuanceDate = Instant.now(), maybeExpirationDate = None, // TODO: Add expiration date maybeCredentialSchema = None, // TODO: Add schema from schema registry diff --git a/cloud-agent/service/server/src/test/scala/org/hyperledger/identus/verification/controller/VcVerificationControllerImplSpec.scala b/cloud-agent/service/server/src/test/scala/org/hyperledger/identus/verification/controller/VcVerificationControllerImplSpec.scala index b2e0fcf012..210390472c 100644 --- a/cloud-agent/service/server/src/test/scala/org/hyperledger/identus/verification/controller/VcVerificationControllerImplSpec.scala +++ b/cloud-agent/service/server/src/test/scala/org/hyperledger/identus/verification/controller/VcVerificationControllerImplSpec.scala @@ -36,7 +36,7 @@ object VcVerificationControllerImplSpec extends ZIOSpecDefault with VcVerificati `@context` = Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), diff --git a/pollux/core/src/main/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImpl.scala b/pollux/core/src/main/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImpl.scala index ec86a7fa87..cfb7c3c04e 100644 --- a/pollux/core/src/main/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImpl.scala +++ b/pollux/core/src/main/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImpl.scala @@ -1140,7 +1140,7 @@ class CredentialServiceImpl( maybeId = None, `type` = Set("VerifiableCredential"), // TODO: This information should come from Schema registry by record.schemaId - issuer = Right(CredentialIssuer(jwtIssuer.did.toString, `type` = "Profile")), + issuer = CredentialIssuer(jwtIssuer.did.toString, `type` = "Profile"), issuanceDate = issuanceDate, maybeExpirationDate = record.validityPeriod.map(sec => issuanceDate.plusSeconds(sec.toLong)), maybeCredentialSchema = record.schemaUri.map(id => diff --git a/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImplSpec.scala b/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImplSpec.scala index a63890f44a..32711c1445 100644 --- a/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImplSpec.scala +++ b/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/CredentialServiceImplSpec.scala @@ -538,11 +538,9 @@ object CredentialServiceImplSpec extends MockSpecDefault with CredentialServiceS _ <- holderSvc.receiveCredentialIssue(issueCredential) } yield assertTrue( decodedJWT.issuer == - Right( - CredentialIssuer( - id = decodedJWT.iss, - `type` = "Profile" - ) + CredentialIssuer( + id = decodedJWT.iss, + `type` = "Profile" ) ) }.provideSomeLayer( diff --git a/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/verification/VcVerificationServiceImplSpec.scala b/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/verification/VcVerificationServiceImplSpec.scala index 62be6e2e87..e7e5c01f35 100644 --- a/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/verification/VcVerificationServiceImplSpec.scala +++ b/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/verification/VcVerificationServiceImplSpec.scala @@ -27,7 +27,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), @@ -94,7 +94,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), @@ -161,7 +161,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), @@ -228,7 +228,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), @@ -302,7 +302,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), @@ -373,7 +373,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), @@ -444,7 +444,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), @@ -524,7 +524,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), @@ -605,7 +605,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), @@ -673,7 +673,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), @@ -741,7 +741,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), @@ -809,7 +809,7 @@ object VcVerificationServiceImplSpec extends ZIOSpecDefault with VcVerificationS Set("https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"), maybeId = Some("http://example.edu/credentials/3732"), `type` = Set("VerifiableCredential", "UniversityDegreeCredential"), - issuer = Left(issuer.did.toString), + issuer = issuer.did.toString, issuanceDate = Instant.parse("2010-01-01T00:00:00Z"), maybeExpirationDate = Some(Instant.parse("2010-01-12T00:00:00Z")), maybeValidFrom = Some(Instant.parse("2010-01-12T00:00:00Z")), diff --git a/pollux/prex/src/test/scala/org/hyperledger/identus/pollux/prex/PresentationSubmissionVerificationSpec.scala b/pollux/prex/src/test/scala/org/hyperledger/identus/pollux/prex/PresentationSubmissionVerificationSpec.scala index 60b025826e..90f1c40507 100644 --- a/pollux/prex/src/test/scala/org/hyperledger/identus/pollux/prex/PresentationSubmissionVerificationSpec.scala +++ b/pollux/prex/src/test/scala/org/hyperledger/identus/pollux/prex/PresentationSubmissionVerificationSpec.scala @@ -74,7 +74,7 @@ object PresentationSubmissionVerificationSpec extends ZIOSpecDefault { maybeTermsOfUse = None, maybeValidFrom = None, maybeValidUntil = None, - maybeIssuer = Some(Left(iss)) + maybeIssuer = Some(iss) ), nbf = jwtCredentialNbf, aud = Set.empty, diff --git a/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/VerifiableCredentialPayload.scala b/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/VerifiableCredentialPayload.scala index cb7d84dd0b..4cb35fb17f 100644 --- a/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/VerifiableCredentialPayload.scala +++ b/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/VerifiableCredentialPayload.scala @@ -77,7 +77,7 @@ sealed trait CredentialPayload { def maybeValidUntil: Option[Instant] - def issuer: Either[String, CredentialIssuer] + def issuer: String | CredentialIssuer def maybeCredentialStatus: Option[CredentialStatus] @@ -93,7 +93,10 @@ sealed trait CredentialPayload { def toJwtCredentialPayload: JwtCredentialPayload = JwtCredentialPayload( - iss = issuer.fold(identity, _.id), + iss = issuer match { + case string: String => string + case credentialIssuer: CredentialIssuer => credentialIssuer.id + }, maybeSub = maybeSub, vc = JwtVc( `@context` = `@context`, @@ -141,7 +144,7 @@ case class JwtVc( credentialSubject: Json, maybeValidFrom: Option[Instant], maybeValidUntil: Option[Instant], - maybeIssuer: Option[Either[String, CredentialIssuer]], + maybeIssuer: Option[String | CredentialIssuer], maybeCredentialStatus: Option[CredentialStatus], maybeRefreshService: Option[RefreshService], maybeEvidence: Option[Json], @@ -167,14 +170,14 @@ case class JwtCredentialPayload( override val credentialSubject = vc.credentialSubject override val maybeValidFrom = vc.maybeValidFrom override val maybeValidUntil = vc.maybeValidUntil - override val issuer = vc.maybeIssuer.getOrElse(Left(iss)) + override val issuer = vc.maybeIssuer.getOrElse(iss) } case class W3cCredentialPayload( override val `@context`: Set[String], override val `type`: Set[String], maybeId: Option[String], - issuer: Either[String, CredentialIssuer], + issuer: String | CredentialIssuer, issuanceDate: Instant, maybeExpirationDate: Option[Instant], override val maybeCredentialSchema: Option[Either[CredentialSchema, List[CredentialSchema]]], @@ -236,9 +239,9 @@ object CredentialPayload { ("statusListCredential", credentialStatus.statusListCredential.asJson) ) - implicit val eitherStringOrCredentialIssuerEncoder: Encoder[Either[String, CredentialIssuer]] = { - case Left(value) => Json.fromString(value) - case Right(issuer) => issuer.asJson + implicit val stringOrCredentialIssuerEncoder: Encoder[String | CredentialIssuer] = Encoder.instance { + case string: String => Encoder[String].apply(string) + case credentialIssuer: CredentialIssuer => Encoder[CredentialIssuer].apply(credentialIssuer) } implicit val eitherCredentialSchemaOrListEncoder: Encoder[Either[CredentialSchema, List[CredentialSchema]]] = { @@ -370,8 +373,10 @@ object CredentialPayload { ) } - implicit val eitherStringOrCredentialIssuerDecoder: Decoder[Either[String, CredentialIssuer]] = - Decoder[String].map(Left(_)).or(Decoder[CredentialIssuer].map(Right(_))) + implicit val stringOrCredentialIssuerDecoder: Decoder[String | CredentialIssuer] = + Decoder[String] + .map(schema => schema: String | CredentialIssuer) + .or(Decoder[CredentialIssuer].map(schema => schema: String | CredentialIssuer)) implicit val eitherCredentialSchemaOrListDecoder: Decoder[Either[CredentialSchema, List[CredentialSchema]]] = Decoder[CredentialSchema] @@ -390,7 +395,7 @@ object CredentialPayload { .as[Set[String]] .orElse(c.downField("type").as[String].map(Set(_))) maybeId <- c.downField("id").as[Option[String]] - issuer <- c.downField("issuer").as[Either[String, CredentialIssuer]] + issuer <- c.downField("issuer").as[String | CredentialIssuer] issuanceDate <- c.downField("issuanceDate").as[Instant] maybeExpirationDate <- c.downField("expirationDate").as[Option[Instant]] maybeValidFrom <- c.downField("validFrom").as[Option[Instant]] @@ -444,7 +449,7 @@ object CredentialPayload { maybeTermsOfUse <- c.downField("termsOfUse").as[Option[Json]] maybeValidFrom <- c.downField("validFrom").as[Option[Instant]] maybeValidUntil <- c.downField("validUntil").as[Option[Instant]] - maybeIssuer <- c.downField("issuer").as[Option[Either[String, CredentialIssuer]]] + maybeIssuer <- c.downField("issuer").as[Option[String | CredentialIssuer]] } yield { JwtVc( `@context` = `@context`, @@ -888,7 +893,12 @@ object W3CCredential { )(didResolver: DidResolver): IO[String, Validation[String, Unit]] = { JWTVerification.validateEncodedJwt(payload.proof.jwt, proofPurpose)(didResolver: DidResolver)(claim => Validation.fromEither(decode[W3cCredentialPayload](claim).left.map(_.toString)) - )(_.issuer.fold(identity, _.id)) + )(vc => + vc.issuer match { + case string: String => string + case credentialIssuer: CredentialIssuer => credentialIssuer.id + } + ) } def verifyDates(w3cPayload: W3cVerifiableCredentialPayload, leeway: TemporalAmount)(implicit diff --git a/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/revocation/VCStatusList2021.scala b/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/revocation/VCStatusList2021.scala index 8629b9cc1d..dbaf540498 100644 --- a/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/revocation/VCStatusList2021.scala +++ b/pollux/vc-jwt/src/main/scala/org/hyperledger/identus/pollux/vc/jwt/revocation/VCStatusList2021.scala @@ -61,7 +61,7 @@ object VCStatusList2021 { ), maybeId = Some(vcId), `type` = Set("VerifiableCredential", "StatusList2021Credential"), - issuer = Left(jwtIssuer.did.toString), + issuer = jwtIssuer.did.toString, issuanceDate = Instant.now, maybeExpirationDate = None, maybeCredentialSchema = None, diff --git a/pollux/vc-jwt/src/test/scala/org/hyperledger/identus/pollux/vc/jwt/JWTVerificationTest.scala b/pollux/vc-jwt/src/test/scala/org/hyperledger/identus/pollux/vc/jwt/JWTVerificationTest.scala index 7572353859..e09f9e6e96 100644 --- a/pollux/vc-jwt/src/test/scala/org/hyperledger/identus/pollux/vc/jwt/JWTVerificationTest.scala +++ b/pollux/vc-jwt/src/test/scala/org/hyperledger/identus/pollux/vc/jwt/JWTVerificationTest.scala @@ -82,8 +82,8 @@ object JWTVerificationTest extends ZIOSpecDefault { maybeValidFrom = Some(validFrom), maybeValidUntil = Some(validUntil), maybeIssuer = Some( - if (issuerAsObject) Right(CredentialIssuer(issuer.issuer.did.toString, "Profile")) - else Left(issuer.issuer.did.toString) + if (issuerAsObject) CredentialIssuer(issuer.issuer.did.toString, "Profile") + else issuer.issuer.did.toString ) ), nbf = jwtCredentialNbf, // ISSUANCE DATE @@ -211,8 +211,14 @@ object JWTVerificationTest extends ZIOSpecDefault { .decodeJwt(jwtCredential) jwtWithObjectIssuer <- JwtCredential .decodeJwt(jwtCredentialWithObjectIssuer) - jwtWithObjectIssuerIssuer = jwtWithObjectIssuer.vc.maybeIssuer.get.toOption.get.id - jwtIssuer = jwt.vc.maybeIssuer.get.left.toOption.get + jwtWithObjectIssuerIssuer = jwtWithObjectIssuer.vc.maybeIssuer.get match { + case string: String => string + case credentialIssuer: CredentialIssuer => credentialIssuer.id + } + jwtIssuer = jwt.vc.maybeIssuer.get match { + case string: String => string + case credentialIssuer: CredentialIssuer => credentialIssuer.id + } } yield assertTrue( jwtWithObjectIssuerIssuer.equals(jwtIssuer) )