@f-o-t/e-signature 1.7.5 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,6 +17,7 @@ bun add @f-o-t/e-signature
17
17
  - PAdES-BES and ICP-Brasil compliant signatures
18
18
  - RFC 3161 timestamp support
19
19
  - QR code generation for signature verification
20
+ - Unified signature layout box: QR + certificate text are vertically aligned as one content block
20
21
  - Configurable DocMDP permissions for document modification control
21
22
  - **Browser compatible** — no `Buffer` or Node-only APIs; runs in browsers, Edge Runtime, and Cloudflare Workers
22
23
  - **Non-blocking crypto** — PBKDF2 key derivation and RSA/ECDSA signing use the native [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) (`SubtleCrypto`) when available, avoiding main-thread freezes; pure-JS implementations serve as automatic fallback
@@ -345,6 +346,18 @@ type SignatureAppearance = {
345
346
  page?: number;
346
347
  showQrCode?: boolean;
347
348
  showCertInfo?: boolean;
349
+ /** Inner content padding in points (default: 5) */
350
+ padding?: number;
351
+ /** Rendered QR size in points (default: auto, max 50) */
352
+ qrSize?: number;
353
+ /** Extra QR X offset in points */
354
+ qrOffsetX?: number;
355
+ /** Extra QR Y offset in points */
356
+ qrOffsetY?: number;
357
+ /** Vertical content alignment (alias for verticalAlign) */
358
+ contentAlign?: "top" | "middle" | "bottom";
359
+ /** Vertical content alignment (default: "top") */
360
+ verticalAlign?: "top" | "middle" | "bottom";
348
361
  };
349
362
 
