import type { EbsiVerifiableAttestation } from "../types.ts"; import { ValidationError } from "../errors/ValidationError.ts"; /** * Validates the Verifiable Credential dates: `issuanceDate`/`validFrom`, `expirationDate`. * * Notes: * - make sure to run `validateEbsiVerifiableAttestation` on the payload before calling `validateDates`. * - this function does NOT verify if the VC is valid at the current time. It only compares the * provided dates. * @param payload - `EbsiVerifiableAttestation` * @param validAt - Date at which the VC must be valid. If not provided, the current date is used. * @param clockSkew - Clock skew in seconds. Default: 0 */ export function validateDates( payload: Pick< EbsiVerifiableAttestation, "expirationDate" | "issuanceDate" | "validFrom" >, validAt?: number, clockSkew = 0, ): void { if (payload.validFrom !== payload.issuanceDate) { throw new ValidationError( "validFrom and issuanceDate MUST have the same value when they are both defined", ); } if ( payload.expirationDate && Date.parse(payload.expirationDate) < Date.parse(payload.validFrom) ) { throw new ValidationError( "expirationDate MUST be more recent than validFrom", ); } if (validAt) { if ( payload.validFrom && Math.floor(Date.parse(payload.validFrom) / 1000) - clockSkew > validAt ) { throw new ValidationError( `The credential is not valid before: ${payload.validFrom}`, ); } if ( payload.expirationDate && validAt > Math.floor(Date.parse(payload.expirationDate) / 1000) + clockSkew ) { throw new ValidationError( `The credential is not valid after: ${payload.expirationDate}`, ); } } }