Sto tentando di implementare la verifica della firma per i PDF. È un argomento importante, quindi lo sto prendendo un passo alla volta, prima di tutto sto cercando di restituire un risultato positivo nel caso di un PDF che ho firmato da solo, utilizzando tutti i valori predefiniti con l'Acrobat corrente - che dovrebbe essere SHA256 per il digest e una firma separata PKCS7. Quindi, apro openssl, e leggendo l'intervallo di byte indicato nel PDF e chiamando le funzioni SHA256_*
ho un hash da confrontare. Così ora ho bisogno di leggere i dati del certificato, ecc, e utilizzare le funzioni PKCS7_*
. Questo sembra essere quello che voglio:PKCS # 7 Verifica della firma
int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, BIO *indata, BIO *out, int flags);
come found in the documentation. Tranne che la documentazione non mi dice come costruire una di queste cose. Ok, quindi penso che il BIO *indata
possa essere fatto con alcune delle funzioni in here e l'array di certs che usa these (nonostante non abbia elaborato i dettagli precisi), ma per quanto riguarda lo PKCS7 *p7
o il STACK_OF(x)
richiesto. Non riesco a trovare alcun modo documentato per inizializzare queste strutture. Ci sono alcune funzioni pkcs7_ctrl nell'intestazione pkcs7.h
: -
long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg);
int PKCS7_set_type(PKCS7 *p7, int type);
int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other);
int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data);
int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, const EVP_MD *dgst);
int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si);
int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i);
int PKCS7_add_certificate(PKCS7 *p7, X509 *x509);
int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509);
int PKCS7_content_new(PKCS7 *p7, int nid);
int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx,
BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si);
int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, X509 *x509);
BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio);
int PKCS7_dataFinal(PKCS7 *p7, BIO *bio);
BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert);
ma senza alcune linee guida questo non sembra come una foresta che sarebbe efficace per iniziare alla cieca rovistando in
Ho perso qualcosa di ovvio. ? Come faccio a chiamare questa funzione con i valori dei dati che ho analizzato dal PDF?