Correctly decode values; refs #31

master
Marc Wäckerlin 11 years ago
parent eb94c1da69
commit a295361318
  1. 27
      configure.in
  2. 2
      doc/examples/makefile.am
  3. 20
      src/cardos.hxx
  4. 2
      src/makefile.am
  5. 9
      src/suisseid.hxx

@ -99,24 +99,23 @@ PKG_CHECK_MODULES([QT_GUI], [Qt5Core Qt5Gui Qt5Widgets],
UIC=${UIC:-$(pkg-config --variable=uic_location Qt5Core)} UIC=${UIC:-$(pkg-config --variable=uic_location Qt5Core)}
MOC=${MOC:-$(pkg-config --variable=moc_location Qt5Core)} MOC=${MOC:-$(pkg-config --variable=moc_location Qt5Core)}
have_qtgui=1], have_qtgui=1],
[PKG_CHECK_MODULES([QT_GUI], [QtCore QtGui])], [PKG_CHECK_MODULES([QT_GUI], [QtCore QtGui],
[AC_DEFINE([HAVE_QTGUI]) [AC_DEFINE([HAVE_QTGUI])
UIC=${UIC:-$(pkg-config --variable=uic_location QtCore)} UIC=${UIC:-$(pkg-config --variable=uic_location QtCore)}
MOC=${MOC:-$(pkg-config --variable=moc_location QtCore)} MOC=${MOC:-$(pkg-config --variable=moc_location QtCore)}
have_qtgui=1], have_qtgui=1],
[have_qtgui=0]) [have_qtgui=0])])
AM_CONDITIONAL(HAVE_QTGUI, test "$have_qtgui" = "1") AM_CONDITIONAL(HAVE_QTGUI, test "$have_qtgui" = "1")
PKG_CHECK_MODULES([QT_NETWORK], [Qt5Network], PKG_CHECK_MODULES([QT_NETWORK], [Qt5Network],
[AC_DEFINE([HAVE_QTNETWORK]) [UIC=${UIC:-$(pkg-config --variable=uic_location Qt5Core)}
UIC=${UIC:-$(pkg-config --variable=uic_location Qt5Core)}
MOC=${MOC:-$(pkg-config --variable=moc_location Qt5Core)} MOC=${MOC:-$(pkg-config --variable=moc_location Qt5Core)}
have_qtnetwork=1], have_qtnetwork=1],
[PKG_CHECK_MODULES([QT_NETWORK], [QtNetwork])], [PKG_CHECK_MODULES([QT_NETWORK], [QtNetwork],
[AC_DEFINE([HAVE_QTNETWORK]) [AC_DEFINE([HAVE_QTNETWORK])
UIC=${UIC:-$(pkg-config --variable=uic_location QtCore)} UIC=${UIC:-$(pkg-config --variable=uic_location QtCore)}
MOC=${MOC:-$(pkg-config --variable=moc_location QtCore)} MOC=${MOC:-$(pkg-config --variable=moc_location QtCore)}
have_qtnetwork=1], have_qtnetwork=1],
[have_qtnetwork=0]) [have_qtnetwork=0])])
AM_CONDITIONAL(HAVE_QTNETWORK, test "$have_qtnetwork" = "1") AM_CONDITIONAL(HAVE_QTNETWORK, test "$have_qtnetwork" = "1")
AC_SUBST(UIC) AC_SUBST(UIC)
AC_SUBST(MOC) AC_SUBST(MOC)

@ -40,7 +40,7 @@ if HAVE_QTNETWORK
noinst_PROGRAMS += suisse-id-demo noinst_PROGRAMS += suisse-id-demo
noinst_HEADERS = suisse-id-demo.hxx noinst_HEADERS = suisse-id-demo.hxx
suisse_id_demo_SOURCES = suisse-id-demo.cxx suisse_id_demo_SOURCES = suisse-id-demo.cxx
suisse_id_demo_CXXFLAGS = ${QT_NETWORK_CFLAGS} -fPIC suisse_id_demo_CXXFLAGS = ${QT_NETWORK_CFLAGS}
suisse_id_demo_LDADD = ${QT_NETWORK_LIBS} suisse_id_demo_LDADD = ${QT_NETWORK_LIBS}
endif endif

