import * as forge from 'node-forge'; export async function signDigest(digest: string, privateKeyBase64: string) { // Convierte la clave privada de Base64 a un objeto forge const privateKeyPem = forge.util.decode64(privateKeyBase64); const privateKey = forge.pki.privateKeyFromPem(privateKeyPem); // Convierte el digest de Base64 a un buffer const digestBuffer = forge.util.decode64(digest); // Firma el digest usando RSASSA-PKCS1-v1_5 con SHA-256 const signature = privateKey.sign( forge.md.sha256.create().update(digestBuffer), 'RSASSA-PKCS1-V1_5' ); // Convierte la firma a Base64 return forge.util.encode64(signature); } export async function exportToP12( privateKeyPem: string, certificateBodyInBase64: string, password: string ) { try { const privateKey = forge.pki.privateKeyFromPem(privateKeyPem); const certificatePem = `-----BEGIN CERTIFICATE-----\n${certificateBodyInBase64}\n-----END CERTIFICATE-----`; const certificate = forge.pki.certificateFromPem(certificatePem); const p12Asn1 = forge.pkcs12.toPkcs12Asn1( privateKey, [certificate], password, { algorithm: '3des', friendlyName: 'Mi Certificado Digital', } ); const derBytes = forge.asn1.toDer(p12Asn1).getBytes(); const p12Base64 = forge.util.encode64(derBytes); console.log('✅ Archivo P12 creado exitosamente.'); return p12Base64; } catch (error: any) { console.error('❌ Error definitivo al crear el P12:', error); if (error.message.includes('Invalid PEM')) { console.error( 'El error sugiere que uno de los formatos de entrada sigue siendo incorrecto, revisa los datos guardados.' ); } return null; } }