Correctly decode values; refs #31
This commit is contained in:
11
configure.in
11
configure.in
@@ -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>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user