/** * Exemplo 02: Assinatura Desacoplada de Digest (Hash SHA-256) * * Demonstra a arquitetura recomendada do CCSP/1: * O documento NUNCA sai do navegador / servidor da aplicação. Apenas o hash * de 32 bytes (SHA-256) é enviado ao CyberCore Signer para ser assinado localmente. */ import { CyberCoreSigner } from '@cybercore/signer-sdk'; async function main() { const signer = new CyberCoreSigner({ applicationName: 'Sistema de Prontuário Eletrônico' }); await signer.connect(); const certs = await signer.getCertificates(); if (certs.length === 0) { throw new Error('Nenhum certificado disponível.'); } const selectedCert = certs[0]; // Simula o documento clínico ou contrato gerado na aplicação const documentoTexto = 'Evolução clínica do paciente João da Silva - 20/10/2026. Procedimento sem intercorrências.'; // 1. Calcula o SHA-256 no próprio ambiente local const digestBase64 = await signer._calculateSha256(documentoTexto); console.log('Hash SHA-256 gerado localmente:', digestBase64); // 2. Envia apenas o digest para o CyberCore Signer console.log('Aguardando confirmação do usuário no diálogo nativo...'); const result = await signer.sign({ certificateId: selectedCert.id, digest: digestBase64, documentName: 'evolucao_clinica_1048.txt', documentType: 'TXT', purpose: 'Assinatura de Prontuário Médico', expiresInSeconds: 120 }); console.log('Documento assinado com sucesso!'); console.log('Status:', result.status); console.log('Request ID:', result.requestId); console.log('Algoritmo:', result.algorithm); console.log('Assinatura (Base64):', result.signature.substring(0, 48) + '...'); console.log('Cadeia X.509 recebida:', result.certificateChain.length, 'certificado(s)'); // 3. Validação preliminar da assinatura no client const isValid = await signer.verify({ signature: result.signature, digest: result.digest, certificate: result.certificate }); console.log('Assinatura é consistente?', isValid); } main().catch(console.error);