#include "xwalk/application/common/package/xpk_package.h"
+#include <string>
+
#include "base/file_util.h"
#include "base/files/scoped_file.h"
#include "crypto/signature_verifier.h"
}
XPKPackage::XPKPackage(const base::FilePath& path)
- : Package(path) {
+ : Package(path, Manifest::TYPE_MANIFEST),
+ header_(),
+ zip_addr_(0) {
if (!base::PathExists(path))
return;
- type_ = XPK;
scoped_ptr<base::ScopedFILE> file(
new base::ScopedFILE(base::OpenFile(path, "rb")));
file_ = file.Pass();
is_valid_ = false;
if (len < sizeof(header_))
return;
- if (!strncmp(XPKPackage::kXPKPackageHeaderMagic,
- header_.magic,
+ if (!strncmp(XPKPackage::kXPKPackageHeaderMagic, header_.magic,
sizeof(header_.magic)) &&
header_.key_size > 0 &&
header_.key_size <= XPKPackage::kMaxPublicKeySize &&
header_.signature_size > 0 &&
header_.signature_size <= XPKPackage::kMaxSignatureKeySize) {
- is_valid_ = true;
- zip_addr_ = sizeof(header_) + header_.key_size + header_.signature_size;
- fseek(file_->get(), sizeof(header_), SEEK_SET);
- key_.resize(header_.key_size);
- size_t len = fread(
- &key_.front(), sizeof(uint8), header_.key_size, file_->get());
- if (len < header_.key_size)
- is_valid_ = false;
-
- signature_.resize(header_.signature_size);
- len = fread(&signature_.front(),
- sizeof(uint8),
- header_.signature_size,
- file_->get());
- if (len < header_.signature_size)
- is_valid_ = false;
-
- if (!VerifySignature())
- is_valid_ = false;
-
- std::string public_key =
- std::string(reinterpret_cast<char*>(&key_.front()), key_.size());
- id_ = GenerateId(public_key);
+ is_valid_ = true;
+ zip_addr_ = sizeof(header_) + header_.key_size + header_.signature_size;
+ if (fseek(file_->get(), sizeof(header_), SEEK_SET)) {
+ is_valid_ = false;
+ return;
+ }
+ key_.resize(header_.key_size);
+ size_t len = fread(&key_.front(), sizeof(uint8), header_.key_size,
+ file_->get());
+ if (len < header_.key_size)
+ is_valid_ = false;
+
+ signature_.resize(header_.signature_size);
+ len = fread(&signature_.front(), sizeof(uint8), header_.signature_size,
+ file_->get());
+ if (len < header_.signature_size)
+ is_valid_ = false;
+
+ if (!VerifySignature())
+ is_valid_ = false;
+
+ std::string public_key =
+ std::string(reinterpret_cast<char*>(&key_.front()), key_.size());
+ id_ = GenerateId(public_key);
}
}
bool XPKPackage::VerifySignature() {
// Set the file read position to the beginning of compressed resource file,
// which is behind the magic header, public key and signature key.
- fseek(file_->get(), zip_addr_, SEEK_SET);
+ if (fseek(file_->get(), zip_addr_, SEEK_SET))
+ return false;
crypto::SignatureVerifier verifier;
if (!verifier.VerifyInit(kSignatureAlgorithm,
sizeof(kSignatureAlgorithm),