import {z} from 'zod' export type CreateApiApiAuthenticationServiceV1VerifyChallengeArgs = {Authorization?: string | undefined, body: {certificate: string, mode: 'BASIC' | 'CHAIN', hashAlgorithm: 'SHA1' | 'SHA256' | 'SHA512', challenge: string, challengeSignature: string}}; export type CreateApiApiAuthenticationServiceV1VerifyChallengeOptions = {baseUrl?: string | undefined, JWTAccessToken?: string | undefined, fetch?: typeof fetch | undefined}; export const infoStatusVazio = z.object({keyDescriptionList: z.array(z.object({args: z.array(z.object({})).optional(), description: z.string().optional(), key: z.string().optional()})).optional(), statusType: z.string().optional()}); export const certificateDN = z.object({c: z.string().optional(), cn: z.string().optional(), dn: z.string().optional(), e: z.string().optional(), email: z.string().optional(), formattedCn: z.string().optional(), l: z.string().optional(), o: z.string().optional(), ou: z.array(z.string()).optional(), st: z.string().optional()}); export const validity = z.object({notAfter: z.string().optional(), notBefore: z.string().optional()}); export const certificateInfo = z.object({hash: z.string().optional(), serial: z.string().optional(), issuerDN: certificateDN.optional(), subjectDN: certificateDN.optional(), validity: validity.optional()}); export const chainCertificateVerificationStatus = z.object({"@type": z.string().optional(), status: z.enum(["VALID", "VALID_WITH_ALERT", "INVALID", "INVALID_WITH_INTEGRITY_ERROR"]).optional(), infoStatus: infoStatusVazio.optional(), alertStatus: infoStatusVazio.optional(), errorStatus: infoStatusVazio.optional(), content: z.string().optional(), pkiBrazil: z.boolean().optional(), verificationReference: z.string().optional(), verificationReferenceType: z.enum(["CERTIFIED", "ACTUAL", "DECLARED"]).optional(), certificateInfo: certificateInfo.optional(), statusType: z.enum(["SIGNATURE", "CERTIFICATE", "CHAIN", "TIMESTAMP", "SIGNATURE_POLICY", "CERTIFICATE_ATTRIBUTE"]).optional()}); export const certificateRevocationStatus = z.object({date: z.string().optional(), reason: z.enum(["UNSPECIFIED", "KEY_COMPROMISE", "CA_COMPROMISE", "AFFILIATION_CHANGED", "SUPERSEDED", "CESSATION_OF_OPERATION", "CERTIFICATE_HOLD", "REMOVE_FROM_CRL", "PRIVILEGE_WITHDRAWN", "AA_COMPROMISE"]).optional()}); export const keyInfo = z.object({extendedKeyUsages: z.array(z.enum(["KEY_USAGE_SERVER_AUTH", "KEY_USAGE_CLIENT_AUTH", "KEY_USAGE_CODE_SIGNING", "KEY_USAGE_EMAIL_PROTECTION", "KEY_USAGE_TIME_STAMPING", "KEY_USAGE_OCSP_SIGNING", "ENROLLMENT_AGENT", "KP_SMARTCARD_LOGON", "NT_PRINCIPAL_NAME", "DESCONHECIDO"])).optional(), hash: z.string().optional(), keyUsages: z.array(z.enum(["DIGITAL_SIGNATURE", "NON_REPUDIATION", "KEY_ENCIPHERMENT", "DATA_ENCIPHERMENT", "KEY_AGREEMENT", "KEY_CERT_SIGN", "CRL_SIGN", "ENCIPHER_ONLY", "DECIPHER_ONLY"])).optional(), signatureAlgorithm: z.enum(["RSA_ENCRYPTION", "SHA1_WITH_RSA_ENCRYPTION", "SHA224_WITH_RSA_ENCRYPTION", "SHA256_WITH_RSA_ENCRYPTION", "SHA384_WITH_RSA_ENCRYPTION", "SHA512_WITH_RSA_ENCRYPTION", "SHA1_WITH_ECDSA_ENCRYPTION", "SHA224_WITH_ECDSA_ENCRYPTION", "SHA256_WITH_ECDSA_ENCRYPTION", "SHA384_WITH_ECDSA_ENCRYPTION", "SHA512_WITH_ECDSA_ENCRYPTION"]).optional(), size: z.number().int().optional()}); export const certificatePolicy = z.object({name: z.string().optional(), oid: z.string().optional()}); export const extensions = z.object({authorityInformationAccess: z.string().optional(), authorityKeyIdentifier: z.string().optional(), caCertificate: z.boolean().optional(), certificatePolicies: z.array(certificatePolicy).optional(), crlDistributionPoints: z.array(z.string()).optional(), subjectKeyIdentifier: z.string().optional()}); export const iExtensionPkiBrazil = z.object({typ: z.string().optional(), birthDate: z.string().optional(), nis: z.string().optional(), rg: z.string().optional(), rgIssuer: z.string().optional(), rgIssuerFederativeUnit: z.string().optional(), cei: z.string().optional(), voterId: z.object({inscriptionNumber: z.string().optional(), city: z.string().optional(), section: z.string().optional(), federativeUnity: z.string().optional(), zone: z.string().optional()}).optional()}); export const cRLInfo = z.object({authorityKeyIdentifier: z.string().optional(), certificateIssuer: certificateDN.optional(), nextUpdate: z.string().optional(), number: z.number().int().optional(), thisUpdate: z.string().optional()}); export const finalCertificateVerificationStatus = z.object({"@type": z.string().optional(), status: z.enum(["VALID", "VALID_WITH_ALERT", "INVALID", "INVALID_WITH_INTEGRITY_ERROR"]).optional(), infoStatus: infoStatusVazio.optional(), alertStatus: infoStatusVazio.optional(), errorStatus: infoStatusVazio.optional(), content: z.string().optional(), revocationStatus: certificateRevocationStatus.optional(), pkiBrazil: z.boolean().optional(), certificateType: z.enum(["A1", "A2", "A3", "A4", "S1", "S2", "S3", "S4", "T3", "T4", "AC", "A_CF_E_SAT", "UNKNOWN"]).optional(), verificationReference: z.string().optional(), verificationReferenceType: z.enum(["CERTIFIED", "ACTUAL", "DECLARED"]).optional(), certificateInfo: certificateInfo.optional(), keyInfo: keyInfo.optional(), cpf: z.string().optional(), email: z.string().optional(), extensions: extensions.optional(), extensionPki: iExtensionPkiBrazil.optional(), crlinfo: cRLInfo.optional(), statusType: z.enum(["SIGNATURE", "CERTIFICATE", "CHAIN", "TIMESTAMP", "SIGNATURE_POLICY", "CERTIFICATE_ATTRIBUTE"]).optional()}); export const chainVerificationStatus = z.object({"@type": z.string().optional(), status: z.enum(["VALID", "VALID_WITH_ALERT", "INVALID", "INVALID_WITH_INTEGRITY_ERROR"]).optional(), infoStatus: infoStatusVazio.optional(), alertStatus: infoStatusVazio.optional(), errorStatus: infoStatusVazio.optional(), certificateStatusList: z.array(z.union([chainCertificateVerificationStatus, finalCertificateVerificationStatus])).optional()}); export const certificateReport = z.object({nonce: z.number().int().optional(), status: chainVerificationStatus.optional()}); export const createApiApiAuthenticationServiceV1VerifyChallengeResponse = z.object({certificateReport: certificateReport.optional(), signatureVerified: z.string().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Verifica a assinatura de um desafio e o certificado do assinante * * POST /api/authentication-service/v1/verify-challenge */ export const createApiApiAuthenticationServiceV1VerifyChallenge = async (args: CreateApiApiAuthenticationServiceV1VerifyChallengeArgs, options?: CreateApiApiAuthenticationServiceV1VerifyChallengeOptions) => { const {baseUrl = "https://cloud-hom.bry.com.br", fetch: fetchFn = fetch, JWTAccessToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.Authorization != null) headers.set("Authorization", String(args.Authorization)) if (JWTAccessToken !== undefined) headers.set("Authorization", JWTAccessToken) const url = `${baseUrl.replace(/\/+$/, '')}/api/authentication-service/v1/verify-challenge${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(createApiApiAuthenticationServiceV1VerifyChallengeResponse, await res.json()) };