diff --git a/cdoc/CDoc.cpp b/cdoc/CDoc.cpp index c7630b0b..b1e66e81 100644 --- a/cdoc/CDoc.cpp +++ b/cdoc/CDoc.cpp @@ -74,10 +74,17 @@ getVersion() int libcdoc::CDocReader::getCDocFileVersion(DataSource *src) { - if (src->seek(0) != libcdoc::OK) return libcdoc::IO_ERROR; + if (src->seek(0) != libcdoc::OK) { + LOG_DBG("CDocReader::getCDocFileVersion (A): Source does not support seek"); + return libcdoc::IO_ERROR; + } if (CDoc2Reader::isCDoc2File(src)) return 2; - if (src->seek(0) != libcdoc::OK) return libcdoc::IO_ERROR; + if (src->seek(0) != libcdoc::OK) { + LOG_DBG("CDocReader::getCDocFileVersion (B): Source does not support seek"); + return libcdoc::IO_ERROR; + } if (CDoc1Reader::isCDoc1File(src)) return 1; + LOG_DBG("CDocReader::getCDocFileVersion: File not supported"); return libcdoc::NOT_SUPPORTED; } diff --git a/cdoc/CDoc1Reader.cpp b/cdoc/CDoc1Reader.cpp index a08ecee1..d02f4fdf 100644 --- a/cdoc/CDoc1Reader.cpp +++ b/cdoc/CDoc1Reader.cpp @@ -25,6 +25,7 @@ #include "DDocReader.h" #include "ILogger.h" #include "Lock.h" +#include "Utils.h" #include "XmlReader.h" #include "ZStream.h" @@ -85,8 +86,7 @@ CDoc1Reader::getLockForCert(const std::vector& cert) libcdoc::Certificate cc(cert); for (size_t i = 0; i < d->locks.size(); i++) { const Lock &ll = d->locks.at(i); - if (!ll.isCDoc1() || - ll.getBytes(Lock::Params::CERT) != cert || + if (ll.getBytes(Lock::Params::CERT) != cert || ll.encrypted_fmk.empty()) continue; switch(cc.getAlgorithm()) { @@ -115,11 +115,6 @@ CDoc1Reader::getFMK(std::vector& fmk, unsigned int lock_idx) { if (lock_idx >= d->locks.size()) return libcdoc::WRONG_ARGUMENTS; const Lock &lock = d->locks.at(lock_idx); - if (lock.type != Lock::Type::CDOC1) { - setLastError("Not a CDoc1 key"); - LOG_ERROR("{}", last_error); - return libcdoc::UNSPECIFIED_ERROR; - } setLastError({}); if (lock.isRSA()) { int result = crypto->decryptRSA(fmk, lock.encrypted_fmk, false, lock_idx); @@ -264,7 +259,7 @@ CDoc1Reader::readData(uint8_t *dst, size_t size) /* * CDoc1Reader constructor. - * @param file File to open reading + * @param src A DataSource of container */ CDoc1Reader::CDoc1Reader(libcdoc::DataSource *src, bool delete_on_close) : CDocReader(1), d(new Private) @@ -306,7 +301,6 @@ CDoc1Reader::CDoc1Reader(libcdoc::DataSource *src, bool delete_on_close) else if(reader.isElement("EncryptedKey")) { Lock &key = d->locks.emplace_back(Lock::Type::CDOC1); - //key.id = reader.attribute("Id"); key.label = reader.attribute("Recipient"); while(reader.read()) { @@ -314,18 +308,9 @@ CDoc1Reader::CDoc1Reader(libcdoc::DataSource *src, bool delete_on_close) break; if(reader.isEndElement()) continue; - // EncryptedData/KeyInfo/KeyName - //if(reader.isElement("KeyName")) - // key.name = reader.readText(); // EncryptedData/KeyInfo/EncryptedKey/EncryptionMethod if(reader.isElement("EncryptionMethod")) key.setString(Lock::Params::METHOD, reader.attribute("Algorithm")); - // EncryptedData/KeyInfo/EncryptedKey/KeyInfo/AgreementMethod - //else if(reader.isElement("AgreementMethod")) - // key.agreement = reader.attribute("Algorithm"); - // EncryptedData/KeyInfo/EncryptedKey/KeyInfo/AgreementMethod/KeyDerivationMethod - //else if(reader.isElement("KeyDerivationMethod")) - // key.derive = reader.attribute("Algorithm"); // EncryptedData/KeyInfo/EncryptedKey/KeyInfo/AgreementMethod/KeyDerivationMethod/ConcatKDFParams else if(reader.isElement("ConcatKDFParams")) { @@ -363,11 +348,18 @@ CDoc1Reader::CDoc1Reader(const std::string &path) bool CDoc1Reader::isCDoc1File(libcdoc::DataSource *src) { - // fixme: better check - static const std::string XML_TAG("buf(XML_TAG.size()); - if (src->read(buf.data(), XML_TAG.size()) != XML_TAG.size()) return false; - if (XML_TAG.compare(0, XML_TAG.size(), (char *) buf.data())) return false; + // todo: better check + static constexpr std::string_view XML_TAG(" buf; + if (src->read(buf.data(), XML_TAG.size()) != XML_TAG.size()) { + LOG_DBG("CDoc1Reader::isCDoc1File: Cannot read tag"); + return false; + } + if (XML_TAG.compare(0, XML_TAG.size(), (const char *) buf.data(), buf.size())) { + LOG_DBG("CDoc1Reader::isCDoc1File: Invalid tag: {}", toHex(buf)); + LOG_DBG("CDoc1Reader::isCDoc1File: Should be : {}", toHex(XML_TAG)); + return false; + } return true; } @@ -393,6 +385,7 @@ result_t CDoc1Reader::decryptData(const std::vector& fmk, std::string& return libcdoc::WORKFLOW_ERROR; } if (auto result = d->dsrc->seek(0); result != libcdoc::OK) { + LOG_ERROR("{}", d->src->getLastErrorStr(result)); return result; } diff --git a/cdoc/CDoc2Reader.cpp b/cdoc/CDoc2Reader.cpp index f6fdd03b..e6612185 100644 --- a/cdoc/CDoc2Reader.cpp +++ b/cdoc/CDoc2Reader.cpp @@ -687,8 +687,14 @@ CDoc2Reader::isCDoc2File(libcdoc::DataSource *src) { uint8_t in[libcdoc::CDoc2::LABEL.size()]; constexpr size_t len = libcdoc::CDoc2::LABEL.size(); - if (src->read(&in[0], len) != len) return false; - if (libcdoc::CDoc2::LABEL.compare(0, len, (char *) &in[0], len)) return false; + if (src->read(&in[0], len) != len) { + LOG_DBG("CDoc2Reader::isCDoc1File: Cannot read tag"); + return false; + } + if (libcdoc::CDoc2::LABEL.compare(0, len, (char *) &in[0], len)) { + LOG_DBG("CDoc2Reader::isCDoc2File: Invalid tag: {}", toHex(in)); + return false; + } return true; } diff --git a/examples/java/src/main/java/ee/ria/cdoc/CDocTool.java b/examples/java/src/main/java/ee/ria/cdoc/CDocTool.java index 26862ad4..edfcd382 100644 --- a/examples/java/src/main/java/ee/ria/cdoc/CDocTool.java +++ b/examples/java/src/main/java/ee/ria/cdoc/CDocTool.java @@ -41,6 +41,7 @@ public static void main(String[] args) { String library = "../../build/macos/cdoc/libcdoc_javad.jnilib"; Action action = Action.INVALID; ArrayList files = new ArrayList<>(); + int version = 2; String label = null; String password = null; String out = "test.cdoc2"; @@ -68,6 +69,8 @@ public static void main(String[] args) { } else if (args[i].equals("--label")) { label = getArg(i, args); i += 1; + } else if (args[i].equals("--v1")) { + version = 1; } else if (args[i].equals("--certfile")) { certfile = getArg(i, args); i += 1; @@ -134,7 +137,7 @@ public static void main(String[] args) { switch (action) { case ENCRYPT: if (certfile != null) { - encryptCertFile(out, label, certfile, files); + encryptCertFile(version, out, label, certfile, files); } else if (password != null) { encrypt(out, label, password, files); } else if (servers != null) { @@ -314,11 +317,11 @@ static void encrypt(String file, String label, String password, Collection files) { + static void encryptCertFile(int version, String file, String label, String certfile, Collection files) { System.out.println("Creating file " + file); ToolConf conf = new ToolConf(); ToolNetwork network = new ToolNetwork(); - CDocWriter wrtr = CDocWriter.createWriter(2, file, conf, null, network); + CDocWriter wrtr = CDocWriter.createWriter(version, file, conf, null, network); try { InputStream ifs = new FileInputStream(certfile); byte[] cert = ifs.readAllBytes();