Semnare documente
EidKit folosește cheia de non-repudiere de pe cipul CEI românesc pentru a produce o semnătură calificată ECDSA-SHA384 peste un hash de document. Aceasta permite semnarea PDF conform PAdES/eIDAS.
Cum funcționează
- Aplicația ta calculează un hash SHA-384 al intervalului de octeți din document care urmează să fie semnat
- Utilizatorul apropie cardul și introduce PIN-ul de semnătură de 6 cifre
- Cipul semnează hash-ul folosind cheia de non-repudiere (referință cheie
0x8Eîn applet-ul GenPKI) - EidKit returnează semnătura ECDSA brută de 96 de octeți
r||sși certificatul X.509 DER
Semnează un document
- Android (Kotlin)
- iOS (Swift)
// 1. Calculează hash-ul SHA-384 al conținutului documentului
val hash = MessageDigest.getInstance("SHA-384").digest(bytesDocument)
// hash.size == 48
// 2. Execută sesiunea de semnare
val result = EidKit.signer(can = canIntrodusDeutilizator)
.sign(hash, signingPin = pinSemnareIntrodusDeutilizator)
.execute(isoDep)
// result.signature — semnătură ECDSA-SHA384 brută r||s, 96 octeți
// result.certificate — certificat X.509 DER (CE8E)
import CryptoKit
// 1. Calculează hash-ul SHA-384 al conținutului documentului
let hash = Data(SHA384.hash(data: bytesDocument))
// hash.count == 48
// 2. Execută sesiunea de semnare
let result = try await EidKit.signer(can: canIntrodusDeutilizator)
.sign(hash: hash, signingPin: pinSemnareIntrodusDeutilizator)
.execute()
// result.signature — semnătură ECDSA-SHA384 brută r||s, 96 octeți
// result.certificate — certificat X.509 DER (CE8E)
Integrarea semnăturii în PDF
SignResult.signature este o valoare r||s brută. Pentru a o integra într-un PDF (PAdES/eIDAS), trebuie împachetată într-o structură CMS/PKCS#7 SignedData împreună cu certificatul.
Opțiuni:
- Serviciu de semnare EidKit — setează
EidKitConfig.signingServiceUrlpentru a delega împachetarea CMS, marcarea temporală și LTV către backend-ul EidKit (sau propria instanță on-premise) - Implementare proprie — folosește Apache PDFBox (Android) sau PDFKit/BouncyCastle pentru a construi structura CMS din
result.signatureșiresult.certificate
Evenimente de progres
- Android (Kotlin)
- iOS (Swift)
EidKit.signer(can = canIntrodusDeutilizator)
.sign(hash, signingPin = pinSemnareIntrodusDeutilizator)
.executeFlow(isoDep)
.collect { event ->
when (event) {
is SignEvent.PaceEstablished -> afiseazaPas("Canal securizat deschis")
is SignEvent.PinVerified -> afiseazaPas("PIN acceptat")
is SignEvent.Done -> afiseazaRezultat(event.result)
}
}
let result = try await EidKit.signer(can: canIntrodusDeutilizator)
.sign(hash: hash, signingPin: pinSemnareIntrodusDeutilizator)
.execute { event in
switch event {
case .paceEstablished: afiseazaPas("Canal securizat deschis")
case .pinVerified: afiseazaPas("PIN acceptat")
}
}
PIN de semnătură
PIN-ul de semnătură are 6 cifre — diferit de PIN-ul de autentificare de 4 cifre folosit pentru KYC. CEI românesc permite doar 3 încercări incorecte de PIN de semnătură înainte de blocarea permanentă a cheii de semnare.