Skip to content

Commit

Permalink
Start integration with the agent
Browse files Browse the repository at this point in the history
  • Loading branch information
FabioPinheiro committed May 7, 2024
1 parent b8d2469 commit 581deee
Show file tree
Hide file tree
Showing 11 changed files with 271 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,28 @@ object PresentBackgroundJobs extends BackgroundJobsHelper {
@@ Metric
.gauge("present_proof_flow_prover_presentation_pending_to_generated_flow_ms_gauge")
.trackDurationWith(_.toMetricsSeconds)
case PresentationRecord(
id,
_,
_,
_,
_,
_,
_,
_,
PresentationPending,
CredentialFormat.SDJWT,
oRequestPresentation,
_,
_,
credentialsToUse,
_,
_,
_,
_,
_
) => // Prover
??? // FIXME
case PresentationRecord(
id,
_,
Expand Down Expand Up @@ -614,6 +636,28 @@ object PresentBackgroundJobs extends BackgroundJobsHelper {
"present_proof_flow_verifier_presentation_received_to_verification_success_or_failure_flow_ms_gauge"
)
.trackDurationWith(_.toMetricsSeconds)
case PresentationRecord(
id,
_,
_,
_,
_,
_,
_,
_,
PresentationReceived,
CredentialFormat.SDJWT,
mayBeRequestPresentation,
_,
presentation,
_,
_,
_,
_,
_,
_
) => // Verifier
??? // FIXME
case PresentationRecord(
_,
_,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import org.hyperledger.identus.issue.controller.http.{
IssueCredentialRecord,
IssueCredentialRecordPage
}
import org.hyperledger.identus.pollux.core.model.CredentialFormat.{AnonCreds, JWT}
import org.hyperledger.identus.pollux.core.model.CredentialFormat.{AnonCreds, JWT, SDJWT}
import org.hyperledger.identus.pollux.core.model.error.CredentialServiceError
import org.hyperledger.identus.pollux.core.model.{CredentialFormat, DidCommID}
import org.hyperledger.identus.pollux.core.service.CredentialService
Expand Down Expand Up @@ -71,6 +71,25 @@ class IssueControllerImpl(
issuingDID = issuingDID.asCanonical
)
} yield record
case SDJWT => // FIXME
for {
issuingDID <- ZIO
.fromOption(request.issuingDID)
.mapError(_ => ErrorResponse.badRequest(detail = Some("Missing request parameter: issuingDID")))
.flatMap(extractPrismDIDFromString)
_ <- validatePrismDID(issuingDID, allowUnpublished = true, Role.Issuer)
record <- credentialService
.createSDJWTIssueCredentialRecord(
pairwiseIssuerDID = didIdPair.myDID,
pairwiseHolderDID = didIdPair.theirDid,
thid = DidCommID(),
maybeSchemaId = request.schemaId,
claims = jsonClaims,
validityPeriod = request.validityPeriod,
automaticIssuance = request.automaticIssuance.orElse(Some(true)),
issuingDID = issuingDID.asCanonical
)
} yield record
case AnonCreds =>
for {
credentialDefinitionGUID <- ZIO
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class PresentProofControllerImpl(
},
options = request.options.map(x => Options(x.challenge, x.domain))
)
case CredentialFormat.SDJWT => ??? // TODO
case CredentialFormat.AnonCreds =>
request.anoncredPresentationRequest match {
case Some(presentationRequest) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ enum IssueCredentialProposeFormat(val name: String) {
case Unsupported(other: String) extends IssueCredentialProposeFormat(other)
// case JWT extends IssueCredentialProposeFormat("jwt/credential-propose@v1.0") // TODO FOLLOW specs for JWT VC
case JWT extends IssueCredentialProposeFormat("prism/jwt") // TODO REMOVE
case SDJWT extends IssueCredentialProposeFormat("vc+sd-jwt")
case Anoncred extends IssueCredentialProposeFormat("anoncreds/credential-filter@v1.0")
}

Expand Down Expand Up @@ -96,6 +97,7 @@ enum IssueCredentialOfferFormat(val name: String) {
case Unsupported(other: String) extends IssueCredentialOfferFormat(other)
// case JWT extends IssueCredentialOfferFormat("jwt/credential-offer@v1.0") // TODO FOLLOW specs for JWT VC
case JWT extends IssueCredentialOfferFormat("prism/jwt") // TODO REMOVE
case SDJWT extends IssueCredentialOfferFormat("vc+sd-jwt")
case Anoncred extends IssueCredentialOfferFormat("anoncreds/credential-offer@v1.0")
}

Expand Down Expand Up @@ -123,6 +125,7 @@ enum IssueCredentialRequestFormat(val name: String) {
case Unsupported(other: String) extends IssueCredentialRequestFormat(other)
// case JWT extends IssueCredentialRequestFormat("jwt/credential-request@v1.0") // TODO FOLLOW specs for JWT VC
case JWT extends IssueCredentialRequestFormat("prism/jwt") // TODO REMOVE
case SDJWT extends IssueCredentialRequestFormat("vc+sd-jwt")
case Anoncred extends IssueCredentialRequestFormat("anoncreds/credential-request@v1.0")
}

Expand All @@ -148,6 +151,7 @@ enum IssueCredentialIssuedFormat(val name: String) {
case Unsupported(other: String) extends IssueCredentialIssuedFormat(other)
// case JWT extends IssueCredentialIssuedFormat("jwt/credential@v1.0") // TODO FOLLOW specs for JWT VC
case JWT extends IssueCredentialIssuedFormat("prism/jwt") // TODO REMOVE
case SDJWT extends IssueCredentialIssuedFormat("vc+sd-jwt")
case Anoncred extends IssueCredentialIssuedFormat("anoncreds/credential@v1.0")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ enum PresentCredentialProposeFormat(val name: String) {
case Unsupported(other: String) extends PresentCredentialProposeFormat(other)
// case JWT extends PresentCredentialProposeFormat("jwt/proof-request@v1.0") // TODO FOLLOW specs for JWT VC
case JWT extends PresentCredentialProposeFormat("prism/jwt") // TODO REMOVE
case SDJWT extends PresentCredentialProposeFormat("vc+sd-jwt")
case Anoncred extends PresentCredentialProposeFormat("anoncreds/proof-request@v1.0")
}

Expand All @@ -74,6 +75,7 @@ enum PresentCredentialRequestFormat(val name: String) {
case Unsupported(other: String) extends PresentCredentialRequestFormat(other)
// case JWT extends PresentCredentialRequestFormat("jwt/proof-request@v1.0") // TODO FOLLOW specs for JWT VC
case JWT extends PresentCredentialRequestFormat("prism/jwt") // TODO REMOVE
case SDJWT extends PresentCredentialRequestFormat("vc+sd-jwt")
case Anoncred extends PresentCredentialRequestFormat("anoncreds/proof-request@v1.0")
}

Expand All @@ -99,6 +101,7 @@ enum PresentCredentialFormat(val name: String) {
case Unsupported(other: String) extends PresentCredentialFormat(other)
// case JWT extends PresentCredentialFormat("jwt/proof-request@v1.0") // TODO FOLLOW specs for JWT VC
case JWT extends PresentCredentialFormat("prism/jwt") // TODO REMOVE
case SDJWT extends PresentCredentialFormat("vc+sd-jwt")
case Anoncred extends PresentCredentialFormat("anoncreds/proof-request@v1.0")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ package org.hyperledger.identus.pollux.core.model

enum CredentialFormat:
case JWT extends CredentialFormat
case SDJWT extends CredentialFormat
case AnonCreds extends CredentialFormat

object CredentialFormat {
def fromString(str: String) = str match
case "JWT" => Some(CredentialFormat.JWT)
case "SDJWT" => Some(CredentialFormat.SDJWT)
case "AnonCreds" => Some(CredentialFormat.AnonCreds)
case _ => None
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,21 @@ final case class IssueCredentialRecord(
offerCredentialData.map { data =>
credentialFormat.match
case CredentialFormat.JWT => (IssueCredentialOfferFormat.JWT, data)
case CredentialFormat.SDJWT => (IssueCredentialOfferFormat.SDJWT, data)
case CredentialFormat.AnonCreds => (IssueCredentialOfferFormat.Anoncred, data)
}
def requestCredentialFormatAndData: Option[(IssueCredentialRequestFormat, RequestCredential)] =
requestCredentialData.map { data =>
credentialFormat.match
case CredentialFormat.JWT => (IssueCredentialRequestFormat.JWT, data)
case CredentialFormat.SDJWT => (IssueCredentialRequestFormat.SDJWT, data)
case CredentialFormat.AnonCreds => (IssueCredentialRequestFormat.Anoncred, data)
}
def issuedCredentialFormatAndData: Option[(IssueCredentialIssuedFormat, IssueCredential)] =
issueCredentialData.map { data =>
credentialFormat.match
case CredentialFormat.JWT => (IssueCredentialIssuedFormat.JWT, data)
case CredentialFormat.SDJWT => (IssueCredentialIssuedFormat.SDJWT, data)
case CredentialFormat.AnonCreds => (IssueCredentialIssuedFormat.Anoncred, data)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,17 @@ trait CredentialService {
issuingDID: CanonicalPrismDID
): ZIO[WalletAccessContext, CredentialServiceError, IssueCredentialRecord]

def createSDJWTIssueCredentialRecord(
pairwiseIssuerDID: DidId,
pairwiseHolderDID: DidId,
thid: DidCommID,
maybeSchemaId: Option[String],
claims: io.circe.Json,
validityPeriod: Option[Double] = None,
automaticIssuance: Option[Boolean],
issuingDID: CanonicalPrismDID
): ZIO[WalletAccessContext, CredentialServiceError, IssueCredentialRecord]

def createAnonCredsIssueCredentialRecord(
pairwiseIssuerDID: DidId,
pairwiseHolderDID: DidId,
Expand Down Expand Up @@ -101,6 +112,10 @@ trait CredentialService {
statusListRegistryUrl: String,
): ZIO[WalletAccessContext, CredentialServiceError, IssueCredentialRecord]

def generateSDJWTCredential(
recordId: DidCommID,
): ZIO[WalletAccessContext, CredentialServiceError, IssueCredentialRecord]

def generateAnonCredsCredential(
recordId: DidCommID
): ZIO[WalletAccessContext, CredentialServiceError, IssueCredentialRecord]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,70 @@ private class CredentialServiceImpl(
} yield record
}

def createSDJWTIssueCredentialRecord(
pairwiseIssuerDID: DidId,
pairwiseHolderDID: DidId,
thid: DidCommID,
maybeSchemaId: Option[String],
claims: io.circe.Json,
validityPeriod: Option[Double] = None,
automaticIssuance: Option[Boolean],
issuingDID: CanonicalPrismDID
): ZIO[WalletAccessContext, CredentialServiceError, IssueCredentialRecord] =
for {
_ <- maybeSchemaId match
case Some(schemaId) =>
CredentialSchema
.validateJWTCredentialSubject(schemaId, claims.noSpaces, uriDereferencer)
.mapError(e => CredentialSchemaError(e))
case None =>
ZIO.unit
attributes <- CredentialService.convertJsonClaimsToAttributes(claims)
offer <- createSDJWTDidCommOfferCredential(
pairwiseIssuerDID = pairwiseIssuerDID,
pairwiseHolderDID = pairwiseHolderDID,
maybeSchemaId = maybeSchemaId,
claims = attributes,
thid = thid,
UUID.randomUUID().toString,
"domain"
)
record <- ZIO.succeed(
IssueCredentialRecord(
id = DidCommID(),
createdAt = Instant.now,
updatedAt = None,
thid = thid,
schemaUri = maybeSchemaId,
credentialDefinitionId = None,
credentialDefinitionUri = None,
credentialFormat = CredentialFormat.SDJWT,
role = IssueCredentialRecord.Role.Issuer,
subjectId = None,
validityPeriod = validityPeriod,
automaticIssuance = automaticIssuance,
protocolState = IssueCredentialRecord.ProtocolState.OfferPending,
offerCredentialData = Some(offer),
requestCredentialData = None,
anonCredsRequestMetadata = None,
issueCredentialData = None,
issuedCredentialRaw = None,
issuingDID = Some(issuingDID),
metaRetries = maxRetries,
metaNextRetry = Some(Instant.now()),
metaLastFailure = None,
)
)
count <- credentialRepository
.createIssueCredentialRecord(record)
.flatMap {
case 1 => ZIO.succeed(())
case n => ZIO.fail(UnexpectedException(s"Invalid row count result: $n"))
}
.mapError(RepositoryError.apply) @@ CustomMetricsAspect
.startRecordingTime(s"${record.id}_issuer_offer_pending_to_sent_ms_gauge")
} yield record

override def createAnonCredsIssueCredentialRecord(
pairwiseIssuerDID: DidId,
pairwiseHolderDID: DidId,
Expand Down Expand Up @@ -290,6 +354,7 @@ private class CredentialServiceImpl(

credentialFormat <- format match
case value if value == IssueCredentialOfferFormat.JWT.name => ZIO.succeed(CredentialFormat.JWT)
case value if value == IssueCredentialOfferFormat.SDJWT.name => ZIO.succeed(CredentialFormat.SDJWT)
case value if value == IssueCredentialOfferFormat.Anoncred.name => ZIO.succeed(CredentialFormat.AnonCreds)
case value => ZIO.fail(UnsupportedCredentialFormat(value))

Expand Down Expand Up @@ -349,6 +414,7 @@ private class CredentialServiceImpl(
CredentialServiceError
.UnexpectedError(s"A JSON attachment is expected in the credential offer")
)
case CredentialFormat.SDJWT => ??? // FIXME
case CredentialFormat.AnonCreds =>
attachment.data match
case Base64(value) =>
Expand Down Expand Up @@ -890,6 +956,44 @@ private class CredentialServiceImpl(
)
}

private[this] def createSDJWTDidCommOfferCredential(
pairwiseIssuerDID: DidId,
pairwiseHolderDID: DidId,
maybeSchemaId: Option[String],
claims: Seq[Attribute],
thid: DidCommID,
challenge: String,
domain: String
) = {
for {
credentialPreview <- ZIO.succeed(CredentialPreview(schema_id = maybeSchemaId, attributes = claims))
body = OfferCredential.Body(
goal_code = Some("Offer Credential"),
credential_preview = credentialPreview,
)
attachments <- ZIO.succeed(
Seq(
AttachmentDescriptor.buildJsonAttachment(
mediaType = Some("application/json"),
format = Some(IssueCredentialOfferFormat.SDJWT.name),
payload = PresentationAttachment(
Some(Options(challenge, domain)),
PresentationDefinition(format =
Some(ClaimFormat(jwt = Some(Jwt(alg = Seq("ES256K"), proof_type = Nil))))
) // FIXME
)
)
)
)
} yield OfferCredential(
body = body,
attachments = attachments,
from = pairwiseIssuerDID,
to = pairwiseHolderDID,
thid = Some(thid.value)
)
}

private[this] def createAnonCredsDidCommOfferCredential(
pairwiseIssuerDID: DidId,
pairwiseHolderDID: DidId,
Expand Down Expand Up @@ -1106,6 +1210,10 @@ private class CredentialServiceImpl(
} yield record
}

override def generateSDJWTCredential(
recordId: DidCommID,
): ZIO[WalletAccessContext, CredentialServiceError, IssueCredentialRecord] = ??? // FIXME

private[this] def allocateNewCredentialInStatusListForWallet(
record: IssueCredentialRecord,
statusListRegistryUrl: String,
Expand Down

0 comments on commit 581deee

Please sign in to comment.