void Map::loadTiles(const std::string & path) { std::ifstream file; file.open(Utils::GetWorkingDirectory() + path); if (file.is_open()) { std::string line; while (std::getline(file, line)) { if (line[0] == '|') { continue; } std::stringstream keyStream(line); int tileID; keyStream >> tileID; if (tileID < 0) { continue; } TileInfo* tile = new TileInfo(m_sharedContext, "TileSheet", tileID); //Create new tile keyStream >> tile->m_name >> tile->m_friction.x >> tile->m_friction.y >> tile->m_deadly; //Assign properties from file if (!m_tileSet.emplace(tileID, tile).second) { //Duplicate tile detected std::cerr << "Duplicate tile detected: " << tile->m_name << "\n"; delete tile; tile = nullptr; } } file.close(); }
Botan::RSA_PublicKey* Utils::base64ToRSA(const std::string& base64) { // decode public key unsigned long expectedSize = decode64Estimation(base64.length()); uint8_t* keyBuffer = new uint8_t[expectedSize]; size_t len = Botan::base64_decode(keyBuffer, base64, false); // interpret and parse into public RSA key std::istringstream iss(std::string(reinterpret_cast<char*>(keyBuffer), len)); Botan::DataSource_Stream keyStream(iss); return dynamic_cast<Botan::RSA_PublicKey*>(Botan::X509::load_key(keyStream)); }
GTEST_TEST(BZFFile, mergeKEY) { Common::MemoryReadStream *stream = new Common::MemoryReadStream(kBZFFile); Aurora::BZFFile bzf(stream); Common::MemoryReadStream keyStream(kKEYFile); Aurora::KEYFile key(keyStream); bzf.mergeKEY(key, 0); EXPECT_EQ(bzf.findResource("ozymandias", Aurora::kFileTypeTXT), 0); const Aurora::BZFFile::ResourceList &resources = bzf.getResources(); ASSERT_EQ(resources.size(), 1); const Aurora::BZFFile::Resource &resource = *resources.begin(); EXPECT_STREQ(resource.name.c_str(), "ozymandias"); EXPECT_EQ(resource.type, Aurora::kFileTypeTXT); EXPECT_EQ(resource.hash, 0); EXPECT_EQ(resource.index, 0); }
bool QSslCertificatePrivate::parse(const QByteArray &data) { QAsn1Element root; QDataStream dataStream(data); if (!root.read(dataStream) || root.type() != QAsn1Element::SequenceType) return false; QDataStream rootStream(root.value()); QAsn1Element cert; if (!cert.read(rootStream) || cert.type() != QAsn1Element::SequenceType) return false; // version or serial number QAsn1Element elem; QDataStream certStream(cert.value()); if (!elem.read(certStream)) return false; if (elem.type() == QAsn1Element::Context0Type) { QDataStream versionStream(elem.value()); if (!elem.read(versionStream) || elem.type() != QAsn1Element::IntegerType) return false; versionString = QByteArray::number(elem.value()[0] + 1); if (!elem.read(certStream)) return false; } else { versionString = QByteArray::number(1); } // serial number if (elem.type() != QAsn1Element::IntegerType) return false; serialNumberString = colonSeparatedHex(elem.value()); // algorithm ID if (!elem.read(certStream) || elem.type() != QAsn1Element::SequenceType) return false; // issuer info if (!elem.read(certStream) || elem.type() != QAsn1Element::SequenceType) return false; QByteArray issuerDer = data.mid(dataStream.device()->pos() - elem.value().length(), elem.value().length()); issuerInfo = elem.toInfo(); // validity period if (!elem.read(certStream) || elem.type() != QAsn1Element::SequenceType) return false; QDataStream validityStream(elem.value()); if (!elem.read(validityStream) || (elem.type() != QAsn1Element::UtcTimeType && elem.type() != QAsn1Element::GeneralizedTimeType)) return false; notValidBefore = elem.toDateTime(); if (!elem.read(validityStream) || (elem.type() != QAsn1Element::UtcTimeType && elem.type() != QAsn1Element::GeneralizedTimeType)) return false; notValidAfter = elem.toDateTime(); // subject name if (!elem.read(certStream) || elem.type() != QAsn1Element::SequenceType) return false; QByteArray subjectDer = data.mid(dataStream.device()->pos() - elem.value().length(), elem.value().length()); subjectInfo = elem.toInfo(); subjectMatchesIssuer = issuerDer == subjectDer; // public key qint64 keyStart = certStream.device()->pos(); if (!elem.read(certStream) || elem.type() != QAsn1Element::SequenceType) return false; publicKeyDerData.resize(certStream.device()->pos() - keyStart); QDataStream keyStream(elem.value()); if (!elem.read(keyStream) || elem.type() != QAsn1Element::SequenceType) return false; // key algorithm if (!elem.read(elem.value()) || elem.type() != QAsn1Element::ObjectIdentifierType) return false; const QByteArray oid = elem.toObjectId(); if (oid == RSA_ENCRYPTION_OID) publicKeyAlgorithm = QSsl::Rsa; else if (oid == DSA_ENCRYPTION_OID) publicKeyAlgorithm = QSsl::Dsa; else if (oid == EC_ENCRYPTION_OID) publicKeyAlgorithm = QSsl::Ec; else publicKeyAlgorithm = QSsl::Opaque; certStream.device()->seek(keyStart); certStream.readRawData(publicKeyDerData.data(), publicKeyDerData.size()); // extensions while (elem.read(certStream)) { if (elem.type() == QAsn1Element::Context3Type) { if (elem.read(elem.value()) && elem.type() == QAsn1Element::SequenceType) { QDataStream extStream(elem.value()); while (elem.read(extStream) && elem.type() == QAsn1Element::SequenceType) { QSslCertificateExtension extension; if (!parseExtension(elem.value(), &extension)) return false; extensions << extension; if (extension.oid() == QLatin1String("2.5.29.17")) { // subjectAltName QAsn1Element sanElem; if (sanElem.read(extension.value().toByteArray()) && sanElem.type() == QAsn1Element::SequenceType) { QDataStream nameStream(sanElem.value()); QAsn1Element nameElem; while (nameElem.read(nameStream)) { if (nameElem.type() == QAsn1Element::Rfc822NameType) { subjectAlternativeNames.insert(QSsl::EmailEntry, nameElem.toString()); } else if (nameElem.type() == QAsn1Element::DnsNameType) { subjectAlternativeNames.insert(QSsl::DnsEntry, nameElem.toString()); } } } } } } } } derData = data.left(dataStream.device()->pos()); null = false; return true; }
void QSslKeyPrivate::decodeDer(const QByteArray &der, bool deepClear) { clear(deepClear); if (der.isEmpty()) return; QAsn1Element elem; if (!elem.read(der) || elem.type() != QAsn1Element::SequenceType) return; if (type == QSsl::PublicKey) { // key info QDataStream keyStream(elem.value()); if (!elem.read(keyStream) || elem.type() != QAsn1Element::SequenceType) return; QVector<QAsn1Element> infoItems = elem.toVector(); if (infoItems.size() < 2 || infoItems[0].type() != QAsn1Element::ObjectIdentifierType) return; if (algorithm == QSsl::Rsa) { if (infoItems[0].toObjectId() != RSA_ENCRYPTION_OID) return; // key data if (!elem.read(keyStream) || elem.type() != QAsn1Element::BitStringType || elem.value().isEmpty()) return; if (!elem.read(elem.value().mid(1)) || elem.type() != QAsn1Element::SequenceType) return; if (!elem.read(elem.value()) || elem.type() != QAsn1Element::IntegerType) return; keyLength = numberOfBits(elem.value()); } else if (algorithm == QSsl::Dsa) { if (infoItems[0].toObjectId() != DSA_ENCRYPTION_OID) return; if (infoItems[1].type() != QAsn1Element::SequenceType) return; // key params QVector<QAsn1Element> params = infoItems[1].toVector(); if (params.isEmpty() || params[0].type() != QAsn1Element::IntegerType) return; keyLength = numberOfBits(params[0].value()); } } else { QVector<QAsn1Element> items = elem.toVector(); if (items.isEmpty()) return; // version if (items[0].type() != QAsn1Element::IntegerType || items[0].value().toHex() != "00") return; if (algorithm == QSsl::Rsa) { if (items.size() != 9 || items[1].type() != QAsn1Element::IntegerType) return; keyLength = numberOfBits(items[1].value()); } else if (algorithm == QSsl::Dsa) { if (items.size() != 6 || items[1].type() != QAsn1Element::IntegerType) return; keyLength = numberOfBits(items[1].value()); } } derData = der; isNull = false; }