Ich versuche die Signaturverifizierung für PDFs zu implementieren. Es ist ein großes Thema, also gehe ich Schritt für Schritt vor, zuerst versuche ich, im Fall eines PDFs, das ich selbst unterschrieben habe, ein positives Ergebnis zu liefern, indem ich alle Standardwerte mit dem aktuellen Acrobat verwende - das sollte SHA256 sein für den Digest und eine PKCS7-abgelöste Signatur. Also knacke ich openssl, und indem ich den Byte-Bereich lese, der in der PDF angegeben ist und die SHA256_*
Funktionen aufruft, habe ich einen Hash, mit dem ich vergleichen kann. Jetzt muss ich die Zertifikatsdaten usw. lesen und die PKCS7_*
Funktionen verwenden. Dieses schaut derjenige sein, ich will:PKCS # 7 Signaturverifizierung
int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, BIO *indata, BIO *out, int flags);
als found in the documentation. Außer dieser Dokumentation sagt mir nicht, wie ich eines dieser Dinge konstruiere. Ok, also ich denke, die BIO *indata
kann mit einigen der Funktionen in here und dem Array von certs mit these gemacht werden (obwohl nicht die genauen Details ausgearbeitet), aber was ist mit der PKCS7 *p7
, oder die STACK_OF(x)
genannt. Ich kann keinen dokumentierten Weg finden, diese Strukturen zu initialisieren. Es gibt einige pkcs7_ctrl Funktionen im pkcs7.h
Header: -
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);
aber ohne einige Richtlinien dies nicht wie ein Wald scheint wäre es wirksam zu sein blind zu beginnen Stochern in
Habe ich etwas verpasst offensichtlich. ? Wie gehe ich vor, um diese Funktion mit den Datenwerten aufzurufen, die ich aus der PDF analysiert habe?