Engine — chữ ký số (sign.rs MỚI): - generate_self_signed_id: Digital ID tự ký RSA-2048 + X.509 (rcgen), ghi PEM - sign_pdf: đúng cơ chế Adobe — lopdf dựng sig dict (/SubFilter adbe.pkcs7.detached) + Widget field + AcroForm/SigFlags, ByteRange/Contents placeholder; serialize → vá ByteRange theo offset thật → SHA-256 trên 2 đoạn → CMS SignedData detached (crate cms, signed attrs messageDigest+contentType, RSA-SHA256) nhét DER vào Contents - verify_signatures: parse ByteRange/Contents, băm lại, kiểm chữ ký RSA trên signed attrs + messageDigest khớp + phủ toàn bộ file → phát hiện GIẢ MẠO - Bài học: cắt DER về đúng độ dài (bỏ padding hex '0'); bỏ qua /Contents của trang (tham chiếu), chỉ nhận /Contents <hex> của chữ ký Engine — redact tỉa theo KÝ TỰ (redact.rs): - Text chạm một phần: page_char_boxes xác định ký tự trong vùng, GIỮ các đoạn ngoài vùng, dựng lại đúng vị trí/baseline/màu (font nhúng gốc → cùng họ → mặc định). Guard: text xoay/không đọc được font → xoá nguyên (an toàn) - qpdf::optimize_save: --object-streams=generate + nén, dọn object rác Tauri + UI: - Commands: sig_create_id, sig_sign, sig_verify, security_optimize, pick_any_file, pick_save_pem - Thanh Bảo mật thêm: Tạo Digital ID, Ký số (dialog + tự kiểm tra sau khi ký), Kiểm tra chữ ký (modal bảng trạng thái + lý do), Lưu tối ưu Test (7 mới → 62/62 engine xanh ngoài 2 fixture qpdf Linux): - sign_then_verify_is_valid; tampering_after_signing_is_detected (phát hiện sửa sau khi ký); verify_reports_none_for_unsigned - redact tỉa ký tự: cụm mật biến mất, phần cùng dòng ngoài vùng vẫn còn - optimize_save không phình + giữ nội dung Deps: rsa, sha2, cms, x509-cert, rcgen, pkcs8, der, spki, const-oid. Docs: 15 mục 6 (iter 2 + giới hạn), 16 (S13–S19), README, roadmap (Phase 5 HOÀN TẤT), 14 (kế tiếp: Phase 6 Form). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HgnbPwSoRGNH7LHsDUmRpk
28 lines
782 B
TOML
28 lines
782 B
TOML
[package]
|
|
name = "ff-engine"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
description = "FoFreeXit engine: render/edit/io over PDFium + QPDF"
|
|
|
|
[dependencies]
|
|
ff-cos = { path = "../ff-cos" }
|
|
ff-pdmodel = { path = "../ff-pdmodel" }
|
|
anyhow.workspace = true
|
|
thiserror.workspace = true
|
|
pdfium-render = "0.8"
|
|
image = "0.25"
|
|
lopdf = "0.36"
|
|
ttf-parser = "0.25"
|
|
# Phase 5 iteration 2 — chữ ký số (PKCS#7/CMS detached, RSA-SHA256):
|
|
rsa = { version = "0.9", features = ["sha2"] }
|
|
sha2 = "0.10"
|
|
cms = { version = "0.2", features = ["builder"] }
|
|
x509-cert = { version = "0.2", features = ["builder"] }
|
|
rcgen = "0.13"
|
|
pkcs8 = { version = "0.10", features = ["pem"] }
|
|
der = "0.7"
|
|
spki = "0.7"
|
|
signature = "2"
|
|
const-oid = { version = "0.9", features = ["db"] }
|