diff --git a/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/pdf/seal/PdfSealThemeRegistry.java b/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/pdf/seal/PdfSealThemeRegistry.java
index 1e67b81..2394154 100644
--- a/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/pdf/seal/PdfSealThemeRegistry.java
+++ b/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/pdf/seal/PdfSealThemeRegistry.java
@@ -162,7 +162,7 @@ public final class PdfSealThemeRegistry {
${SIGNER_NAME}
Doc: ${SIGNER_DOC} • AC: ${CERT_ISSUER}
Data/Hora: ${SIGNING_DATE}
- Validade jurídica assegurada pela MP nº 2.200-2/2001
+ Verifique a autenticidade da assinatura eletrônica em https://validar.iti.gov.br
"""
));
diff --git a/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/protocol/CcspServer.java b/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/protocol/CcspServer.java
index 5e8fd12..91d9939 100644
--- a/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/protocol/CcspServer.java
+++ b/modules/cybercore-core/src/main/java/br/com/cybercore/signer/core/protocol/CcspServer.java
@@ -328,10 +328,14 @@ public class CcspServer {
try (InputStream is = exchange.getRequestBody()) {
request = objectMapper.readValue(is, CcspRequest.class);
} catch (Exception e) {
+ logger.warn("[CCSP REQ INVÁLIDO] POST /ccsp/v1/sign de Origin: {} | Erro parsing: {}", origin, e.getMessage());
sendCcspError(exchange, 400, null, CcspErrorCode.SIGNATURE_FAILED, "Payload de requisição inválido.");
return;
}
+ logger.info("[CCSP REQ] POST /ccsp/v1/sign | Origin: {} | ReqId: {} | App: {} | Op: {} | Algoritmo: {} | CertHint: {}",
+ origin, request.requestId(), request.applicationId(), request.operation(), request.algorithm(), request.certificateHint());
+
// 1. Validação de versão
if (!request.isVersionSupported()) {
sendCcspError(exchange, 400, request.requestId(), CcspErrorCode.COMMUNICATION_ERROR,
@@ -495,10 +499,15 @@ public class CcspServer {
try (InputStream is = exchange.getRequestBody()) {
request = objectMapper.readValue(is, CcspRequest.class);
} catch (Exception e) {
+ logger.warn("[CCSP REQ INVÁLIDO] POST /ccsp/v1/sign-pdf de Origin: {} | Erro parsing: {}", origin, e.getMessage());
sendCcspError(exchange, 400, null, CcspErrorCode.SIGNATURE_FAILED, "Payload de requisição inválido.");
return;
}
+ int pdfLength = request.pdf() != null ? request.pdf().length() : 0;
+ logger.info("[CCSP REQ] POST /ccsp/v1/sign-pdf | Origin: {} | ReqId: {} | App: {} | Doc: '{}' | Base64: {} chars | CertHint: {}",
+ origin, request.requestId(), request.applicationId(), request.documentName(), pdfLength, request.certificateHint());
+
if (!request.isVersionSupported()) {
sendCcspError(exchange, 400, request.requestId(), CcspErrorCode.COMMUNICATION_ERROR,
"Versão do protocolo não suportada: " + request.version());
@@ -1028,6 +1037,22 @@ public class CcspServer {
try (OutputStream os = exchange.getResponseBody()) {
os.write(bytes);
}
+
+ String path = exchange.getRequestURI().getPath();
+ if (data instanceof CcspResponse resp) {
+ if ("signed".equalsIgnoreCase(resp.status())) {
+ logger.info("[CCSP RESP] {} -> HTTP {} | ReqId: {} | Status: signed | Resposta: {} bytes | SHA-256: {}",
+ path, statusCode, resp.requestId(), bytes.length, resp.sha256() != null ? resp.sha256() : "n/a");
+ } else if ("error".equalsIgnoreCase(resp.status())) {
+ logger.warn("[CCSP RESP ERROR] {} -> HTTP {} | ReqId: {} | Code: {} | Msg: {}",
+ path, statusCode, resp.requestId(), resp.errorCode(), resp.message());
+ } else {
+ logger.info("[CCSP RESP] {} -> HTTP {} | ReqId: {} | Status: {} | Resposta: {} bytes",
+ path, statusCode, resp.requestId(), resp.status(), bytes.length);
+ }
+ } else {
+ logger.info("[CCSP RESP] {} -> HTTP {} | Resposta: {} bytes", path, statusCode, bytes.length);
+ }
}
private void sendErrorResponse(HttpExchange exchange, int httpStatus, String code, String message) throws IOException {
diff --git a/modules/cybercore-ui/src/main/java/br/com/cybercore/signer/ui/CyberCoreDesktopApplication.java b/modules/cybercore-ui/src/main/java/br/com/cybercore/signer/ui/CyberCoreDesktopApplication.java
index b8b9f0a..aeaf492 100644
--- a/modules/cybercore-ui/src/main/java/br/com/cybercore/signer/ui/CyberCoreDesktopApplication.java
+++ b/modules/cybercore-ui/src/main/java/br/com/cybercore/signer/ui/CyberCoreDesktopApplication.java
@@ -425,6 +425,9 @@ public class CyberCoreDesktopApplication extends Application {
byte[] digestBytes;
if (request.digest() != null && !request.digest().isBlank()) {
digestBytes = Base64.getDecoder().decode(request.digest());
+ } else if (request.pdf() != null && !request.pdf().isBlank()) {
+ byte[] rawPdf = Base64.getDecoder().decode(request.pdf());
+ digestBytes = MessageDigest.getInstance("SHA-256").digest(rawPdf);
} else if (request.challenge() != null && !request.challenge().isBlank()) {
digestBytes = MessageDigest.getInstance("SHA-256")
.digest(request.challenge().getBytes(StandardCharsets.UTF_8));
diff --git a/sdk/demo/index.html b/sdk/demo/index.html
index 0422538..6663392 100644
--- a/sdk/demo/index.html
+++ b/sdk/demo/index.html
@@ -1250,11 +1250,12 @@
pdfAlert.className = 'alert alert-success';
pdfAlert.textContent = '✓ Documento PDF assinado com sucesso via PAdES (ISO 32000)!';
- currentSignedPdfBase64 = result.signed_pdf;
+ const signedPdfBase64 = result.signedPdf || result.signed_pdf || '';
+ currentSignedPdfBase64 = signedPdfBase64;
pdfResultCard.style.display = 'block';
- pdfResultSize.textContent = (result.signed_pdf.length * 0.75 / 1024).toFixed(1) + ' KB';
+ pdfResultSize.textContent = (signedPdfBase64.length * 0.75 / 1024).toFixed(1) + ' KB';
pdfResultSha256.textContent = result.sha256 || 'Calculado com sucesso';
- pdfResultBase64.textContent = result.signed_pdf;
+ pdfResultBase64.textContent = signedPdfBase64;
pdfResultCard.scrollIntoView({ behavior: 'smooth' });
} catch (err) {
pdfAlert.className = 'alert alert-error';
diff --git a/sdk/src/pdf-seal-designer.js b/sdk/src/pdf-seal-designer.js
index 8eeb646..269776a 100644
--- a/sdk/src/pdf-seal-designer.js
+++ b/sdk/src/pdf-seal-designer.js
@@ -35,8 +35,8 @@ export class PdfSealDesigner {
textColor: '#0f172a',
iconStyle: 'shield',
customLogoBase64: null,
- customHeader: 'CYBERCORE • ICP-BRASIL',
- customFooter: 'Validade jurídica assegurada pela MP nº 2.200-2/2001',
+ customHeader: 'DOCUMENTO ASSINADO DIGITALMENTE',
+ customFooter: 'Verifique a autenticidade da assinatura eletrônica em https://validar.iti.gov.br',
customFieldLabel: 'Cargo',
customFieldValue: 'Diretor Responsável',
defaultCpfMode: 'MASKED',
diff --git a/sdk/src/signer-sdk.js b/sdk/src/signer-sdk.js
index 9d9eeac..53cf507 100644
--- a/sdk/src/signer-sdk.js
+++ b/sdk/src/signer-sdk.js
@@ -392,6 +392,7 @@ export class CyberCoreSigner {
requestId: resp.request_id,
status: resp.status,
signedPdf: signedPdfBase64,
+ signed_pdf: signedPdfBase64,
sha256: resp.sha256,
signature: resp.signature,
certificate: resp.certificate,