350
363
  type QrCodeConfig = {
@@ -1 +1 @@
1
- {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EACT,WAAW,EACX,QAAQ,EACR,OAAO,EACT,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAIpE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACpC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,mBAAmB,EAC/B,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,OAAO,EAAE;IACN,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,UAAU,CAAC;IACpB,aAAa,CAAC,EAAE,QAAQ,CAAC;CAC3B,GACD,IAAI,CAoDN;AAiGD;;;GAGG;AACH,wBAAgB,uBAAuB,CACpC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,OAAO,EAAE,UAAU,EACnB,QAAQ,CAAC,EAAE,YAAY,GACvB,QAAQ,CAIV"}
1
+ {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EACT,WAAW,EACX,QAAQ,EACR,OAAO,EACT,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAWpE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACpC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,mBAAmB,EAC/B,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,OAAO,EAAE;IACN,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,UAAU,CAAC;IACpB,aAAa,CAAC,EAAE,QAAQ,CAAC;CAC3B,GACD,IAAI,CA8EN;AA+GD;;;GAGG;AACH,wBAAgB,uBAAuB,CACpC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,OAAO,EAAE,UAAU,EACnB,QAAQ,CAAC,EAAE,YAAY,GACvB,QAAQ,CAIV"}
@@ -224,7 +224,13 @@ var signatureAppearanceSchema = z.object({
224
224
  height: z.number().positive(),
225
225
  page: z.number().int().min(0).optional(),
226
226
  showQrCode: z.boolean().optional(),
227
- showCertInfo: z.boolean().optional()
227
+ showCertInfo: z.boolean().optional(),
228
+ padding: z.number().nonnegative().optional(),
229
+ qrSize: z.number().positive().optional(),
230
+ qrOffsetX: z.number().optional(),
231
+ qrOffsetY: z.number().optional(),
232
+ contentAlign: z.enum(["top", "middle", "bottom"]).optional(),
233
+ verticalAlign: z.enum(["top", "middle", "bottom"]).optional()
228
234
  });
229
235
  var qrCodeConfigSchema = z.object({
230
236
  data: z.string().optional(),
@@ -383,13 +389,37 @@ import {
383
389
  // src/appearance.ts
384
390
  import { generateQrCode } from "@f-o-t/qrcode";
385
391
  var VALIDATION_URL = "https://validar.iti.gov.br";
392
+ var DEFAULT_PADDING = 5;
393
+ var DEFAULT_QR_TEXT_GAP = 7;
394
+ var MAX_QR_SIZE = 50;
395
+ var HEADER_FONT_SIZE = 6;
396
+ var BODY_FONT_SIZE = 5;
397
+ var LINE_HEIGHT = 7;
398
+ var HEADER_TO_FIRST_LINE = LINE_HEIGHT * 1.2;
386
399
  function drawSignatureAppearance(doc, page, appearance, certInfo, options) {
387
400
  const { x, width, height } = appearance;
388
401
  const showQrCode = appearance.showQrCode !== false;
389
402
  const showCertInfo = appearance.showCertInfo !== false;
403
+ const padding = Math.max(0, appearance.padding ?? DEFAULT_PADDING);
404
+ const verticalAlign = appearance.verticalAlign ?? appearance.contentAlign ?? "top";
390
405
  const y = page.height - appearance.y - height;
406
+ const innerHeight = Math.max(0, height - padding * 2);
407
+ const innerTop = y + height - padding;
408
+ const innerLeft = x + padding;
391
409
  let qrSize = 0;
392
410
  if (showQrCode) {
411
+ const maxQrSize = Math.max(0, Math.min(MAX_QR_SIZE, innerHeight));
412
+ const requestedQrSize = appearance.qrSize ?? maxQrSize;
413
+ qrSize = Math.max(0, Math.min(requestedQrSize, maxQrSize));
414
+ }
415
+ const textMetrics = getTextMetrics(certInfo);
416
+ const contentHeight = Math.min(innerHeight, Math.max(showQrCode ? qrSize : 0, showCertInfo ? textMetrics.height : 0));
417
+ const verticalOffset = verticalAlign === "middle" ? (innerHeight - contentHeight) / 2 : verticalAlign === "bottom" ? innerHeight - contentHeight : 0;
418
+ const contentTopY = innerTop - verticalOffset;
419
+ const qrTopY = contentTopY + (appearance.qrOffsetY ?? 0);
420
+ const qrX = innerLeft + (appearance.qrOffsetX ?? 0);
421
+ const textX = innerLeft + (showQrCode && qrSize > 0 ? qrSize + DEFAULT_QR_TEXT_GAP : 0);
422
+ if (showQrCode && qrSize > 0) {
393
423
  const qrImage = options.preEmbeddedQr ?? (() => {
394
424
  const qrData = options.qrCode?.data ?? VALIDATION_URL;
395
425
  const qrPng = generateQrCode(qrData, {
@@ -397,21 +427,17 @@ function drawSignatureAppearance(doc, page, appearance, certInfo, options) {
397
427
  });
398
428
  return doc.embedPng(qrPng);
399
429
  })();
400
- qrSize = Math.min(50, height - 15);
401
430
  page.drawImage(qrImage, {
402
- x: x + 5,
403
- y: y + height - 11 - qrSize,
431
+ x: qrX,
432
+ y: qrTopY - qrSize,
404
433
  width: qrSize,
405
434
  height: qrSize
406
435
  });
407
436
  }
408
437
  if (showCertInfo) {
409
438
  drawCertInfo(page, certInfo, {
410
- x,
411
- y,
412
- width,
413
- height,
414
- qrOffset: qrSize > 0 ? qrSize + 12 : 8
439
+ textX,
440
+ textY: contentTopY
415
441
  });
416
442
  }
417
443
  const linkText = "validar.iti.gov.br";
@@ -424,17 +450,17 @@ function drawSignatureAppearance(doc, page, appearance, certInfo, options) {
424
450
  });
425
451
  }
426
452
  function drawCertInfo(page, certInfo, opts) {
427
- const textX = opts.x + opts.qrOffset;
428
- let textY = opts.y + opts.height - 11;
429
- const fontSize = 5;
430
- const lineHeight = 7;
453
+ const textX = opts.textX;
454
+ let textY = opts.textY;
455
+ const fontSize = BODY_FONT_SIZE;
456
+ const lineHeight = LINE_HEIGHT;
431
457
  page.drawText("ASSINADO DIGITALMENTE", {
432
458
  x: textX,
433
459
  y: textY,
434
- size: 6,
460
+ size: HEADER_FONT_SIZE,
435
461
  color: "#008000"
436
462
  });
437
- textY -= lineHeight * 1.2;
463
+ textY -= HEADER_TO_FIRST_LINE;
438
464
  if (certInfo) {
439
465
  let signerName = certInfo.subject.commonName || "N/A";
440
466
  signerName = signerName.replace(/:\d{11,14}$/, "").trim();
@@ -491,6 +517,22 @@ function drawCertInfo(page, certInfo, opts) {
491
517
  });
492
518
  }
493
519
  }
520
+ function getTextMetrics(certInfo) {
521
+ let bodyLines = 1;
522
+ if (certInfo) {
523
+ bodyLines = 1;
524
+ if (certInfo.subject.organization)
525
+ bodyLines += 1;
526
+ if (certInfo.brazilian.cnpj || certInfo.brazilian.cpf)
527
+ bodyLines += 1;
528
+ bodyLines += 1;
529
+ bodyLines += 1;
530
+ }
531
+ const bodySpan = Math.max(0, bodyLines - 1) * LINE_HEIGHT + BODY_FONT_SIZE;
532
+ return {
533
+ height: HEADER_TO_FIRST_LINE + bodySpan
534
+ };
535
+ }
494
536
  function precomputeSharedQrImage(doc, certInfo, pdfData, qrConfig) {
495
537
  const qrData = qrConfig?.data ?? VALIDATION_URL;
496
538
  const qrPng = generateQrCode(qrData, { size: qrConfig?.size ?? 100 });
@@ -678,4 +720,4 @@ class PdfSignError extends Error {
678
720
 
679
721
  export { detectSigningPosition, clearPolicyCache, buildSigningCertificateV2, buildSignaturePolicy, ICP_BRASIL_OIDS, SignaturePolicyError, pdfSignOptionsSchema, TIMESTAMP_SERVERS, TIMESTAMP_TOKEN_OID, requestTimestamp, TimestampError, signPdf, PdfSignError };
680
722
 
681
- //# debugId=C81EE426D32BA92C64756E2164756E21
723
+ //# debugId=DB31A2AAB476341064756E2164756E21
@@ -4,12 +4,12 @@
4
4
  "sourcesContent": [
5
5
  "import { PDFReader } from \"@f-o-t/pdf\";\nimport type { DetectedPosition, DetectPositionOptions } from \"./types.ts\";\n\nconst KEYWORD_PATTERNS = [\n \"assinatura\",\n \"assine\",\n \"representante\",\n \"responsável\",\n \"responsavel\",\n \"signatário\",\n \"signatario\",\n];\n\nconst LINE_PATTERN = /_{5,}|-{5,}/;\n\ntype Signal = {\n page: number;\n weight: number;\n position: number; // 0=top, 1=bottom as fraction of page\n};\n\n/**\n * Detect the best position to place a digital signature on a PDF.\n *\n * Uses weighted scoring across three signal types:\n * - Signer name match (weight 3)\n * - Horizontal line patterns (weight 2)\n * - Signature keywords (weight 1)\n *\n * Returns null if the PDF cannot be parsed.\n */\nexport function detectSigningPosition(\n pdfData: Uint8Array,\n options: DetectPositionOptions = {},\n): DetectedPosition | null {\n let pages;\n try {\n const reader = new PDFReader(pdfData);\n const parsed = reader.parse();\n pages = parsed.pages;\n } catch {\n return null;\n }\n\n if (pages.length === 0) return null;\n\n const signals: Signal[] = [];\n const preferredPage =\n options.preferredPage === -1\n ? pages.length - 1\n : (options.preferredPage ?? pages.length - 1);\n\n // Only scan the last few pages for signals — signatures are\n // almost always near the end, and scanning every page of a\n // large document is expensive (causes browser freezes).\n const scanStart = Math.max(0, pages.length - 3);\n for (let i = scanStart; i < pages.length; i++) {\n const page = pages[i]!;\n const text = page.content.toLowerCase();\n\n // Signal 1: Signer name (weight 3)\n if (options.signerName) {\n const name = options.signerName.toLowerCase();\n if (text.includes(name)) {\n const idx = text.indexOf(name);\n const position = text.length > 0 ? idx / text.length : 0.5;\n signals.push({ page: i, weight: 3, position });\n }\n }\n\n // Signal 1b: Organization name (weight 2.5)\n if (options.organization) {\n const org = options.organization.toLowerCase();\n if (text.includes(org)) {\n const idx = text.indexOf(org);\n const position = text.length > 0 ? idx / text.length : 0.5;\n signals.push({ page: i, weight: 2.5, position });\n }\n }\n\n // Signal 2: Line patterns (weight 2)\n if (LINE_PATTERN.test(text)) {\n const idx = text.search(LINE_PATTERN);\n const position = text.length > 0 ? idx / text.length : 0.5;\n signals.push({ page: i, weight: 2, position });\n }\n\n // Signal 3: Keywords (weight 1)\n for (const keyword of KEYWORD_PATTERNS) {\n if (text.includes(keyword)) {\n const idx = text.indexOf(keyword);\n const position = text.length > 0 ? idx / text.length : 0.5;\n signals.push({ page: i, weight: 1, position });\n break;\n }\n }\n }\n\n // No signals: fallback to bottom of last page, centered horizontally\n if (signals.length === 0) {\n const lastPage = pages[pages.length - 1]!;\n const sigWidth = options.width ?? 260;\n return {\n page: pages.length - 1,\n x: Math.max(10, (lastPage.size.width - sigWidth) / 2),\n y: lastPage.size.height - 150,\n confidence: 0.1,\n };\n }\n\n // Group signals by page\n const pageScores = new Map<\n number,\n { totalWeight: number; bestPosition: number; bestWeight: number }\n >();\n for (const signal of signals) {\n const existing = pageScores.get(signal.page);\n if (existing) {\n existing.totalWeight += signal.weight;\n if (signal.weight > existing.bestWeight) {\n existing.bestWeight = signal.weight;\n existing.bestPosition = signal.position;\n }\n } else {\n pageScores.set(signal.page, {\n totalWeight: signal.weight,\n bestPosition: signal.position,\n bestWeight: signal.weight,\n });\n }\n }\n\n // Boost preferred page\n const preferredScore = pageScores.get(preferredPage);\n if (preferredScore) {\n preferredScore.totalWeight *= 1.2;\n }\n\n // Pick best page\n let bestPage = preferredPage;\n let bestScore = 0;\n for (const [page, score] of pageScores) {\n if (score.totalWeight > bestScore) {\n bestScore = score.totalWeight;\n bestPage = page;\n }\n }\n\n const pageInfo = pages[bestPage]!;\n const pageScore = pageScores.get(bestPage)!;\n\n // Position above the best match\n const yFraction = pageScore.bestPosition;\n const sigHeight = options.height ?? 120;\n const yFromTop = Math.max(\n 10,\n yFraction * pageInfo.size.height - sigHeight - 20,\n );\n\n const maxWeight = 3 + 2.5 + 2 + 1;\n const confidence = Math.min(1, bestScore / maxWeight);\n\n return {\n page: bestPage,\n x: options.width ? (pageInfo.size.width - options.width) / 2 : 50,\n y: yFromTop,\n confidence,\n };\n}\n",
6
6
  "/**\n * ICP-Brasil Attributes for PAdES Signatures\n *\n * Implements the id-aa-signingCertificateV2 (RFC 5035) and\n * id-aa-ets-sigPolicyId attributes required by ICP-Brasil.\n *\n * Uses @f-o-t/asn1 for ASN.1 construction and @f-o-t/crypto for hashing.\n */\n\nimport {\n type Asn1Node,\n contextTag,\n decodeDer,\n encodeDer,\n ia5String,\n nullValue,\n octetString,\n oid,\n sequence,\n} from \"@f-o-t/asn1\";\nimport { hash } from \"@f-o-t/crypto\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** SHA-256 Algorithm OID */\nconst SHA256_OID = \"2.16.840.1.101.3.4.2.1\";\n\n/** id-aa-signingCertificateV2 OID (RFC 5035) */\nconst SIGNING_CERTIFICATE_V2_OID = \"1.2.840.113549.1.9.16.2.47\";\n\n/** id-aa-ets-sigPolicyId OID */\nconst SIGNATURE_POLICY_OID = \"1.2.840.113549.1.9.16.2.15\";\n\n/** ICP-Brasil PAdES Policy (PA_PAdES_AD_RB_v1_1) */\nconst POLICY_CONFIG = {\n OID: \"2.16.76.1.7.1.11.1.1\",\n URL: \"http://politicas.icpbrasil.gov.br/PA_PAdES_AD_RB_v1_1.der\",\n} as const;\n\n/** id-spq-ets-uri OID */\nconst SPQ_ETS_URI_OID = \"1.2.840.113549.1.9.16.5.1\";\n\n// ---------------------------------------------------------------------------\n// Cached policy data\n// ---------------------------------------------------------------------------\n\nlet cachedPolicyData: {\n hashAlgOid: string;\n policyHash: Uint8Array;\n} | null = null;\n\n/**\n * Clear the cached signature policy data.\n * Useful for testing or forcing a re-download.\n */\nexport function clearPolicyCache(): void {\n cachedPolicyData = null;\n}\n\n// ---------------------------------------------------------------------------\n// Signing Certificate V2\n// ---------------------------------------------------------------------------\n\n/**\n * Build the id-aa-signingCertificateV2 attribute value (DER-encoded).\n *\n * This attribute links the signature to the specific certificate used to\n * create it, preventing substitution attacks.\n *\n * ASN.1 structure (RFC 5035):\n *\n * SigningCertificateV2 ::= SEQUENCE {\n * certs SEQUENCE OF ESSCertIDv2\n * }\n *\n * ESSCertIDv2 ::= SEQUENCE {\n * hashAlgorithm AlgorithmIdentifier DEFAULT {algorithm id-sha256},\n * certHash Hash,\n * issuerSerial IssuerSerial OPTIONAL\n * }\n *\n * IssuerSerial ::= SEQUENCE {\n * issuer GeneralNames,\n * serialNumber CertificateSerialNumber\n * }\n *\n * @param certDer - DER-encoded X.509 certificate\n * @returns DER-encoded SigningCertificateV2 value\n */\nexport function buildSigningCertificateV2(certDer: Uint8Array): Uint8Array {\n // 1. Hash the DER certificate with SHA-256\n const certHash = hash(\"sha256\", certDer);\n\n // 2. Build AlgorithmIdentifier for SHA-256\n const hashAlgId = sequence(oid(SHA256_OID), nullValue());\n\n // 3. Extract issuer and serial number from the certificate\n const cert = decodeDer(certDer);\n const tbsCert = (cert.value as Asn1Node[])[0]!;\n const tbs = tbsCert.value as Asn1Node[];\n\n // version is [0] EXPLICIT, so tbs[0] may be version context tag\n let idx = 0;\n if (tbs[0]!.class === \"context\" && tbs[0]!.tag === 0) {\n idx = 1;\n }\n\n const serialNumber = tbs[idx]!; // INTEGER\n const issuerName = tbs[idx + 2]!; // Name SEQUENCE\n\n // 4. Build IssuerSerial\n // IssuerSerial ::= SEQUENCE { issuer GeneralNames, serialNumber INTEGER }\n // GeneralNames ::= SEQUENCE OF GeneralName\n // GeneralName ::= directoryName [4] Name\n const generalName = contextTag(4, [issuerName]);\n const generalNames = sequence(generalName);\n const issuerSerial = sequence(generalNames, serialNumber);\n\n // 5. Build ESSCertIDv2\n const essCertIdV2 = sequence(hashAlgId, octetString(certHash), issuerSerial);\n\n // 6. Build SigningCertificateV2\n const signingCertV2 = sequence(\n // certs SEQUENCE OF ESSCertIDv2\n sequence(essCertIdV2),\n );\n\n return encodeDer(signingCertV2);\n}\n\n// ---------------------------------------------------------------------------\n// Signature Policy\n// ---------------------------------------------------------------------------\n\n/**\n * Download and parse the ICP-Brasil signature policy DER file.\n * Extracts the embedded signPolicyHash from the ASN.1 structure.\n */\nasync function downloadAndParsePolicyDocument(): Promise<{\n hashAlgOid: string;\n policyHash: Uint8Array;\n}> {\n if (cachedPolicyData) {\n return cachedPolicyData;\n }\n\n const response = await fetch(POLICY_CONFIG.URL, {\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n throw new SignaturePolicyError(\n `Failed to download signature policy: HTTP ${response.status}`,\n );\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n if (data.length === 0 || data[0] !== 0x30) {\n throw new SignaturePolicyError(\"Invalid DER format in policy document\");\n }\n\n // Parse the ASN.1 structure:\n // SignaturePolicy ::= SEQUENCE {\n // signPolicyHashAlg AlgorithmIdentifier,\n // signPolicyInfo SignaturePolicyInfo,\n // signPolicyHash OCTET STRING\n // }\n const asn1 = decodeDer(data);\n const children = asn1.value as Asn1Node[];\n\n if (!Array.isArray(children) || children.length < 3) {\n throw new SignaturePolicyError(\n `Unexpected policy structure: expected 3+ children, got ${children?.length}`,\n );\n }\n\n // Child[0] = AlgorithmIdentifier\n const algIdChildren = children[0]!.value as Asn1Node[];\n if (!Array.isArray(algIdChildren) || algIdChildren.length === 0) {\n throw new SignaturePolicyError(\"Invalid AlgorithmIdentifier in policy\");\n }\n\n const { bytesToOid } = await import(\"@f-o-t/asn1\");\n const hashAlgOid = bytesToOid(algIdChildren[0]!.value as Uint8Array);\n\n // Child[2] = signPolicyHash (OCTET STRING)\n const hashNode = children[2]!;\n if (hashNode.tag !== 0x04) {\n throw new SignaturePolicyError(\n `Expected OCTET STRING at child[2], got tag 0x${hashNode.tag.toString(16)}`,\n );\n }\n\n cachedPolicyData = {\n hashAlgOid,\n policyHash: hashNode.value as Uint8Array,\n };\n\n return cachedPolicyData;\n}\n\n/**\n * Build the id-aa-ets-sigPolicyId attribute value (DER-encoded).\n *\n * Downloads the ICP-Brasil PAdES signature policy and extracts the\n * embedded signPolicyHash to build the attribute.\n *\n * @returns DER-encoded SignaturePolicyIdentifier value\n */\nexport async function buildSignaturePolicy(): Promise<Uint8Array> {\n const { hashAlgOid, policyHash } = await downloadAndParsePolicyDocument();\n\n // AlgorithmIdentifier for hash (no NULL — matches policy encoding)\n const hashAlgId = sequence(oid(hashAlgOid));\n\n // SigPolicyHash (OtherHashAlgAndValue)\n const sigPolicyHash = sequence(hashAlgId, octetString(policyHash));\n\n // SigPolicyQualifiers with policy URL\n const sigPolicyQualifiers = sequence(\n sequence(\n // id-spq-ets-uri\n oid(SPQ_ETS_URI_OID),\n // Policy URL as IA5String\n ia5String(POLICY_CONFIG.URL),\n ),\n );\n\n // SignaturePolicyId\n const signaturePolicyId = sequence(\n // sigPolicyId (policy OID)\n oid(POLICY_CONFIG.OID),\n // sigPolicyHash\n sigPolicyHash,\n // sigPolicyQualifiers\n sigPolicyQualifiers,\n );\n\n return encodeDer(signaturePolicyId);\n}\n\n/**\n * Attribute OID constants for external use\n */\nexport const ICP_BRASIL_OIDS = {\n signingCertificateV2: SIGNING_CERTIFICATE_V2_OID,\n signaturePolicy: SIGNATURE_POLICY_OID,\n} as const;\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\nexport class SignaturePolicyError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SignaturePolicyError\";\n }\n}\n",
7
- "/**\n * Zod schemas for input validation\n */\n\nimport { z } from \"zod\";\n\nconst signatureAppearanceSchema = z.object({\n x: z.number(),\n y: z.number(),\n width: z.number().positive(),\n height: z.number().positive(),\n page: z.number().int().min(0).optional(),\n showQrCode: z.boolean().optional(),\n showCertInfo: z.boolean().optional(),\n});\n\nconst qrCodeConfigSchema = z.object({\n data: z.string().optional(),\n size: z.number().int().positive().optional(),\n});\n\nexport const pdfSignOptionsSchema = z.object({\n certificate: z.object({\n p12: z.instanceof(Uint8Array).refine((v) => v.length > 0, {\n message: \"P12 data must not be empty\",\n }),\n password: z.string(),\n name: z.string().optional(),\n }),\n reason: z.string().optional(),\n location: z.string().optional(),\n contactInfo: z.string().optional(),\n policy: z.enum([\"pades-ades\", \"pades-icp-brasil\"]).optional(),\n timestamp: z.boolean().optional(),\n tsaUrl: z.string().url().optional(),\n tsaTimeout: z.number().positive().optional(),\n tsaRetries: z.number().int().min(0).optional(),\n tsaFallbackUrls: z.array(z.string().url()).optional(),\n onTimestampError: z\n .function({ input: z.tuple([z.unknown()]), output: z.void() })\n .optional(),\n appearance: z\n .union([signatureAppearanceSchema, z.literal(\"auto\"), z.literal(false)])\n .optional(),\n appearances: z.array(signatureAppearanceSchema).optional(),\n qrCode: qrCodeConfigSchema.optional(),\n docMdpPermission: z\n .union([z.literal(1), z.literal(2), z.literal(3)])\n .optional(),\n});\n",
7
+ "/**\n * Zod schemas for input validation\n */\n\nimport { z } from \"zod\";\n\nconst signatureAppearanceSchema = z.object({\n x: z.number(),\n y: z.number(),\n width: z.number().positive(),\n height: z.number().positive(),\n page: z.number().int().min(0).optional(),\n showQrCode: z.boolean().optional(),\n showCertInfo: z.boolean().optional(),\n padding: z.number().nonnegative().optional(),\n qrSize: z.number().positive().optional(),\n qrOffsetX: z.number().optional(),\n qrOffsetY: z.number().optional(),\n contentAlign: z.enum([\"top\", \"middle\", \"bottom\"]).optional(),\n verticalAlign: z.enum([\"top\", \"middle\", \"bottom\"]).optional(),\n});\n\nconst qrCodeConfigSchema = z.object({\n data: z.string().optional(),\n size: z.number().int().positive().optional(),\n});\n\nexport const pdfSignOptionsSchema = z.object({\n certificate: z.object({\n p12: z.instanceof(Uint8Array).refine((v) => v.length > 0, {\n message: \"P12 data must not be empty\",\n }),\n password: z.string(),\n name: z.string().optional(),\n }),\n reason: z.string().optional(),\n location: z.string().optional(),\n contactInfo: z.string().optional(),\n policy: z.enum([\"pades-ades\", \"pades-icp-brasil\"]).optional(),\n timestamp: z.boolean().optional(),\n tsaUrl: z.string().url().optional(),\n tsaTimeout: z.number().positive().optional(),\n tsaRetries: z.number().int().min(0).optional(),\n tsaFallbackUrls: z.array(z.string().url()).optional(),\n onTimestampError: z\n .function({ input: z.tuple([z.unknown()]), output: z.void() })\n .optional(),\n appearance: z\n .union([signatureAppearanceSchema, z.literal(\"auto\"), z.literal(false)])\n .optional(),\n appearances: z.array(signatureAppearanceSchema).optional(),\n qrCode: qrCodeConfigSchema.optional(),\n docMdpPermission: z\n .union([z.literal(1), z.literal(2), z.literal(3)])\n .optional(),\n});\n",
8
8
  "/**\n * RFC 3161 Timestamp Client\n *\n * Requests trusted timestamps from TSA servers using native fetch.\n * Builds the TimeStampReq using @f-o-t/asn1 instead of forge.\n */\n\nimport {\n type Asn1Node,\n boolean as asn1Boolean,\n decodeDer,\n encodeDer,\n integer,\n octetString,\n oid,\n sequence,\n} from \"@f-o-t/asn1\";\nimport { hash } from \"@f-o-t/crypto\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Well-known hash algorithm OIDs */\nconst HASH_OIDS: Record<string, string> = {\n sha256: \"2.16.840.1.101.3.4.2.1\",\n sha384: \"2.16.840.1.101.3.4.2.2\",\n sha512: \"2.16.840.1.101.3.4.2.3\",\n};\n\n/** ICP-Brasil Approved Timestamp Servers */\nexport const TIMESTAMP_SERVERS = {\n VALID: \"http://timestamp.valid.com.br/tsa\",\n SAFEWEB: \"http://tsa.safeweb.com.br/tsa/tsa\",\n CERTISIGN: \"http://timestamp.certisign.com.br\",\n} as const;\n\n/** id-smime-aa-timeStampToken OID */\nexport const TIMESTAMP_TOKEN_OID = \"1.2.840.113549.1.9.16.2.14\";\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Request a timestamp from a TSA server with retry and fallback support.\n *\n * @param dataToTimestamp - The data to timestamp (usually the signature value)\n * @param tsaUrl - URL of the primary timestamp server\n * @param hashAlgorithm - Hash algorithm to use (default: \"sha256\")\n * @param options - Resilience options (timeout, retries, fallback URLs)\n * @returns DER-encoded TimeStampToken\n */\nexport async function requestTimestamp(\n dataToTimestamp: Uint8Array,\n tsaUrl: string,\n hashAlgorithm: \"sha256\" | \"sha384\" | \"sha512\" = \"sha256\",\n options?: {\n tsaTimeout?: number;\n tsaRetries?: number;\n tsaFallbackUrls?: string[];\n },\n): Promise<Uint8Array> {\n // 1. Hash the data\n const messageHash = hash(hashAlgorithm, dataToTimestamp);\n\n // 2. Build TimeStampReq\n const timestampReq = buildTimestampRequest(messageHash, hashAlgorithm);\n\n const tsaTimeout = options?.tsaTimeout ?? 10000;\n const tsaRetries = options?.tsaRetries ?? 0;\n const tsaFallbackUrls = options?.tsaFallbackUrls ?? [];\n\n let lastError: Error | undefined;\n\n // 3. Try primary server: 1 initial attempt + tsaRetries retries\n for (let attempt = 1; attempt <= 1 + tsaRetries; attempt++) {\n if (attempt > 1) {\n await sleep(2 ** (attempt - 2) * 1000);\n }\n try {\n return await fetchTimestamp(tsaUrl, timestampReq, tsaTimeout);\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n }\n }\n\n // 4. Try fallback servers (one attempt each, no delay)\n for (const fallbackUrl of tsaFallbackUrls) {\n try {\n return await fetchTimestamp(fallbackUrl, timestampReq, tsaTimeout);\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n }\n }\n\n // 5. All servers failed\n const fallbackList =\n tsaFallbackUrls.length > 0\n ? `, fallbacks: [${tsaFallbackUrls.join(\", \")}]`\n : \"\";\n throw new TimestampError(\n `TSA request failed: all servers unreachable (primary: ${tsaUrl}${fallbackList}). Last error: ${lastError?.message ?? \"unknown\"}`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Internal\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Perform a single TSA fetch attempt, wrapping network errors with a descriptive message.\n */\nasync function fetchTimestamp(\n url: string,\n timestampReq: Uint8Array,\n timeoutMs: number,\n): Promise<Uint8Array> {\n let response: Response;\n try {\n response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/timestamp-query\",\n },\n body: timestampReq as unknown as BodyInit,\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`TSA server unreachable: ${url} — ${msg}`);\n }\n\n if (!response.ok) {\n throw new TimestampError(`TSA returned HTTP ${response.status}`);\n }\n\n const respBuffer = new Uint8Array(await response.arrayBuffer());\n return extractTimestampToken(respBuffer);\n}\n\n/**\n * Build a TimeStampReq (RFC 3161) as DER bytes.\n *\n * TimeStampReq ::= SEQUENCE {\n * version INTEGER { v1(1) },\n * messageImprint MessageImprint,\n * certReq BOOLEAN DEFAULT FALSE\n * }\n *\n * MessageImprint ::= SEQUENCE {\n * hashAlgorithm AlgorithmIdentifier,\n * hashedMessage OCTET STRING\n * }\n */\nfunction buildTimestampRequest(\n messageHash: Uint8Array,\n hashAlgorithm: string,\n): Uint8Array {\n const hashOid = HASH_OIDS[hashAlgorithm];\n if (!hashOid) {\n throw new TimestampError(`Unsupported hash algorithm: ${hashAlgorithm}`);\n }\n\n const timestampReq = sequence(\n // version = 1\n integer(1),\n // messageImprint\n sequence(\n // hashAlgorithm AlgorithmIdentifier\n sequence(oid(hashOid)),\n // hashedMessage OCTET STRING\n octetString(messageHash),\n ),\n // certReq = TRUE (request certificate in response)\n asn1Boolean(true),\n );\n\n return encodeDer(timestampReq);\n}\n\n/**\n * Extract the TimeStampToken from a TimeStampResp.\n *\n * TimeStampResp ::= SEQUENCE {\n * status PKIStatusInfo,\n * timeStampToken TimeStampToken OPTIONAL\n * }\n *\n * PKIStatusInfo ::= SEQUENCE {\n * status PKIStatus, -- INTEGER\n * ...\n * }\n */\nfunction extractTimestampToken(respDer: Uint8Array): Uint8Array {\n let resp: Asn1Node;\n try {\n resp = decodeDer(respDer);\n } catch {\n throw new TimestampError(\"Invalid timestamp response: not valid DER\");\n }\n\n const children = resp.value as Asn1Node[];\n if (!Array.isArray(children) || children.length < 1) {\n throw new TimestampError(\n \"Invalid timestamp response: unexpected structure\",\n );\n }\n\n // Check status\n const statusInfo = children[0]!.value as Asn1Node[];\n const statusBytes = statusInfo[0]!.value as Uint8Array;\n // Status 0 = granted, 1 = grantedWithMods\n const statusValue = statusBytes[statusBytes.length - 1]!;\n if (statusValue !== 0 && statusValue !== 1) {\n throw new TimestampError(\n `Timestamp request rejected with status: ${statusValue}`,\n );\n }\n\n // Extract token (second child)\n if (!children[1]) {\n throw new TimestampError(\"Timestamp response does not contain a token\");\n }\n\n return encodeDer(children[1]);\n}\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\nexport class TimestampError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TimestampError\";\n }\n}\n",
9
9
  "/**\n * PDF Signing — Main Entry Point\n *\n * Signs a PDF document using PAdES format with optional ICP-Brasil compliance.\n *\n * Flow:\n * 1. Parse certificate for display info\n * 2. Load PDF and draw visual appearance\n * 3. Save PDF with signature placeholder\n * 4. Find byte range and extract bytes to sign\n * 5. Build CMS/PKCS#7 SignedData with ICP-Brasil attributes\n * 6. Embed signature into PDF\n */\n\nimport type { Asn1Node } from \"@f-o-t/asn1\";\nimport { decodeDer } from \"@f-o-t/asn1\";\nimport type { CmsAttribute } from \"@f-o-t/crypto\";\nimport {\n appendUnauthAttributes,\n createSignedData,\n parsePkcs12,\n} from \"@f-o-t/crypto\";\nimport type { CertificateInfo } from \"@f-o-t/digital-certificate\";\nimport { parseCertificateFromDer } from \"@f-o-t/digital-certificate\";\nimport {\n embedSignature,\n extractBytesToSign,\n findByteRange,\n loadPdf,\n} from \"@f-o-t/pdf/plugins/editing\";\nimport {\n drawSignatureAppearance,\n precomputeSharedQrImage,\n} from \"./appearance.ts\";\nimport { detectSigningPosition } from \"./detect-position.ts\";\nimport {\n buildSignaturePolicy,\n buildSigningCertificateV2,\n ICP_BRASIL_OIDS,\n} from \"./icp-brasil.ts\";\nimport { pdfSignOptionsSchema } from \"./schemas.ts\";\nimport { requestTimestamp, TIMESTAMP_TOKEN_OID } from \"./timestamp.ts\";\nimport type { PdfSignOptions, SignatureAppearance } from \"./types.ts\";\n\n/**\n * Sign a PDF document with a digital certificate.\n *\n * Supports PAdES-BES and PAdES with ICP-Brasil compliance\n * (signing-certificate-v2 and signature-policy attributes).\n *\n * @param pdf - The PDF document as a Uint8Array or ReadableStream<Uint8Array>\n * @param options - Signing options\n * @returns The signed PDF as a Uint8Array\n *\n * @example\n * ```ts\n * const signedPdf = await signPdf(pdfBytes, {\n * certificate: { p12, password: \"secret\" },\n * reason: \"Document approval\",\n * location: \"Corporate Office\",\n * policy: \"pades-icp-brasil\",\n * });\n * ```\n */\nexport async function signPdf(\n pdf: Uint8Array | ReadableStream<Uint8Array>,\n options: PdfSignOptions,\n): Promise<Uint8Array> {\n // Accumulate ReadableStream into Uint8Array if needed\n let pdfBytes: Uint8Array;\n if (pdf instanceof ReadableStream) {\n const chunks: Uint8Array[] = [];\n const reader = pdf.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n const totalLength = chunks.reduce((sum, c) => sum + c.length, 0);\n pdfBytes = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n pdfBytes.set(chunk, offset);\n offset += chunk.length;\n }\n } else {\n pdfBytes = pdf;\n }\n\n // Validate input\n const opts = pdfSignOptionsSchema.parse(options);\n\n // 1. Parse PKCS#12 early — needed both for display info and for sizing the\n // signature placeholder accurately based on the actual certificate chain length.\n const { certificate, privateKey, chain } = await parsePkcs12(\n opts.certificate.p12,\n opts.certificate.password,\n );\n\n // 1b. Build display info from already-parsed cert (avoids second P12 parse)\n let certInfo: CertificateInfo | null = null;\n try {\n certInfo = parseCertificateFromDer(\n certificate,\n privateKey,\n opts.certificate.p12,\n opts.certificate.password,\n );\n } catch {\n // If parsing fails, continue without cert info for display\n }\n\n // 2. Load PDF via editing plugin (single parse — reused for drawing + saving)\n const doc = loadPdf(pdfBytes);\n\n // Resolve \"auto\" appearance — stamp on ALL pages\n let resolvedAppearance: Exclude<typeof opts.appearance, \"auto\"> | undefined;\n let autoAppearances: SignatureAppearance[] | undefined;\n\n if (opts.appearance === \"auto\") {\n const width = 260;\n const height = 75;\n\n // Use the already-loaded doc for page dimensions to avoid a second parse.\n // detectSigningPosition still does its own lightweight parse for text scanning,\n // but we use doc.pageCount and page dimensions from the editing plugin.\n const detected = detectSigningPosition(pdfBytes, {\n signerName: certInfo?.subject.commonName ?? undefined,\n organization: certInfo?.subject.organization ?? undefined,\n preferredPage: -1,\n width,\n height,\n });\n\n // Fallback: center horizontally, place near bottom of first page\n const firstPage = doc.getPage(0);\n const baseX = detected?.x ?? Math.max(10, (firstPage.width - width) / 2);\n const baseY = detected?.y ?? Math.max(10, firstPage.height - height - 50);\n\n // Generate one appearance per page\n autoAppearances = [];\n for (let i = 0; i < doc.pageCount; i++) {\n autoAppearances.push({\n x: baseX,\n y: baseY,\n width,\n height,\n page: i,\n });\n }\n\n // Clear single appearance — we use appearances[] instead\n resolvedAppearance = false;\n } else {\n resolvedAppearance = opts.appearance === false ? false : opts.appearance;\n }\n\n // 3. Draw visual signature appearance if requested\n if (resolvedAppearance !== false && resolvedAppearance) {\n const pageIndex = resolvedAppearance.page ?? 0;\n\n if (pageIndex < 0 || pageIndex >= doc.pageCount) {\n throw new PdfSignError(\n `Invalid page index: ${pageIndex}. PDF has ${doc.pageCount} pages.`,\n );\n }\n\n const page = doc.getPage(pageIndex);\n\n drawSignatureAppearance(doc, page, resolvedAppearance, certInfo, {\n reason: opts.reason,\n location: opts.location,\n qrCode: opts.qrCode,\n pdfData: pdfBytes,\n });\n }\n\n // 3b. Draw multiple visual signature appearances\n const allAppearances = [\n ...(autoAppearances ?? []),\n ...(opts.appearances ?? []),\n ];\n\n if (allAppearances.length > 0) {\n const needsQr = allAppearances.some((a) => a.showQrCode !== false);\n const sharedQrImage = needsQr\n ? precomputeSharedQrImage(doc, certInfo, pdfBytes, opts.qrCode)\n : undefined;\n\n for (const app of allAppearances) {\n const pageIndex = app.page ?? 0;\n\n if (pageIndex < 0 || pageIndex >= doc.pageCount) {\n throw new PdfSignError(\n `Invalid page index ${pageIndex} in appearances. PDF has ${doc.pageCount} pages.`,\n );\n }\n\n const page = doc.getPage(pageIndex);\n\n drawSignatureAppearance(doc, page, app, certInfo, {\n reason: opts.reason,\n location: opts.location,\n qrCode: opts.qrCode,\n pdfData: pdfBytes,\n preEmbeddedQr: sharedQrImage,\n });\n }\n }\n\n // 4. Save with signature placeholder\n const signerName =\n certInfo?.subject.commonName ||\n opts.certificate.name ||\n \"Digital Signature\";\n\n // Dynamic placeholder size: base 8 KB + 2× actual cert chain + 4 KB for a\n // timestamp token (if configured). Prevents \"Signature too large\" failures for\n // certificates with long chains (5+ certs) or large RSA keys.\n const certChainBytes =\n certificate.length + chain.reduce((sum, c) => sum + c.length, 0);\n const signatureLength = Math.max(\n 16384,\n certChainBytes * 2 + (opts.tsaUrl ? 4096 : 0) + 8192,\n );\n\n // Which page hosts the widget annotation — must match the visual appearance\n // page so PDF readers navigate to the right page when a signature is clicked.\n const appearancePage = resolvedAppearance\n ? ((resolvedAppearance as { page?: number }).page ?? 0)\n : (opts.appearances?.[0]?.page ?? 0);\n\n const { pdf: pdfWithPlaceholder } = doc.saveWithPlaceholder({\n reason: opts.reason || \"Digitally signed\",\n name: signerName,\n location: opts.location,\n contactInfo: opts.contactInfo,\n signatureLength,\n docMdpPermission: opts.docMdpPermission ?? 2,\n appearancePage,\n });\n\n // 5. Find byte range and extract bytes to sign\n const { byteRange } = findByteRange(pdfWithPlaceholder);\n const bytesToSign = extractBytesToSign(pdfWithPlaceholder, byteRange);\n\n // 6. Cryptographic material already parsed in step 1\n\n // 7. Build ICP-Brasil authenticated attributes if needed\n const authenticatedAttributes: CmsAttribute[] = [];\n\n if (opts.policy === \"pades-icp-brasil\") {\n // signing-certificate-v2\n const sigCertV2 = buildSigningCertificateV2(certificate);\n authenticatedAttributes.push({\n oid: ICP_BRASIL_OIDS.signingCertificateV2,\n values: [sigCertV2],\n });\n\n // signature-policy\n try {\n const sigPolicy = await buildSignaturePolicy();\n authenticatedAttributes.push({\n oid: ICP_BRASIL_OIDS.signaturePolicy,\n values: [sigPolicy],\n });\n } catch {\n // Policy download failure is non-fatal\n // The signature will still be valid PAdES-BES\n }\n }\n\n // 8. Build unauthenticated attributes\n const unauthenticatedAttributes: CmsAttribute[] = [];\n\n // 9. Create CMS/PKCS#7 SignedData\n const signedData = await createSignedData({\n content: bytesToSign,\n certificate,\n privateKey,\n chain,\n hashAlgorithm: \"sha256\",\n authenticatedAttributes:\n authenticatedAttributes.length > 0\n ? authenticatedAttributes\n : undefined,\n unauthenticatedAttributes:\n unauthenticatedAttributes.length > 0\n ? unauthenticatedAttributes\n : undefined,\n detached: true,\n });\n\n // 10. Optionally request timestamp and embed as unauthenticated attribute\n if (opts.timestamp && opts.tsaUrl) {\n try {\n const tsToken = await requestTimestamp(\n extractSignatureValue(signedData),\n opts.tsaUrl,\n \"sha256\",\n {\n tsaTimeout: opts.tsaTimeout,\n tsaRetries: opts.tsaRetries,\n tsaFallbackUrls: opts.tsaFallbackUrls,\n },\n );\n unauthenticatedAttributes.push({\n oid: TIMESTAMP_TOKEN_OID,\n values: [tsToken],\n });\n } catch (err) {\n // Timestamp failure is non-fatal\n opts.onTimestampError?.(err);\n }\n }\n\n // 11. Patch timestamp token into SignedData as unauthenticated attribute (no re-signing)\n const finalSignedData = appendUnauthAttributes(\n signedData,\n unauthenticatedAttributes,\n );\n\n // 12. Embed signature into PDF\n return embedSignature(pdfWithPlaceholder, finalSignedData);\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the raw signature value bytes from a DER-encoded CMS ContentInfo.\n *\n * Per CAdES (ETSI EN 319 122-1) / RFC 5126 §5.5.1, the id-smime-aa-timeStampToken\n * attribute must be a timestamp over the SignerInfo.signature octets, not the\n * full ContentInfo blob.\n *\n * ContentInfo → [0] EXPLICIT → SignedData → signerInfos[0] → signature OCTET STRING\n */\nfunction extractSignatureValue(contentInfoDer: Uint8Array): Uint8Array {\n const contentInfo = decodeDer(contentInfoDer);\n const signedDataNode = (\n (contentInfo.value as Asn1Node[])[1]!.value as Asn1Node[]\n )[0]!;\n // signerInfos is always the last child of SignedData per RFC 5652\n const signerInfosSet = (signedDataNode.value as Asn1Node[]).at(-1)!;\n const signerInfo = (signerInfosSet.value as Asn1Node[])[0]!;\n const signatureNode = (signerInfo.value as Asn1Node[])[5]!;\n return signatureNode.value as Uint8Array;\n}\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\nexport class PdfSignError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PdfSignError\";\n }\n}\n",
10
- "/**\n * Visual Signature Appearance\n *\n * Draws certificate information and QR code on the PDF page\n * following the ICP-Brasil standard visual signature layout.\n */\n\nimport type { CertificateInfo } from \"@f-o-t/digital-certificate\";\nimport type {\n PdfDocument,\n PdfImage,\n PdfPage,\n} from \"@f-o-t/pdf/plugins/editing\";\nimport { generateQrCode } from \"@f-o-t/qrcode\";\nimport type { QrCodeConfig, SignatureAppearance } from \"./types.ts\";\n\nconst VALIDATION_URL = \"https://validar.iti.gov.br\";\n\n/**\n * Draw the visual signature appearance on a PDF page.\n *\n * Includes optional QR code and certificate information text\n * inside a bordered rectangle following ICP-Brasil layout.\n */\nexport function drawSignatureAppearance(\n doc: PdfDocument,\n page: PdfPage,\n appearance: SignatureAppearance,\n certInfo: CertificateInfo | null,\n options: {\n reason?: string;\n location?: string;\n qrCode?: QrCodeConfig;\n pdfData: Uint8Array;\n preEmbeddedQr?: PdfImage;\n },\n): void {\n const { x, width, height } = appearance;\n const showQrCode = appearance.showQrCode !== false;\n const showCertInfo = appearance.showCertInfo !== false;\n\n // Convert from top-left origin (user-facing) to PDF bottom-left origin.\n const y = page.height - appearance.y - height;\n\n let qrSize = 0;\n\n // Draw QR code if requested (enabled by default)\n if (showQrCode) {\n const qrImage =\n options.preEmbeddedQr ??\n (() => {\n const qrData = options.qrCode?.data ?? VALIDATION_URL;\n const qrPng = generateQrCode(qrData, {\n size: options.qrCode?.size ?? 100,\n });\n return doc.embedPng(qrPng);\n })();\n\n qrSize = Math.min(50, height - 15);\n\n page.drawImage(qrImage, {\n x: x + 5,\n y: y + height - 11 - qrSize,\n width: qrSize,\n height: qrSize,\n });\n }\n\n // Draw certificate info text\n if (showCertInfo) {\n drawCertInfo(page, certInfo, {\n x,\n y,\n width,\n height,\n qrOffset: qrSize > 0 ? qrSize + 12 : 8,\n });\n }\n\n // Reference link above the box\n const linkText = \"validar.iti.gov.br\";\n const linkX = x + width / 2 - linkText.length * 2;\n page.drawLink(linkText, VALIDATION_URL, {\n x: linkX,\n y: y + height + 3,\n size: 5,\n color: \"#888888\",\n });\n}\n\n/**\n * Draw certificate information text on the page following ICP-Brasil layout.\n */\nfunction drawCertInfo(\n page: PdfPage,\n certInfo: CertificateInfo | null,\n opts: {\n x: number;\n y: number;\n width: number;\n height: number;\n qrOffset: number;\n },\n): void {\n const textX = opts.x + opts.qrOffset;\n let textY = opts.y + opts.height - 11;\n const fontSize = 5;\n const lineHeight = 7;\n\n // Green header\n page.drawText(\"ASSINADO DIGITALMENTE\", {\n x: textX,\n y: textY,\n size: 6,\n color: \"#008000\",\n });\n textY -= lineHeight * 1.2;\n\n if (certInfo) {\n // Signer name — strip trailing :CNPJ or :CPF suffix (shown separately below)\n let signerName = certInfo.subject.commonName || \"N/A\";\n signerName = signerName.replace(/:\\d{11,14}$/, \"\").trim();\n page.drawText(`Signat\\u00e1rio: ${signerName}`, {\n x: textX,\n y: textY,\n size: fontSize,\n });\n textY -= lineHeight;\n\n // Organization (if available)\n if (certInfo.subject.organization) {\n page.drawText(`Empresa: ${certInfo.subject.organization}`, {\n x: textX,\n y: textY,\n size: fontSize,\n });\n textY -= lineHeight;\n }\n\n // CNPJ or CPF\n if (certInfo.brazilian.cnpj) {\n const cnpj = formatCnpj(certInfo.brazilian.cnpj);\n page.drawText(`CNPJ: ${cnpj}`, {\n x: textX,\n y: textY,\n size: fontSize,\n });\n textY -= lineHeight;\n } else if (certInfo.brazilian.cpf) {\n const cpf = formatCpf(certInfo.brazilian.cpf);\n page.drawText(`CPF: ${cpf}`, {\n x: textX,\n y: textY,\n size: fontSize,\n });\n textY -= lineHeight;\n }\n\n // Date and time\n const now = new Date();\n const dateStr = now.toLocaleDateString(\"pt-BR\");\n const timeStr = now.toLocaleTimeString(\"pt-BR\");\n page.drawText(`Data: ${dateStr} ${timeStr}`, {\n x: textX,\n y: textY,\n size: fontSize,\n });\n textY -= lineHeight;\n\n // Certificate type\n page.drawText(\"Certificado: ICP-Brasil (A1)\", {\n x: textX,\n y: textY,\n size: fontSize,\n });\n } else {\n // Fallback if cert info not available\n page.drawText(\"Assinatura Digital\", {\n x: textX,\n y: textY,\n size: fontSize,\n });\n }\n}\n\n/**\n * Pre-compute the QR code image and embed it once into the PDF document.\n * Call this before an appearances loop so all appearances share a single XObject.\n */\nexport function precomputeSharedQrImage(\n doc: PdfDocument,\n certInfo: CertificateInfo | null,\n pdfData: Uint8Array,\n qrConfig?: QrCodeConfig,\n): PdfImage {\n const qrData = qrConfig?.data ?? VALIDATION_URL;\n const qrPng = generateQrCode(qrData, { size: qrConfig?.size ?? 100 });\n return doc.embedPng(qrPng);\n}\n\n/**\n * Format a CNPJ number with punctuation\n */\nfunction formatCnpj(cnpj: string): string {\n return cnpj.replace(/(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})/, \"$1.$2.$3/$4-$5\");\n}\n\n/**\n * Format a CPF number with punctuation\n */\nfunction formatCpf(cpf: string): string {\n return cpf.replace(/(\\d{3})(\\d{3})(\\d{3})(\\d{2})/, \"$1.$2.$3-$4\");\n}\n"
10
+ "/**\n * Visual Signature Appearance\n *\n * Draws certificate information and QR code on the PDF page\n * following the ICP-Brasil standard visual signature layout.\n */\n\nimport type { CertificateInfo } from \"@f-o-t/digital-certificate\";\nimport type {\n PdfDocument,\n PdfImage,\n PdfPage,\n} from \"@f-o-t/pdf/plugins/editing\";\nimport { generateQrCode } from \"@f-o-t/qrcode\";\nimport type { QrCodeConfig, SignatureAppearance } from \"./types.ts\";\n\nconst VALIDATION_URL = \"https://validar.iti.gov.br\";\nconst DEFAULT_PADDING = 5;\nconst DEFAULT_QR_TEXT_GAP = 7;\nconst MAX_QR_SIZE = 50;\nconst HEADER_FONT_SIZE = 6;\nconst BODY_FONT_SIZE = 5;\nconst LINE_HEIGHT = 7;\nconst HEADER_TO_FIRST_LINE = LINE_HEIGHT * 1.2;\n\n/**\n * Draw the visual signature appearance on a PDF page.\n *\n * Includes optional QR code and certificate information text\n * inside a bordered rectangle following ICP-Brasil layout.\n */\nexport function drawSignatureAppearance(\n doc: PdfDocument,\n page: PdfPage,\n appearance: SignatureAppearance,\n certInfo: CertificateInfo | null,\n options: {\n reason?: string;\n location?: string;\n qrCode?: QrCodeConfig;\n pdfData: Uint8Array;\n preEmbeddedQr?: PdfImage;\n },\n): void {\n const { x, width, height } = appearance;\n const showQrCode = appearance.showQrCode !== false;\n const showCertInfo = appearance.showCertInfo !== false;\n const padding = Math.max(0, appearance.padding ?? DEFAULT_PADDING);\n const verticalAlign =\n appearance.verticalAlign ?? appearance.contentAlign ?? \"top\";\n\n // Convert from top-left origin (user-facing) to PDF bottom-left origin.\n const y = page.height - appearance.y - height;\n\n const innerHeight = Math.max(0, height - padding * 2);\n const innerTop = y + height - padding;\n const innerLeft = x + padding;\n\n let qrSize = 0;\n if (showQrCode) {\n const maxQrSize = Math.max(0, Math.min(MAX_QR_SIZE, innerHeight));\n const requestedQrSize = appearance.qrSize ?? maxQrSize;\n qrSize = Math.max(0, Math.min(requestedQrSize, maxQrSize));\n }\n\n const textMetrics = getTextMetrics(certInfo);\n const contentHeight = Math.min(\n innerHeight,\n Math.max(showQrCode ? qrSize : 0, showCertInfo ? textMetrics.height : 0),\n );\n\n const verticalOffset =\n verticalAlign === \"middle\"\n ? (innerHeight - contentHeight) / 2\n : verticalAlign === \"bottom\"\n ? innerHeight - contentHeight\n : 0;\n\n const contentTopY = innerTop - verticalOffset;\n const qrTopY = contentTopY + (appearance.qrOffsetY ?? 0);\n const qrX = innerLeft + (appearance.qrOffsetX ?? 0);\n const textX =\n innerLeft + (showQrCode && qrSize > 0 ? qrSize + DEFAULT_QR_TEXT_GAP : 0);\n\n // Draw QR code if requested (enabled by default)\n if (showQrCode && qrSize > 0) {\n const qrImage =\n options.preEmbeddedQr ??\n (() => {\n const qrData = options.qrCode?.data ?? VALIDATION_URL;\n const qrPng = generateQrCode(qrData, {\n size: options.qrCode?.size ?? 100,\n });\n return doc.embedPng(qrPng);\n })();\n\n page.drawImage(qrImage, {\n x: qrX,\n y: qrTopY - qrSize,\n width: qrSize,\n height: qrSize,\n });\n }\n\n // Draw certificate info text\n if (showCertInfo) {\n drawCertInfo(page, certInfo, {\n textX,\n textY: contentTopY,\n });\n }\n\n // Reference link above the box\n const linkText = \"validar.iti.gov.br\";\n const linkX = x + width / 2 - linkText.length * 2;\n page.drawLink(linkText, VALIDATION_URL, {\n x: linkX,\n y: y + height + 3,\n size: 5,\n color: \"#888888\",\n });\n}\n\n/**\n * Draw certificate information text on the page following ICP-Brasil layout.\n */\nfunction drawCertInfo(\n page: PdfPage,\n certInfo: CertificateInfo | null,\n opts: {\n textX: number;\n textY: number;\n },\n): void {\n const textX = opts.textX;\n let textY = opts.textY;\n const fontSize = BODY_FONT_SIZE;\n const lineHeight = LINE_HEIGHT;\n\n // Green header\n page.drawText(\"ASSINADO DIGITALMENTE\", {\n x: textX,\n y: textY,\n size: HEADER_FONT_SIZE,\n color: \"#008000\",\n });\n textY -= HEADER_TO_FIRST_LINE;\n\n if (certInfo) {\n // Signer name — strip trailing :CNPJ or :CPF suffix (shown separately below)\n let signerName = certInfo.subject.commonName || \"N/A\";\n signerName = signerName.replace(/:\\d{11,14}$/, \"\").trim();\n page.drawText(`Signat\\u00e1rio: ${signerName}`, {\n x: textX,\n y: textY,\n size: fontSize,\n });\n textY -= lineHeight;\n\n // Organization (if available)\n if (certInfo.subject.organization) {\n page.drawText(`Empresa: ${certInfo.subject.organization}`, {\n x: textX,\n y: textY,\n size: fontSize,\n });\n textY -= lineHeight;\n }\n\n // CNPJ or CPF\n if (certInfo.brazilian.cnpj) {\n const cnpj = formatCnpj(certInfo.brazilian.cnpj);\n page.drawText(`CNPJ: ${cnpj}`, {\n x: textX,\n y: textY,\n size: fontSize,\n });\n textY -= lineHeight;\n } else if (certInfo.brazilian.cpf) {\n const cpf = formatCpf(certInfo.brazilian.cpf);\n page.drawText(`CPF: ${cpf}`, {\n x: textX,\n y: textY,\n size: fontSize,\n });\n textY -= lineHeight;\n }\n\n // Date and time\n const now = new Date();\n const dateStr = now.toLocaleDateString(\"pt-BR\");\n const timeStr = now.toLocaleTimeString(\"pt-BR\");\n page.drawText(`Data: ${dateStr} ${timeStr}`, {\n x: textX,\n y: textY,\n size: fontSize,\n });\n textY -= lineHeight;\n\n // Certificate type\n page.drawText(\"Certificado: ICP-Brasil (A1)\", {\n x: textX,\n y: textY,\n size: fontSize,\n });\n } else {\n // Fallback if cert info not available\n page.drawText(\"Assinatura Digital\", {\n x: textX,\n y: textY,\n size: fontSize,\n });\n }\n}\n\nfunction getTextMetrics(certInfo: CertificateInfo | null): { height: number } {\n let bodyLines = 1; // fallback line: \"Assinatura Digital\"\n\n if (certInfo) {\n bodyLines = 1; // Signatário\n if (certInfo.subject.organization) bodyLines += 1;\n if (certInfo.brazilian.cnpj || certInfo.brazilian.cpf) bodyLines += 1;\n bodyLines += 1; // Data\n bodyLines += 1; // Certificado\n }\n\n const bodySpan = Math.max(0, bodyLines - 1) * LINE_HEIGHT + BODY_FONT_SIZE;\n return {\n height: HEADER_TO_FIRST_LINE + bodySpan,\n };\n}\n\n/**\n * Pre-compute the QR code image and embed it once into the PDF document.\n * Call this before an appearances loop so all appearances share a single XObject.\n */\nexport function precomputeSharedQrImage(\n doc: PdfDocument,\n certInfo: CertificateInfo | null,\n pdfData: Uint8Array,\n qrConfig?: QrCodeConfig,\n): PdfImage {\n const qrData = qrConfig?.data ?? VALIDATION_URL;\n const qrPng = generateQrCode(qrData, { size: qrConfig?.size ?? 100 });\n return doc.embedPng(qrPng);\n}\n\n/**\n * Format a CNPJ number with punctuation\n */\nfunction formatCnpj(cnpj: string): string {\n return cnpj.replace(/(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})/, \"$1.$2.$3/$4-$5\");\n}\n\n/**\n * Format a CPF number with punctuation\n */\nfunction formatCpf(cpf: string): string {\n return cpf.replace(/(\\d{3})(\\d{3})(\\d{3})(\\d{2})/, \"$1.$2.$3-$4\");\n}\n"
11
11
  ],
12
- "mappings": "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",
13
- "debugId": "C81EE426D32BA92C64756E2164756E21",
12
+ "mappings": "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",
13
+ "debugId": "DB31A2AAB476341064756E2164756E21",
14
14
  "names": []
15
15
  }
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  pdfSignOptionsSchema,
14
14
  requestTimestamp,
15
15
  signPdf
16
- } from "./index-7kht811z.js";
16
+ } from "./index-6b28235r.js";
17
17
  import"./index-r24hmh0q.js";
18
18
 
19
19
  // src/batch.ts
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  signPdf
4
- } from "../../index-7kht811z.js";
4
+ } from "../../index-6b28235r.js";
5
5
  import"../../index-r24hmh0q.js";
6
6
 
7
7
  // src/plugins/react/index.ts
package/dist/schemas.d.ts CHANGED
@@ -29,6 +29,20 @@ export declare const pdfSignOptionsSchema: z.ZodObject<{
29
29
  page: z.ZodOptional<z.ZodNumber>;
30
30
  showQrCode: z.ZodOptional<z.ZodBoolean>;
31
31
  showCertInfo: z.ZodOptional<z.ZodBoolean>;
32
+ padding: z.ZodOptional<z.ZodNumber>;
33
+ qrSize: z.ZodOptional<z.ZodNumber>;
34
+ qrOffsetX: z.ZodOptional<z.ZodNumber>;
35
+ qrOffsetY: z.ZodOptional<z.ZodNumber>;
36
+ contentAlign: z.ZodOptional<z.ZodEnum<{
37
+ top: "top";
38
+ middle: "middle";
39
+ bottom: "bottom";
40
+ }>>;
41
+ verticalAlign: z.ZodOptional<z.ZodEnum<{
42
+ top: "top";
43
+ middle: "middle";
44
+ bottom: "bottom";
45
+ }>>;
32
46
  }, z.core.$strip>, z.ZodLiteral<"auto">, z.ZodLiteral<false>]>>;
33
47
  appearances: z.ZodOptional<z.ZodArray<z.ZodObject<{
34
48
  x: z.ZodNumber;
@@ -38,6 +52,20 @@ export declare const pdfSignOptionsSchema: z.ZodObject<{
38
52
  page: z.ZodOptional<z.ZodNumber>;
39
53
  showQrCode: z.ZodOptional<z.ZodBoolean>;
40
54
  showCertInfo: z.ZodOptional<z.ZodBoolean>;
55
+ padding: z.ZodOptional<z.ZodNumber>;
56
+ qrSize: z.ZodOptional<z.ZodNumber>;
57
+ qrOffsetX: z.ZodOptional<z.ZodNumber>;
58
+ qrOffsetY: z.ZodOptional<z.ZodNumber>;
59
+ contentAlign: z.ZodOptional<z.ZodEnum<{
60
+ top: "top";
61
+ middle: "middle";
62
+ bottom: "bottom";
63
+ }>>;
64
+ verticalAlign: z.ZodOptional<z.ZodEnum<{
65
+ top: "top";
66
+ middle: "middle";
67
+ bottom: "bottom";
68
+ }>>;
41
69
  }, z.core.$strip>>>;
42
70
  qrCode: z.ZodOptional<z.ZodObject<{
43
71
  data: z.ZodOptional<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4B/B,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAuBxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4B/B,CAAC"}
package/dist/types.d.ts CHANGED
@@ -21,6 +21,18 @@ export type SignatureAppearance = {
21
21
  showQrCode?: boolean;
22
22
  /** Whether to display certificate info text (default: true) */
23
23
  showCertInfo?: boolean;
24
+ /** Inner content padding in points (default: 5) */
25
+ padding?: number;
26
+ /** Rendered QR size in points (default: auto, capped by available height and 50) */
27
+ qrSize?: number;
28
+ /** Additional QR X offset in points within the content box (default: 0) */
29
+ qrOffsetX?: number;
30
+ /** Additional QR Y offset in points within the content box (default: 0) */
31
+ qrOffsetY?: number;
32
+ /** Vertical alignment for content block (alias for verticalAlign) */
33
+ contentAlign?: "top" | "middle" | "bottom";
34
+ /** Vertical alignment for content block (default: top) */
35
+ verticalAlign?: "top" | "middle" | "bottom";
24
36
  };
25
37
  /**
26
38
  * QR code configuration for visual signatures
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC/B,yCAAyC;IACzC,CAAC,EAAE,MAAM,CAAC;IACV,2CAA2C;IAC3C,CAAC,EAAE,MAAM,CAAC;IACV,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACxB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC1B,8BAA8B;IAC9B,WAAW,EAAE;QACV,gCAAgC;QAChC,GAAG,EAAE,UAAU,CAAC;QAChB,oCAAoC;QACpC,QAAQ,EAAE,MAAM,CAAC;QACjB,2CAA2C;QAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,YAAY,GAAG,kBAAkB,CAAC;IAC3C,gDAAgD;IAChD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iHAAiH;IACjH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,gFAAgF;IAChF,UAAU,CAAC,EAAE,mBAAmB,GAAG,MAAM,GAAG,KAAK,CAAC;IAClD,qFAAqF;IACrF,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACpC,qDAAqD;IACrD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,+GAA+G;IAC/G,gBAAgB,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC5B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,CAAC,EAAE,MAAM,CAAC;IACV,qDAAqD;IACrD,CAAC,EAAE,MAAM,CAAC;IACV,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IACjC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@f-o-t/e-signature",
3
- "version": "1.7.5",
3
+ "version": "1.8.0",
4
4
  "description": "PAdES PDF signing with ICP-Brasil compliance",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",