protocol="application/pgp-signed"
. Der Parameter
micalg kann bei der Benuztung von GPGME ignoriert werden. Es
sollte hierfür ein entsprechender MIME Handler implementiert werden.
Ein derartiges Objekt besteht aus 2 MIME Teilen: Dem signierten Teil, der ein beliebiges MIME Objekt sein kann, und dem Signatur Teil der den Content-Type application/pgp-signature hat. Beide Teile werden extrahiert und GPGME zur Prüfung zugeführt. Die MIME Header des ersten Teils sind mit signiert und müssen deswegen auch an GPGME weitergegeben werden. Beim 2. Teil kann dies gemacht werden, da GPGME diese Header ignoriert.
Hier ein Beispiel ohne jegliche Fehlerbehandlung:
GpgmeCtx ctx; GpgmeSigStat Status; GpgmeData datapart, sigpart; const char *nota_xml; gpgme_new (&ctx); gpgme_data_new_from_mem (&datapart, mime_part_1, mime_part_1_len, TRUE ); gpgme_data_new_from_mem (&sigpart, mime_part_2, mime_part_2_len, TRUE ); gpgme_op_verify (ctx, sigpart, datapart, &status); gpgme_data_release(datapart); gpgme_data_release(sigpart); show_status (status); show_extended_status (ctx) nota_xml = gpgme_get_notation (ctx); if (nota_xml) show_notation_data (nota_xml); gpgme_release (ctx);
Beispiele zu den MIME Objekten finden sich im RFC2015[2].
show_status kann lediglich anzeigen, ob die Signatur gültig ist oder nicht und das auch nur wenn es sich um eine einzelne Signatur handelt. Sind mehrere Signaturen mit einem unterschiedlichen Status vorhanden, so wird lediglich ein besonderes Statuswert zurückgegeben. Bessere Informationen wird die oben angedeutete Funktion show_extended_status liefern; diese könnte so aussehen:
int idx; GpgmeSigStat status; time_t created; for (idx=0; gpgme_get_sig_status(ctx, idx, &status, &created); idx++ ) { const char *userid = \"[?]\"; GpgmeKey key = NULL; if ( !gpgme_get_sig_key (ctx, idx, &key) ) userid = gpgme_key_get_string_attr (key, GPGME_ATTR_USERID, NULL, 0); printf ("%s from \"%s\"\n", status_to_string(status), userid ); gpgme_key_unref (key); }
Falls Notation Daten vorhanden sind, so wereden sie als ein XML String für alle Signaturen geliefert. Weitere Informationen über den Key können entweder mittels der obigen Funktion oder aber durch gpgme_key_get_as_xml ermittelt werden.