Format: Keep a Changelog. SemVer.
v0.7 büyük özellik eklemesinden çok gerçek dünya sağlamlığı üzerine:
Modern PDF destek, MA3 CAdES/PAdES interop, CAdES-LTA ATSv3, PKCS#11 optional
packaging, MSS ProfileQuery + Registration, TSP chain validation,
Kamu SM snapshot auto-refresh ve README/CHANGELOG/release.
-
PDF xref-stream desteki —
src/pades-xref.ts.parseTrailer(pdf)hem classictrailer << ... >>hem xref-stream (/Type /XRef) yolunu ayrıştırır;writeXrefSection()incremental append için classic section üretir.src/pades-core.tsartık xref-stream PDF geldiğindeObjStmsaıkıştırılmış objeleri inflate edip standalone indirect object olarak açıyor; üzerine classic xref append edip@signpdf/placeholder-plain'e veriyor.pades-dss.tsvepades-visible.tstrailer parse için aynı helper'ı kullanıyor ve/Info,/Prevalanlarını koruyor. Regression:test/pades-xref.test.tspdf-libdefault PDF üzerinde sign → verify → LT → LTA (live) akışını kapsıyor. -
CAdES-LTA ATSv3 — ETSI EN 319 122-1 §5.5.3.
src/cades-constants.tsiçineatsHashIndex = "0.4.0.1733.2.5"eklendi. YenibuildAtsHashIndexAttr()her cert/crl/unsignedAttr DER'ini tek tek hash'leyipATSHashIndexunsigned attr üretiyor.cadesUpgrade({ to: "LTA" })artık default olarak v3; imprint input'uv2-archive-input || DER(ATSHashIndex).{ variant: "v2" }ile eski akış korunuyor. Live FreeTSA round-trip test altında (test/cades-upgrade.test.ts+TR_XADES_LIVE_TSA=1). -
MSS
mssProfileQuery— ETSI TS 102 204 §5.4.src/mss.tsiçinemssProfileQuery({serviceUrl, apId, apPwd, msisdn})eklendi.MSS_ProfileQuery/MSS_ProfileReqenvelope üretir,SignatureProfile/mssURIdüğümlerindenprofiles: string[]çıkarır. Dönüş:{ msspTransId, statusCode?, statusMessage?, profiles }. -
MSS
mssSignerCert—MSS_Registrationile kullanıcı sertifikasını çeker. CevaptaX509Certificatebase64 →Uint8ArrayDER,CertificateURIvarsa string olarak döner. Hem inline hem URI-only provider varyantı parse testli. -
TSP
verifyTimestamp—src/tsp.tsiçine opt-in chain doğrulama API'si.parseToken()TimeStampTokenCMSSignedData'ı + TSTInfo'yu ayrıştırır; signer cert token içinden bulunur, CMS'teki ek cert'ler intermediate olarakvalidateChain()'e verilir. DefaultcheckDate = tst.genTime. Dönüş:Timestamp + { signerCertificate?, chain, valid, reason? }. Live FreeTSA root'uyla pozitif test altında. -
MA3 CAdES/PAdES interop unlock —
reference/docker-ocsp/(docker-compose.yml+ README). OpenSSL OCSP responder (18080) + Python HTTP CRL server (18081).reference/gen-test-ca.shAIA/CDP'yi bu endpoint URL'lerine gömüyor; responder sertifikası + root/int CA +opensslindex/ config + CRL dosyaları otomatik üretiliyor.Ma3Ref.javaartıktest-chain.p12üzerinden CAdES-BES + PAdES-B-B fixture üretiyor verun.shOCSP cevabını önceden indirip driver'a enjekte ediyor. Testler:cades-cross-verify.test.ts- yeni
pades-cross-verify.test.tsMA3 çıktısını tr-esign verifier ile doğruluyor.
- yeni
-
Kamu SM snapshot auto-refresh CI —
.github/workflows/kamusm-roots.yml. Aylık cron (0 5 1 * *) +workflow_dispatch. Python 3.12 + Node 20 + pnpm 9 kurupfetch-kamusm-roots.shçalıştırır, tsgo/oxlint/pnpm test geçerse vesrc/kamusm-roots-snapshot.tsdiff'i varsapeter-evans/create-pull-requestilekamusm-roots-refreshdalında otomatik PR açar.
-
PKCS#11 opsiyonel peer dep.
graphene-pk11+pkcs11jsartıkpeerDependencies+peerDependenciesMeta.optionalaltında. Geliştirme ortamı içindevDependencies'e taşındı.pnpm add tr-esignartık native build tetiklemez; PKCS#11 isteyen kullanıcıpnpm add tr-esign graphene-pk11 pkcs11jskurar.src/pkcs11.tsartıkcreateRequire(import.meta.url)+loadGraphene()lazy loader ile çalışıyor; eksikse net yönlendirici hata mesajı dönüyor.src/sign.tsresolveSigner()PKCS#11 dalı da dynamic import hatasını aynı mesajla sarıyor. -
Default CAdES-LTA artık ATSv2 değil ATSv3. V2 override
{ variant: "v2" }olarak açık;cadesVerifyher iki seviyeyi deLTAolarak raporluyor.
test/pades-xref.test.ts—parseTrailerclassic + xref-stream,writeXrefSectionemit + xref-stream PDF üzerinde sign/verify/LT/LTA regression.test/cades-cross-verify.test.ts— fixture varsa MA3 CAdES-BES verify.test/pades-cross-verify.test.ts— MA3 PAdES-B-B verify (yeni).test/mss.test.ts— yenimssProfileQuery,mssSignerCert(inline + URI-only) mock testleri.test/tsp.test.ts—verifyTimestampmalformed-token invalid sonucu + live FreeTSA embedded-root chain doğrulaması.test/pkcs11.test.ts—Module._loadmonkeypatch ile optional peer'ler bloklanırken PFX ilesign()hala çalışıyor regression'ı.- 91/91 offline test yeşil; live TSA + PKCS#11 SoftHSM ile 96/96.
- Yeni deps yok.
graphene-pk11+pkcs11jsruntimedependencies→peerDependenciesMeta.optional(+devDependencies).
- Tarayıcıda kullanım halen kapsam dışı (Node-only).
- MSS canlı operator interop testleri hâlâ kimlik bilgisi gerektiriyor; mock test kapsamı geniş.
- MA3 interop gerçek mali mühür zinciri ile en iyi çalışır; docker-ocsp altyapısı self-signed test CA'yı kapsar.
Bu sürüm MA3 2.3.11.8'de olup tr-esign'da eksik olan özelliklerin büyük çoğunluğunu kapatır: akıllı kart, mobil imza, görünen PAdES, CAdES counter-sig, ASiC manifest, Kamu SM trust snapshot, CLI.
-
PKCS#11 akıllı kart —
src/pkcs11.ts(graphene-pk11 + pkcs11js native).openPkcs11({modulePath, pin})→ session;findSigner({label?, subject?})cert+private key handle + mechanism;pkcs11Sign()raw imza.SignerInputunion'ına{pkcs11, label?, subject?}variant eklendi; XAdES + CAdES + PAdESresolveSignerdual path (webcrypto vs PKCS#11 manuel signedAttrs). Subpath:tr-esign/pkcs11. -
Mobil İmza (MSS) —
src/mss.ts. ETSI TS 102 204 v1.1.2 hand-rolled SOAP (dep YOK, @xmldom ile parse).mssSign(opts)synch imzalama;mssStatus+mssPoll(intervalMs, timeoutMs)async mod polling. Fetch override (test mock). Subpath:tr-esign/mss. -
PAdES görünen imza —
src/pades-visible.ts. ISO 32000-1 widget annotation /AP /N Form XObject content stream (PDF operator hand-rolled: q/Q, BT/ET, Tf, Tj, re/S).padesSign({visibleSignature:{page, rect, text, fontSize}})opsiyonu. Incremental update olarak eklenir, ByteRange etkilenmez. -
CAdES counter-signature —
src/cades-counter-sign.ts. RFC 5652 §11.4 id-countersignature (1.2.840.113549.1.9.16.2.6) + RFC 5126 §4.cadesCounterSign({cms, signer}): outer.signature byte'larının hash'i + messageDigest + signingCertV2 (contentType YOK); inner SignerInfo outer'ın unsignedAttrs'ına eklenir.cadesVerifycounterSignatures[]raporu verir. Subpath:tr-esign/cades-counter-sign. -
ASiC-E XAdES manifest auto-gen —
src/asic.ts. ETSI EN 319 162-1 §A.4buildAsicManifest({sigReference, dataFiles})SHA-256 per file + MIME inference (pdf/xml/json/jpeg/png/txt/html...).createAsicAsync()manifest:"auto" literal'i destekler. -
CAdES signer-location + signer-attributes —
cades-attributes.ts:buildSignerLocationAttr({city, country, postal})(RFC 5126 §5.10.1) +buildSignerAttrAttr(claimed: string[])(§5.10.3, id-at-title 2.5.4.12 altında).cadesSignopts'aproductionPlace+signerRoleeklendi. -
Kamu SM root anchor snapshot —
reference/fetch-kamusm-roots.sh(~60 LOC python parser): depo.kamusm.gov.tr XML → 29 root PEM bundle →src/kamusm-roots-snapshot.tsauto-generate.chain.ts→ yeniloadKamuSmRootsOffline()(dynamic import, fetch gerekmez).loadKamuSmRootsruntime fetch regex'i güncel XML şemasına (mValue/mSubjectName) uyarlandı. -
CLI —
src/cli.ts+bin/tr-esign(~170 LOC, dep YOK minimal argv).tr-esign <format> <action>matrisi: xades|cades|pades × sign|verify|upgrade. Ortak bayraklar: --pfx/--password (env TR_ESIGN_PFX_PASS), --in, --out, --policy, --tsa, --to. Format-specific: --placement, --detached, --content, --reason, --signer-name. Verify JSON stdout + exit 0/1.package.jsonbin alanı + files:[bin].
resolveSignerdönüş tipi{certificate, sigAlg, sign, privateKey?}—sign(data)birleşik arayuz. PKCS#11'deprivateKeyyok; cadesSign dual path (webcrypto pkijs.SignedData.sign veya manuel SET OF SignedAttrs DER).SIG_ALG_OIDtablosu eklendi (cades-constants.ts): RSA/ECDSA × SHA-256/ 384/512 PKCS#1/X9.62 OID'leri — manuel CAdES imza yolu için.cades-verifycounterSignatures[]raporu verir (XAdES ile ortak tip).pades-core.tsreadByteRange+writeByteRangeson (en yeni)/ByteRangeplaceholder'ı seçiyor — DocTimeStamp / çoklu imza güvenli.
test/pkcs11.test.ts— 3 opt-in (XAdES/CAdES/PAdES × softhsm2) test, ENV TR_ESIGN_PKCS11_MODULE/PIN/LABEL.test/mss.test.ts— 5 mock-fetch test (envelope + parse + fault + poll + timeout).test/pades-visible.test.ts— 3 test (appearance stream + escape + end-to-end).test/cades-counter-sign.test.ts— 4 test (attribute yapısı + verify + multi-counter + reddi).test/asic.test.ts— +3 test (buildAsicManifest + createAsicAsync).test/cades-sign.test.ts— +1 test (signer-location + signer-attr).- 79/79 offline test yeşil; softhsm+live TSA ile 82/82.
graphene-pk112.3.6 +pkcs11js2.1.6 (native;package.json pnpm. onlyBuiltDependencies).- MSS + visible sig dependency YOK (hand-rolled).
- PKCS#11 native build için CMake/python gerekir (Windows dışı platformlarda
boğu tekliği).
pnpm approve-builds+npx node-gyp rebuild. - Mobil İmza canlı operator testi yok (kimlik gerekli); mock SOAP ile kısmı garanti. Türkcell/Vodafone signatureProfile farklılıkları user tarafında override edilir.
- CAdES LTA ATSv3 hala yok (v2 yeterli).
Dördüncü imza formatı: PAdES (PDF e-imza). Repo ve paket adı XAdES + CAdES
- ASiC + PAdES kapsamını yansıtmak için
tr-esign'e taşındı.
src/pades-core.ts— PDF incremental update primitive'leri:addSignaturePlaceholder,readByteRange,extractByteRangeBytes,findContentsPlaceholder,extractCms,spliceSignature,SUBFILTER_ETSI_RFC3161.@signpdf/placeholder-plainstring-tabanlı incremental update kullanır + /ByteRange placeholder'ı actual değerlerle rewrite edilir.src/pades-sign.ts—padesSign(opts). PAdES-B-B + EPES. Akış: placeholder ekle → ByteRange hesapla →cadesSign({contentIncluded:false})→ /Contents hex'ine splice. CMS core reuse (CAdES çıktısı kullanılır). Options: reason/location/contactInfo/ signerName/signatureSize + CAdES pass-through (policy/commitmentType/ digestAlgorithm).src/pades-verify.ts—padesVerify(pdf): VerifyResult. /ByteRange + /Contents çöz,cadesVerify(cms, {detachedContent})çağır. Seviye: /DSS (PAdES §5.4) → LT, /SubFilter /ETSI.RFC3161 (DocTimeStamp §5.5) → LTA, yoksa CAdES level. VerifyResult XAdES/CAdES ile aynı tip.src/pades-upgrade.ts—padesUpgrade()discriminated:to:"T"— extractCms + cadesUpgrade(T) + splice. Length-preserving.to:"LT"—addDss()çağırır (aşağıda).to:"LTA"—addDocTimeStamp()çağırır (aşağıda).
src/pades-dss.ts—addDss(pdf, {certs,crls,ocsps}). EN 319 142-1 §5.4 Document Security Store incremental update: her DER → PDF stream obj, /DSS dict /Certs/CRLs/OCSPs, güncel Root (+ /DSS ref), yeni xref + trailer (/Prev eski offset). Orijinal imza ByteRange'i dokunulmaz.src/pades-timestamp.ts—addDocTimeStamp(pdf, {tsa, digestAlgorithm}). EN 319 142-1 §5.5: ikinci /Sig dict /SubFilter /ETSI.RFC3161, /Contents = RFC 3161 TimeStampToken. addSignaturePlaceholder(subFilter:ETSI.RFC3161)- ByteRange hash + getTimestamp + splice.
- Subpath exports:
tr-esign/pades-sign,tr-esign/pades-verify,tr-esign/pades-upgrade. - Deps:
@signpdf/placeholder-plain+@signpdf/utils(MIT).pdf-libdevDep (test PDF üretimi).
- Repo + paket yeniden adlandırıldı:
tr-xades→tr-esign. İsim artık XAdES + CAdES + ASiC + PAdES hepsini kapsayan TR e-imza kütüphanesini yansıtıyor. GitHub repo rename yapıldı; eski URL 301 redirect. package.json description: "Turkey profile XAdES + CAdES + ASiC + PAdES signature library — clean-room; ETSI EN 319 132 / TS 101 733 / EN 319 162 / EN 319 142 uyumlu". - Test fixture DN:
O=tr-xades test→O=tr-esign test.reference/fixtures/test.p12vetest-chain.p12yeni DN ile regen. MA3 fixture'ları yeni cert ile tekrar üretildi. src/pades-core.ts—readByteRange+writeByteRangeçoklu imza PDF'lerinde yanlış /ByteRange yakalıyordu; son (en yeni) olanı almak üzere düzeltildi (LTA zinciri için kritik).src/cades-verify.ts(v0.4'ten):certToSignerInfoexport — pades-verify CAdES ile ortak VerifyResult için kullanacaktı; asında doğrudan değil, cadesVerify çağrısı içinden implicitly reuse ediliyor.
- MA3 CAdES + PAdES cross-verify ertelendi (v0.5+): MA3 addSigner ve
PAdESContainer.sign() online revocation zorunlu kılıyor. Test CA
placeholder URL'leri ulaşılamadığı için her iki format için de fixture
üretilemedi.
cades-cross-verify.test.tsve gelecekpades-cross-verify. test.tsfixture varsa doğrular, yoksa skip. Gerçek TR mali mühür PFX veya yerel OCSP responder (docker openssl ocsp) ile çalışacak. - PAdES LTA /Type: @signpdf
/Type /Sigyazıyor; EN 319 142-1 §5.5 strict/Type /DocTimeStampister. Adobe/DSS/MA3 ikisini de kabul eder. Strict compliance v0.5.x'e. - CAdES-LTA ATSv3 (v0.4'ten aktarıldı): v2 yeterli, v3 ats-hash-index gerektiğinde eklenir.
Uzun süreli doğrulama + arşivleme (CAdES) ve zip konteyner (ASiC).
-
CAdES-LT (
to:"LT"incades-upgrade.ts):buildCertValuesAttr(certs)— ETSI TS 101 733 §6.2.1id-aa-ets-certValues(1.2.840.113549.1.9.16.2.23). CertificateValues ::= SEQUENCE OF Certificate.buildRevocationValuesAttr({crls, ocsps})— §6.2.2id-aa-ets-revocationValues(1.2.840.113549.1.9.16.2.24). EXPLICIT [0] crlVals / [1] ocspVals. OCSPResponse DER'i otomatik BasicOCSPResponse'a unwrap edilir (spec içi).- Paylasılan
addUnsignedAttr()helper.
-
CAdES-LTA (
to:"LTA"):archive-time-stamp-v2(OID 1.2.840.113549.1.9.16.2.48), ETSI TS 101 733 §6.4.1. Message imprint input: DER(eContent) || DER(certs)* || DER(crls)* || DER(signerInfo alanları, prior ATS hariç).detachedContentopt parametresi detached BES/T/LT üzerinde LTA için.- ATSv3 (EN 319 122-1, ats-hash-index) bilinçli olarak atlandı — v2 ETSI-compliant ve karmaşıklığı düşük.
-
ASiC container —
src/asic.ts:createAsic(opts)— discriminated union:asic-s(tek veri + tek sig) veyaasic-e(multi-dosya + multi-sig + ops. manifest).readAsic(bytes)— mimetype tespiti + dataFiles/signatures/manifests sınıflandırması.- EN 319 162-1 §A.1 uyumlu: mimetype FIRST entry + STORED, XAdES
signatures.xml/ CAdESsignature.p7snaming + E içinNNNindeks. fflate(MIT, ~8kb, tree-shakable) tek dep.- Subpath export:
tr-esign/asic.
-
Test altyapısı:
reference/gen-test-ca.sh— openssl ile 3-katmanlı test CA (root → intermediate → leaf), leaf'ta KeyUsage digitalSignature + nonRepudiation + AIA + CDP placeholder. PFX exporttest-chain.p12.test-chain-*.pemtrust anchor + okunabilir chain.
cades-upgrade.ts—addArchiveTimeStamp()SignerInfo alanıısi.toSchema()inner node'larından iterate ederek alıyor (çoklu parse/re-serialize sonrasısi.sidtip kararlılığı için). [1] IMPLICIT unsignedAttrs skip.reference/driver/Ma3Ref.java— chain PFX yükleme kodu halâ içeride, CAdES fixture üretim denemesi meta.json'da loglanıyor..gitignore—reference/fixtures/*.pemeklendi.
- MA3 CAdES cross-verify ertelendi (v0.5+): MA3
addSigner()CAdES-BES için bile online revocation zorunluyor (NPE atCertificateStatusInfo. getCertificate()). Test CA placeholder URL'lere ulaşamadığı için fixture üretilemedi.cades-cross-verify.test.tsfixture varsa doğrular, yoksa skip. Çözüm: yerel openssl ocsp responder veya gerçek TR mali mühür PFX. - CAdES-LTA'da ATSv3 (ats-hash-index) yok; v2 yeterli. ATSv3 v0.5+'a.
- ASiC-E XAdES manifest üretimi otomatik değil — kullanıcı ayrı yazıp opts.manifest ile verir (XAdES için genelde gereksiz, CAdES için zorunlu).
XAdES'le paralel ikinci imza formatı: CMS SignedData üzerinde ASN.1 DER binary imza. TR'de e-reçete, ikili doküman ve detached özet imza senaryolarında kullanılır.
src/cades-sign.ts—cadesSign(opts). Attached (içerik imza içinde) ve detached (harici veri) mod. Standart signedAttrs: contentType + messageDigest + signingCertificateV2 (RFC 5035) + signingTime. Opsiyonel: signaturePolicyIdentifier (EPES), commitmentTypeIndication.src/cades-verify.ts—cadesVerify(bytes, opts?). CMS SignedData + pkijs verify. VerifyResult tipi XAdES ile aynı (certToSignerInfo verify.ts'ten ortak export). Seviye tespiti signed/unsigned attribute varlığından: signaturePolicy→EPES, signatureTimeStamp→T, certValues/revocationValues→LT, archiveTimeStampV2/V3→LTA.src/cades-upgrade.ts—cadesUpgrade({bytes, to:'T', tsa?}). ETSI TS 101 733 §6.1.1 signature-time-stamp: SignerInfo.signature üzerinde RFC 3161 timestamp, unsignedAttrs'e eklenir. LT/LTA v0.3.x adayı.src/cades-attributes.ts— 9 pkijs.Attribute builder (contentType, messageDigest, signingTime UTCTime/GeneralizedTime, signingCertificateV2 ESSCertIDv2 + issuerSerial, signaturePolicyIdentifier, commitmentTypeIndication, signatureTimeStamp).src/cades-constants.ts— RFC 5652 + ETSI TS 101 733 OID'leri + HASH_OID mapping (NIST alg OID).- Subpath exports:
tr-esign/cades-sign,tr-esign/cades-verify,tr-esign/cades-upgrade.
src/pfx.ts— pkijs crypto engine'i@peculiar/webcrypto'dan Node 22 globalcrypto.subtle'a taşındı. CryptoKey'ler artıkcrypto.tsilepkijsarasında uyumlu.@peculiar/webcryptodeps arasında kalmaya devam ediyor ama kullanılmıyor (sonraki release'te kaldırılabilir).src/verify.ts—certToSignerInfo(cert: pkijs.Certificate): SignerInfoexport edildi (verify.ts + cades-verify.ts ortak kullanımı için).src/sign.ts—resolveSignerveSignerInputtipi CAdES tarafından da kullanıldığı için genel input parametresi kabul edecek şekilde imza sadeleşti.reference/fixtures/test.p12— KeyUsage=digitalSignature,nonRepudiation extension'ıyla regen edildi (MA3 CAdES first gate'i için gerekli).
- MA3 CAdES interop testi fixture bekliyor: MA3
addSignerdefault path validation yapar ve self-signed test cert'imizi kabul etmez. Gerçek TR mali mühür (Kamu SM NES zinciriyle imzalı) PFX sağlandığındatest/cades-cross-verify.test.tsotomatik aktif olur. - CAdES-LT / CAdES-LTA v0.3.0 kapsamında değil.
- SignerLocation, SignerAttr attribute'ları BES için zorunlu değil — eklenmedi.
placement: "ubl-ma3-compat"(src/sign.ts) — MA3 (TÜBİTAK BİLGEM) doğrulayıcısı ile tam yapısal interop. Input XML base64 olarakds:Object'te,ds:ReferenceURI="#<objectId>"(enveloped-signature transform yok) — MA3'ün kendi enveloped çıktısıyla birebir. MA3 verifier'ı 'Temel doğrulama başarılı' verir (tek kalan: cert chain trust self-signed test cert için; gerçek mali mühür ile çözülür).- External URI resolver (
src/verify.ts) —verify(xml, opts?).VerifyOptions.resolver?callback ile detached imzalar ve external URI referansları çözün. MA3 detached fixture'ı artık file-system resolver ile valid. counterSign(opts)(src/counter-sign.ts) — XAdES CounterSignature. Mevcutds:Signature'ınds:SignatureValue'suna yeni imza atar (Type="...#CountersignedSignature"), parent'ınxades:UnsignedSignatureProperties/xades:CounterSignaturealtına yerleştirilir.- Recursive counter-sig verify (
src/verify.ts) —VerifyResult.counterSignatures?: SignerInfo[]ile geçerli counter-sig'lerin signer bilgisi. - Paralel (multi) imza (
src/verify.ts) —ubl-ma3-compatiki kez çağrılınca bağımsız paralel imzalar; verifyallSignatures?: PerSignatureResult[]ile her top-level sig'i ayrı ayrı raporlar (primary hala ilk sig). - XMLDSig şema çocuk sırası düzeltmesi:
ds:SignatureartıkSignedInfo, SignatureValue, KeyInfo, Object*sırasında.
verify(xml)→verify(xml, opts?)(eklemeli değişiklik; eski çağrılar çalışır).sign.ts'tenresolveSigner,buildKeyInfo,SignerInputtipi;upgrade.ts'tenensureUnsignedSignaturePropertiesexport edildi — yenicounter-sign.tsile duplicate logic engellendi.
- MA3 interop'ta UBL enveloped sorunu (v0.1 'Temel doğrulama başarısız') çözüldü.
- Detached imza doğrulama (v0.1'de yoktu) artık kullanıcı resolver'ıyla çalışıyor.
İlk sürüm. Türkiye profili XAdES kütüphanesi — clean-room, ETSI + kamuya açık TR dokümanlardan.
- Seviyeler: XAdES-BES, XAdES-EPES, XAdES-T, XAdES-LT, XAdES-LTA.
- Girdi şekilleri: enveloped (UBL-TR
ext:ExtensionContentyerleştirme, kök elemente ekleme) / enveloping (ds:Objectiçinde base64) / detached (external URI reference, sign tarafı). - Signer: PFX (PKCS#12, pkijs tabanlı) ve pkcs8+X.509 DER.
- Algoritmalar: RSA-PKCS1-v1_5 ve ECDSA × SHA-256/384/512; c14n10 + exc-c14n (with/without comments).
- TR profili: P2/P3/P4 v1 policy OID'leri (runtime'da MA3 obfuscation
çözülüp doğrulandı) + Elektronik İmza Kullanım Profilleri Rehberi PDF
SHA-256 digest'i (
ff39bd29…08117a). - Yardımcı modüller:
pfx,crypto,c14n,ids,policy,tsp(RFC 3161),ocsp(RFC 6960),crl(RFC 5280),chain(pkijs ChainValidationEngine) +loadKamuSmRoots()runtime fetch. - API: tek
sign(), tekverify(), tekupgrade()fonksiyonu (to: T/LT/LTA discriminated union). - Canonicalization interop: xmldsigjs'in subset-topmost inheritance
eksikliği Apache Santuario / MA3 davranışıyla hizalayan
withInheritedNamespaces()eklendi. MA3 fixture digest'leri byte-byte eşleşmesi doğrulandı. - Interop: MA3 enveloping + enveloped-embedded fixture'ları
verify()'da valid geçiyor. Ters yön (tr-esign → MA3) enveloping için geçiyor (chain trust hariç). Enveloped UBL için yapısal konvansiyon farkı (MA3 fragment-id kullanır) v0.2 kapsamında. - Test: 32 offline test (lint + typecheck clean). Opt-in live TSA testleri FreeTSA ile çalışıyor (BES→T + LT→LTA round-trip verify=✅).
- Örnek:
examples/sign-efatura.ts— UBL 2.1 + TR 1.2 TEMELFATURA iskeleti imzala + doğrula. - Referans:
reference/driver/Ma3Ref.java(MA3 ile fixture üret, TR policy OID'leri runtime-dump) +reference/driver/Ma3Verify.java(tr-esign çıktılarını MA3 ile doğrula).
- CAdES, PAdES, ASiC — yalnız XAdES.
- PKCS#11 / akıllı kart — yumuşak anahtar; ayrı paket
tr-esign-pkcs11planlı. - Turkcell/Vodafone/Avea Mobil İmza (MSS) — operatör hesabı gerektirir, v1.x.
- Browser — Node 20+ only.
- CLI — library-only.
- verify(): chain validation default KAPALI (kullanıcı
validateChain()ile açık trust bundle üstünde yapar). - detached verify: external URI çözücü yok (bytes dışarıdan gelirse parseable).
- XAdES-X Type1/Type2 Complete*Refs (legacy) — modern LT'de CertificateValues
- RevocationValues yeterli.
- C14N 1.1 — xmldsigjs desteklemez, TR profili gerektirmez.
- UBL enveloped imzamız (URI="" + enveloped-signature + exc-c14n) MA3
doğrulayıcısı tarafından "Temel doğrulama başarısız" olarak işaretleniyor;
MA3 fragment-id konvansiyonu kullanır. v0.2'de
ubl-ma3-compatplacement modu adayı. - Self-signed test cert Kamu SM bundle'ında olmadığı için MA3 her zaman "İmzacı sertifikası doğrulanamadı" ile reddedecek — mali mühür entegrasyonu için gerçek TR cert gerekir.
- xmldom ↔ lib.dom TypeScript tipi uyumsuzluğu 2 yerde
anycast gerektirdi (contained).
- 15 src dosyası, ~1850 satır, barrel yok, flat yapı.
- 12 subpath export (tr-esign/sign, /verify, /upgrade, /pfx, /crypto, …).
@typescript/native-preview(tsgo),oxlint,tsxdev stack.- Dependencies:
xmldsigjs,pkijs,asn1js,@peculiar/webcrypto,@xmldom/xmldom,xpath,pvutils.