Files
cybercore-signer/sdk/examples/02-sign-digest.js
T

60 lines
2.0 KiB
JavaScript

/**
* 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);