@ -128,17 +128,21 @@ namespace cardos {
//@{ //@{
class BerValue { class BerValue {
public: public:
enum Class { enum Class {
UNIVERSAL = 0x00, UNIVERSAL = 0x00,
APPLICATION = 0x40, APPLICATION = 0x40,
CONTEXT_SPECIFIC = 0x80, CONTEXT_SPECIFIC = 0x80,
PRIVATE = 0xC0 PRIVATE = 0xC0
}; };
enum PC { enum PC {
PRIMITIVE = 0x00, PRIMITIVE = 0x00,
CONSTRUCTED = 0x20 CONSTRUCTED = 0x20
}; };
enum Type { enum Type {
END_OF_CONTENT = 0x00, END_OF_CONTENT = 0x00,
BOOLEAN = 0x01, BOOLEAN = 0x01,
@ -181,6 +185,10 @@ namespace cardos {
} }
BerValue(std::string& content) { BerValue(std::string& content) {
set(content);
}
void set(std::string& content) {
if (content.size()<2) if (content.size()<2)
throw wrong_dataformat(content, "not a BER, header size too small: \"" throw wrong_dataformat(content, "not a BER, header size too small: \""
+crypto::binToHex(content)+"\""); +crypto::binToHex(content)+"\"");
@ -198,6 +206,11 @@ namespace cardos {
public: public:
BerValue(const std::string& content) {
std::string contentCopy(content);
set(contentCopy);
}
BerValue(unsigned char t, const std::string& v): BerValue(unsigned char t, const std::string& v):
_tag(t), _value(v) { _tag(t), _value(v) {
if (isContainer()) if (isContainer())
@ -274,7 +287,8 @@ namespace cardos {
std::string print(int indent=0, int indentStep = 4) { std::string print(int indent=0, int indentStep = 4) {
std::stringstream ss; std::stringstream ss;
ss<<std::string(indent*indentStep, ' ')<<'['<<crypto::binToHex(_tag)<<'='; ss<<std::string(indent*indentStep, ' ')<<'['<<crypto::binToHex(_tag)
<<'=';
switch (tagClass()) { switch (tagClass()) {
case UNIVERSAL: ss<<"UNIVERSAL,"; break; case UNIVERSAL: ss<<"UNIVERSAL,"; break;
case APPLICATION: ss<<"APPLICATION,"; break; case APPLICATION: ss<<"APPLICATION,"; break;
@ -1471,8 +1485,8 @@ namespace cardos {
return "No return code received"; return "No return code received";
default: default:
std::stringstream ss; std::stringstream ss;
if ((ret&&0xff00)==0x6100) if ((ret&0xff00)==0x6100)
ss<<(ret&&0xff)<<" bytes of response data can be received" ss<<(ret&0xff)<<" bytes of response data can be received"
<<" with GET RESPONSE (only T=0 transmission protocol)"; <<" with GET RESPONSE (only T=0 transmission protocol)";
else else
ss<<"Unknown CardOS error code: 0x"<<std::hex<<ret; ss<<"Unknown CardOS error code: 0x"<<std::hex<<ret;

@ -57,7 +57,7 @@ cardgui_SOURCES = cardgui.cxx cardgui.hxx password.hxx cardgui-model.hxx \
nodist_cardgui_SOURCES = cardgui_ui.hxx password_ui.hxx \ nodist_cardgui_SOURCES = cardgui_ui.hxx password_ui.hxx \
moc_cardgui.cxx moc_password.cxx moc_cardgui-model.cxx moc_cardgui.cxx moc_password.cxx moc_cardgui-model.cxx
BUILT_SOURCES = ${nodist_cardgui_SOURCES} BUILT_SOURCES = ${nodist_cardgui_SOURCES}
cardgui_CXXFLAGS = ${QT_GUI_CFLAGS} -fPIC cardgui_CXXFLAGS = ${QT_GUI_CFLAGS}
cardgui_LDADD = ${QT_GUI_LIBS} libpcscxx.la ${libpcscxx_la_LIBADD} cardgui_LDADD = ${QT_GUI_LIBS} libpcscxx.la ${libpcscxx_la_LIBADD}
endif endif

@ -325,7 +325,7 @@ namespace suisseid {
} }
virtual unsigned int maximalPinLength() { virtual unsigned int maximalPinLength() {
if (_maxPinLen==0) evaluatePinLengths(); if (_maxPinLen==(unsigned int)-1) evaluatePinLengths();
return _maxPinLen; return _maxPinLen;
} }
@ -376,11 +376,12 @@ namespace suisseid {
} }
std::string versionFromMFFile(const std::string& file) { std::string versionFromMFFile(const std::string& file) {
CRYPTOLOG("log");
pcsc::Connection::Reader::Transaction lock(_reader); pcsc::Connection::Reader::Transaction lock(_reader);
try { try {
selectMfFile(file); return _version = cardos::BerValue(readBinary(file))[0].string();
return _version = cardos::BerValues(readBinary())[0].string(); } catch (const std::exception& x) {
} catch (...) { CRYPTOLOG("exception, no version file: "<<x.what());
return _version = "<unknown>"; return _version = "<unknown>";
} }
} }

Loading…
Cancel
Save