Skip to content

Commit

Permalink
fix: check format when creating credential configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
patlo-iog committed Apr 23, 2024
1 parent c1460dc commit d6e5e66
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import io.iohk.atala.pollux.core.model.schema.CredentialSchema
import io.iohk.atala.pollux.core.repository.OIDC4VCIssuerMetadataRepository
import io.iohk.atala.pollux.core.service.OIDC4VCIssuerMetadataServiceError.InvalidSchemaId
import io.iohk.atala.pollux.core.service.OIDC4VCIssuerMetadataServiceError.IssuerIdNotFound
import io.iohk.atala.pollux.core.service.OIDC4VCIssuerMetadataServiceError.UnsupportedCredentialFormat
import io.iohk.atala.shared.models.Failure
import io.iohk.atala.shared.models.StatusCode
import io.iohk.atala.shared.models.WalletAccessContext
Expand All @@ -34,6 +35,12 @@ object OIDC4VCIssuerMetadataServiceError {
StatusCode.BadRequest,
s"The schemaId $schemaId is not a valid URI syntax: $msg"
)

final case class UnsupportedCredentialFormat(format: CredentialFormat)
extends OIDC4VCIssuerMetadataServiceError(
StatusCode.BadRequest,
s"Unsupported credential format in OIDC4VC protocol: $format"
)
}

trait OIDC4VCIssuerMetadataService {
Expand All @@ -42,9 +49,10 @@ trait OIDC4VCIssuerMetadataService {

def createCredentialConfiguration(
issuerId: UUID,
format: CredentialFormat,
configurationId: String,
schemaId: String
): ZIO[WalletAccessContext, InvalidSchemaId, CredentialConfiguration]
): ZIO[WalletAccessContext, InvalidSchemaId | UnsupportedCredentialFormat, CredentialConfiguration]
def listCredentialConfiguration(
issuerId: UUID
): IO[IssuerIdNotFound, Seq[CredentialConfiguration]]
Expand All @@ -65,10 +73,15 @@ class OIDC4VCIssuerMetadataServiceImpl(repository: OIDC4VCIssuerMetadataReposito

override def createCredentialConfiguration(
issuerId: UUID,
format: CredentialFormat,
configurationId: String,
schemaId: String
): ZIO[WalletAccessContext, InvalidSchemaId, CredentialConfiguration] = {
): ZIO[WalletAccessContext, InvalidSchemaId | UnsupportedCredentialFormat, CredentialConfiguration] = {
for {
_ <- format match {
case CredentialFormat.JWT => ZIO.unit
case f => ZIO.fail(UnsupportedCredentialFormat(f))
}
schemaUri <- ZIO.attempt(new URI(schemaId)).mapError(t => InvalidSchemaId(schemaId, t.getMessage))
jsonSchema <- CredentialSchema
.resolveJWTSchema(schemaUri, uriDereferencer)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ case class CredentialIssuerControllerImpl(
for {
credentialConfiguration <- issuerMetadataService.createCredentialConfiguration(
issuerId,
request.format,
request.configurationId,
request.schemaId
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ final case class CredentialConfiguration(
format: CredentialFormat,
scope: String,
credential_definition: CredentialDefinition,
cryptographic_binding_methods_supported: Seq[String] = Seq("did:prism")
cryptographic_binding_methods_supported: Seq[String] = Seq("did:prism"),
credential_signing_alg_values_supported: Seq[String] = Seq("ES256K")
)

object CredentialConfiguration {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ object CredentialRequest {
given schema: Schema[CredentialRequest] = Schema
.oneOfUsingField[CredentialRequest, CredentialFormat](_.format, _.toString)(
CredentialFormat.jwt_vc_json -> JwtCredentialRequest.schema,
CredentialFormat.sd_jwt -> SdJwtCredentialRequest.schema,
CredentialFormat.anoncreds -> AnoncredsCredentialRequest.schema
)
given encoder: JsonEncoder[CredentialRequest] = DeriveJsonEncoder.gen
Expand Down Expand Up @@ -58,32 +57,6 @@ object JwtCredentialRequest {
given decoder: JsonDecoder[JwtCredentialRequest] = DeriveJsonDecoder.gen
}

@jsonHint(CredentialFormat.sd_jwt.toString)
case class SdJwtCredentialRequest(
format: CredentialFormat,
proof: Option[Proof],
@jsonField("credential_identifier")
@encodedName("credential_identifier")
credentialIdentifier: Option[String],
@jsonField("credential_response_encryption")
@encodedName("credential_response_encryption")
credentialResponseEncryption: Option[CredentialResponseEncryption],
// REQUIRED when the format parameter is present in the Credential Request.
// It MUST NOT be used otherwise. It is an object containing the detailed description of the Credential type.
@jsonField("credential_definition")
@encodedName("credential_definition")
credentialDefinition: Option[CredentialDefinition],
selectiveDisclosure: String // TODO: it's a fake field for now
) extends CredentialRequest

object SdJwtCredentialRequest {
given schema: Schema[SdJwtCredentialRequest] = Schema.derived

given encoder: JsonEncoder[SdJwtCredentialRequest] = DeriveJsonEncoder.gen

given decoder: JsonDecoder[SdJwtCredentialRequest] = DeriveJsonDecoder.gen
}

@jsonHint(CredentialFormat.anoncreds.toString)
case class AnoncredsCredentialRequest(
format: CredentialFormat,
Expand Down Expand Up @@ -207,7 +180,6 @@ object LdpProof {

enum CredentialFormat {
case jwt_vc_json
case sd_jwt
case anoncreds
}

Expand All @@ -222,6 +194,11 @@ object CredentialFormat {
case PolluxCredentialFormat.JWT => CredentialFormat.jwt_vc_json
case PolluxCredentialFormat.AnonCreds => CredentialFormat.anoncreds
}

given Conversion[CredentialFormat, PolluxCredentialFormat] = {
case CredentialFormat.jwt_vc_json => PolluxCredentialFormat.JWT
case CredentialFormat.anoncreds => PolluxCredentialFormat.AnonCreds
}
}

enum ProofType {
Expand Down

0 comments on commit d6e5e66

Please sign in to comment.