Added all SuisseID Functionality except certificate import from server, which shall remain closed; refs #28
This commit is contained in:
@@ -86,7 +86,7 @@ int main(int argc, char** argv) try {
|
||||
std::cout<<"Pin: ";
|
||||
std::string pin;
|
||||
std::cin>>pin;
|
||||
cryptoki::Session::Login l(session, pin);
|
||||
session.login(pin);
|
||||
keys = session.find(cryptoki::Attribute(CKA_CLASS)
|
||||
.from<CK_OBJECT_CLASS>(CKO_PRIVATE_KEY),
|
||||
id);
|
||||
|
@@ -3,6 +3,7 @@
|
||||
## 1 2 3 4 5 6 7 8
|
||||
## 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||
|
||||
noinst_HEADERS = suisse-id-demo.hxx
|
||||
noinst_PROGRAMS = pcsc-demo cryptoki-sign-demo cryptoki-demo \
|
||||
openssl-tcp-demo openssl-ssl-demo \
|
||||
openssl-engine-demo suisse-id-demo cardos-demo
|
||||
@@ -32,7 +33,14 @@ cryptoki_sign_demo_SOURCES = cryptoki-sign-demo.cxx
|
||||
openssl_tcp_demo_SOURCES = openssl-tcp-demo.cxx
|
||||
openssl_ssl_demo_SOURCES = openssl-ssl-demo.cxx
|
||||
openssl_engine_demo_SOURCES = openssl-engine-demo.cxx
|
||||
suisse_id_demo_SOURCES = suisse-id-demo.cxx
|
||||
cardos_demo_SOURCES = cardos-demo.cxx
|
||||
suisse_id_demo_SOURCES = suisse-id-demo.cxx
|
||||
# moc_suisse-id-demo.cxx
|
||||
#suisse_id_demo_CXXFLAGS = ${QT_CFLAGS}
|
||||
#suisse_id_demo_LDADD = ${QT_LIBS}
|
||||
|
||||
moc_%.cxx: %.hxx
|
||||
moc -o $@ $<
|
||||
|
||||
CLEANFILES = moc_suisse-id-demo.cxx
|
||||
MAINTAINERCLEANFILES = makefile.in
|
||||
|
@@ -14,11 +14,11 @@ class TestEngine: virtual public openssl::Engine {
|
||||
public:
|
||||
|
||||
virtual const char* id() {
|
||||
OPENSSL_LOG("log");
|
||||
CRYPTOLOG("log");
|
||||
return "TestEngine_ID";
|
||||
}
|
||||
virtual const char* name() {
|
||||
OPENSSL_LOG("log");
|
||||
CRYPTOLOG("log");
|
||||
return "TestEngine_NAME";
|
||||
}
|
||||
};
|
||||
|
@@ -5,14 +5,10 @@
|
||||
// 1 2 3 4 5 6 7 8
|
||||
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||
|
||||
#include <suisseid.hxx>
|
||||
|
||||
#include <suisse-id-demo.hxx>
|
||||
#include <mrw/args.hxx>
|
||||
#include <stdexcept>
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char** argv) try {
|
||||
|
||||
std::string lib("libcvP11.so");
|
||||
mrw::args::parse(argc, argv,
|
||||
"Sign a text (optionally several times for performance"
|
||||
@@ -23,13 +19,77 @@ int main(int argc, char** argv) try {
|
||||
<<mrw::args::param(lib, "lib")));
|
||||
|
||||
suisseid::Cards cards(suisseid::Scanner(lib).scan());
|
||||
for (suisseid::Cards::iterator card(cards.begin()); card!=cards.end(); ++card)
|
||||
std::cout<<"Found SuisseID:"<<std::endl
|
||||
<<" Reader Name: "<<(*card)->name()<<std::endl
|
||||
<<" Version: "<<(*card)->version()<<std::endl
|
||||
<<" PIN-Length: "<<(*card)->minimalPinLength()
|
||||
<<" - "<<(*card)->maximalPinLength()<<std::endl;
|
||||
for (suisseid::Cards::iterator card(cards.begin());
|
||||
card!=cards.end(); ++card) {
|
||||
std::string choice;
|
||||
while (choice!="n") try {
|
||||
std::cout<<"=================================================="<<std::endl
|
||||
<<"Found SuisseID:"<<std::endl
|
||||
<<" Reader Name: "<<(*card)->name()<<std::endl
|
||||
<<" Version: "<<(*card)->version()<<std::endl
|
||||
<<" PIN-Length: "<<(*card)->minimalPinLength()
|
||||
<<" - "<<(*card)->maximalPinLength()<<std::endl
|
||||
<<" PIN retries:"<<std::endl
|
||||
<<" PKCS#15: "<<(*card)->pkcs15PinRetries()<<std::endl
|
||||
<<" SigG: "<<(*card)->sigGPinRetries()<<std::endl
|
||||
<<" Transport: "<<(*card)->transportPinRetries()<<std::endl
|
||||
<<" PUK: "<<(*card)->pukRetries()<<std::endl;
|
||||
cryptoki::Session session((*card)->slot());
|
||||
cryptoki::Session::Info info(session.getsessioninfo());
|
||||
std::cout<<" Session:"<<std::endl
|
||||
<<" Slot: "<<info.slotID<<std::endl
|
||||
<<" State: "<<session.state(info)<<std::endl
|
||||
<<" Flags: "<<((info.flags|CKF_RW_SESSION)
|
||||
?"read/write":"read only")<<std::endl
|
||||
<<" Device Error: "<<info.ulDeviceError<<std::endl;
|
||||
cryptoki::ObjectList certs
|
||||
(session.find(cryptoki::Attribute(CKA_CLASS)
|
||||
.from<CK_OBJECT_CLASS>(CKO_CERTIFICATE)));
|
||||
std::cout<<" Certificates: "<<certs.size()<<std::endl;
|
||||
std::cout<<"--------------------------------------------------"<<std::endl
|
||||
<<"Your Order Sir:"<<std::endl
|
||||
<<" n: proceed to next card"<<std::endl
|
||||
<<" c: check this card"<<std::endl
|
||||
<<" r: remove all certificates"<<std::endl
|
||||
<<" p: PIN change"<<std::endl
|
||||
<<" i: (re-) import certificates"<<std::endl
|
||||
<<" q: quit"<<std::endl;
|
||||
std::cin>>choice;
|
||||
try {
|
||||
if (choice=="n") { // handled above in the while-loop
|
||||
} else if (choice=="c") {
|
||||
TextualCycle check(*card);
|
||||
if (check.run())
|
||||
std::cout<<"----> SuisseID is fine"<<std::endl;
|
||||
else
|
||||
std::cout<<"****> SuisseID is bad"<<std::endl;
|
||||
} else if (choice=="r") {
|
||||
std::cout<<"Not yet implemented."<<std::endl;
|
||||
} else if (choice=="p") {
|
||||
std::string oldpin, newpin;
|
||||
std::cout<<"Enter Old PIN: ";
|
||||
std::cin>>oldpin;
|
||||
std::cout<<"Enter New PIN: ";
|
||||
std::cin>>newpin;
|
||||
if (oldpin.size() && newpin.size())
|
||||
(*card)->changePins(newpin, oldpin);
|
||||
} else if (choice=="i") {
|
||||
TextualCycle check(*card);
|
||||
check.installCerts(true);
|
||||
} else if (choice=="q") {
|
||||
return 0;
|
||||
} else {
|
||||
std::cout<<"I beg your pardon, Sir?"<<std::endl;
|
||||
}
|
||||
} catch (const std::exception& x) {
|
||||
std::cerr<<"**** ERROR: "<<x.what()<<std::endl;
|
||||
}
|
||||
} catch (std::exception& x) {
|
||||
std::cerr<<"**** ERROR: "<<x.what()<<std::endl;
|
||||
choice="n"; // proceed
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} catch (std::exception& x) {
|
||||
std::cerr<<"**** ERROR in "<<*argv<<": "<<x.what()<<std::endl;
|
||||
std::cerr<<"**** ERROR: "<<x.what()<<std::endl;
|
||||
}
|
||||
|
100
doc/examples/suisse-id-demo.hxx
Normal file
100
doc/examples/suisse-id-demo.hxx
Normal file
@@ -0,0 +1,100 @@
|
||||
/*! @file
|
||||
|
||||
@id $Id$
|
||||
*/
|
||||
// 1 2 3 4 5 6 7 8
|
||||
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||
|
||||
#ifndef SUISSE_ID_DEMO_HXX
|
||||
#define SUISSE_ID_DEMO_HXX
|
||||
|
||||
#include <suisseid.hxx>
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
|
||||
class TextualCycle: public suisseid::StatusCycle {
|
||||
|
||||
public:
|
||||
|
||||
TextualCycle(mrw::Shared<suisseid::Card> card):
|
||||
StatusCycle(card) {
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
/// @name slots
|
||||
//@{
|
||||
|
||||
virtual PinPukChange pinChangeTransportPin() {
|
||||
PinPukChange pinpuk;
|
||||
std::cout<<"Enter Transport PIN: ";
|
||||
std::cin>>pinpuk.oldpin;
|
||||
std::cout<<"Enter New PIN: ";
|
||||
std::cin>>pinpuk.newpin;
|
||||
return pinpuk;
|
||||
}
|
||||
|
||||
virtual PinPukChange pinChangePuk() {
|
||||
PinPukChange pinpuk;
|
||||
std::cout<<"Enter PUK to unlock PKCS#15 PIN: ";
|
||||
std::cin>>pinpuk.oldpin;
|
||||
std::cout<<"Enter New PKCS#15 PIN: ";
|
||||
std::cin>>pinpuk.newpin;
|
||||
return pinpuk;
|
||||
}
|
||||
|
||||
virtual void transportPinLocked() {
|
||||
std::cout<<"Transport PIN is Locked!"<<std::endl;
|
||||
}
|
||||
|
||||
virtual void pkcs15PinLocked() {
|
||||
std::cout<<"PKCS#15 PIN is Locked!"<<std::endl;
|
||||
}
|
||||
|
||||
virtual void sigGPinLocked() {
|
||||
std::cout<<"SigG PIN is Locked!"<<std::endl;
|
||||
}
|
||||
|
||||
virtual void pukLocked() {
|
||||
std::cout<<"PUK is Locked!"<<std::endl;
|
||||
}
|
||||
|
||||
virtual void certsExpireSoon() {
|
||||
std::cout<<"Certificates Expire Soon!"<<std::endl;
|
||||
}
|
||||
|
||||
virtual void certsExpired() {
|
||||
std::cout<<"Certificates Expired!"<<std::endl;
|
||||
}
|
||||
|
||||
virtual void certsRevoked() {
|
||||
std::cout<<"Certificates Revoked!"<<std::endl;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
/// install certificates on the card
|
||||
virtual bool installCerts(bool force = true) {
|
||||
std::cout<<"Installing Certificates ..."<<std::endl;
|
||||
std::string pin;
|
||||
std::cout<<"Enter PIN (x to abort): ";
|
||||
std::cin>>pin;
|
||||
if (pin=="x") {
|
||||
std::cout<<std::endl<<"User aborted"<<std::endl;
|
||||
return false; // user aborts
|
||||
}
|
||||
cryptoki::Session session(card()->slot());
|
||||
try {
|
||||
session.login(pin);
|
||||
} catch (const cryptoki::wrong_pin& x) {
|
||||
std::cout<<"**** Wrong PIN!"<<std::endl;
|
||||
std::cout<<x.what()<<std::endl;
|
||||
return false;
|
||||
}
|
||||
std::cout<<"**** Not implemented"<<std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user