Added a (small) usage howto about the openssl_act engine, based on the PoC sources, see #6
parent
72281a55f0
commit
c627f638b2
1 changed files with 75 additions and 0 deletions
@ -0,0 +1,75 @@ |
||||
Benutzung der engine_act OpenSSL engine |
||||
|
||||
Abgesehen von den Engine-Befehlen "ENUM_CERTS" und "PIN" (s.u.) läuft die Benutzung dieser Engine über OpenSSL selbst ab. |
||||
|
||||
1) Laden/Einbinden |
||||
|
||||
SO_PATH gibt den absoluten Pfad zur Engine an. |
||||
|
||||
#include <openssl/engine.h> |
||||
|
||||
ENGINE *e; |
||||
|
||||
ENGINE_load_dynamic(); |
||||
e = ENGINE_by_id("dynamic"); |
||||
|
||||
int r= ENGINE_ctrl_cmd_string(e, "SO_PATH", "C:\\Windows\\System32\\engine_act.dll", 0); |
||||
r= ENGINE_ctrl_cmd_string(e, "ID", "act", 0); |
||||
r= ENGINE_ctrl_cmd_string(e, "LIST_ADD", "1", 0); |
||||
r= ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0); |
||||
|
||||
2) Entfernen der Engine und abschliessende Operationen |
||||
|
||||
ENGINE_finish(e); |
||||
ENGINE_cleanup(); |
||||
|
||||
|
||||
3) Enumerierung der erreichbaren Smartcard-Zertifikate und Schlüssel |
||||
|
||||
#include <openssl/engine.h> |
||||
#include "engine_sct.h" |
||||
|
||||
enum_certs_s* certs_found = NULL; |
||||
|
||||
int r = ENGINE_ctrl_cmd(e, "ENUM_CERTS", 0, &certs_found, NULL, 0); |
||||
|
||||
|
||||
enum_certs_s ist eine Struktur von der folgenden Form: |
||||
|
||||
struct enum_cert_s |
||||
{ |
||||
const char* id; // ID which can be passed as key ID for crypto operations |
||||
const char* name; // Alternatively one can use the name, provided it's unique for the token. |
||||
X509* cert; // Decoded certificate |
||||
}; |
||||
|
||||
struct enum_certs_s |
||||
{ |
||||
unsigned int num_certs; // Number of certificates present |
||||
enum_cert_s certificate[]; // Array of identifiers and certificates |
||||
}; |
||||
|
||||
|
||||
So kann man dann mit einer for-Schleife über die einzelnen Zertifikate/Schlüsselidentifikationen iterieren |
||||
|
||||
for(int i=0;i<certs_found->num_certs;i++) |
||||
{ |
||||
enum_cert_s* cert_data = &(certs_found->certificate[i]); |
||||
|
||||
.... |
||||
} |
||||
|
||||
4) Laden eines Schlüssels zur Benutzung |
||||
|
||||
Sowohl cert_data.id als auch cert_data.name können als Parameter für ENGINE_load_public_key() oder ENGINE_load_private_key() verwendet werden. |
||||
cert_data.name hat das Format "slot-<x>-name-<name>", der Authenthisierungsschlüssel im ersten (oder einzigen) Slot wäre dann |
||||
|
||||
"slot-0-name-SwissSign_digSig" |
||||
|
||||
ENGINE_load_private_key() versucht gleich schon ein Login auf der Karte. Man kann ein Pin-Dialog per Callback übergeben, aber man kann auch |
||||
die PIN von vornherein setzen, und zwar mit |
||||
|
||||
ENGINE_ctrl_cmd_string(e, "PIN", pin_str, 0); |
||||
|
||||
/!\ pin_str ist ein nullterminierter String (char *) und wird in der Funktion überschrieben! Wird die PIN also später anderswo noch gebraucht, muss man |
||||
hier eine Kopie des Strings übergeben. |
Loading…
Reference in new issue