1 // Copyright (c) 2013 Intel Corporation. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "xwalk/application/common/installer/xpk_package.h"
7 #include "base/file_util.h"
8 #include "crypto/signature_verifier.h"
9 #include "xwalk/application/common/id_util.h"
12 namespace application {
14 const uint8 kSignatureAlgorithm[15] = {
15 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
16 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00
19 const char XPKPackage::kXPKPackageHeaderMagic[] = "CrWk";
21 XPKPackage::~XPKPackage() {
24 XPKPackage::XPKPackage(const base::FilePath& path)
26 if (!base::PathExists(path))
29 scoped_ptr<ScopedStdioHandle> file(
30 new ScopedStdioHandle(base::OpenFile(path, "rb")));
32 size_t len = fread(&header_, 1, sizeof(header_), file_->get());
34 if (len < sizeof(header_))
36 if (!strncmp(XPKPackage::kXPKPackageHeaderMagic,
38 sizeof(header_.magic)) &&
39 header_.key_size > 0 &&
40 header_.key_size <= XPKPackage::kMaxPublicKeySize &&
41 header_.signature_size > 0 &&
42 header_.signature_size <= XPKPackage::kMaxSignatureKeySize) {
44 zip_addr_ = sizeof(header_) + header_.key_size + header_.signature_size;
45 fseek(file_->get(), sizeof(header_), SEEK_SET);
46 key_.resize(header_.key_size);
48 &key_.front(), sizeof(uint8), header_.key_size, file_->get());
49 if (len < header_.key_size)
52 signature_.resize(header_.signature_size);
53 len = fread(&signature_.front(),
55 header_.signature_size,
57 if (len < header_.signature_size)
60 if (!VerifySignature())
63 std::string public_key =
64 std::string(reinterpret_cast<char*>(&key_.front()), key_.size());
65 id_ = GenerateId(public_key);
70 bool XPKPackage::VerifySignature() {
71 // Set the file read position to the beginning of compressed resource file,
72 // which is behind the magic header, public key and signature key.
73 fseek(file_->get(), zip_addr_, SEEK_SET);
74 crypto::SignatureVerifier verifier;
75 if (!verifier.VerifyInit(kSignatureAlgorithm,
76 sizeof(kSignatureAlgorithm),
82 unsigned char buf[1 << 12];
84 while ((len = fread(buf, 1, sizeof(buf), file_->get())) > 0)
85 verifier.VerifyUpdate(buf, len);
86 if (!verifier.VerifyFinal())
92 bool XPKPackage::Extract(base::FilePath* target_path) {
94 *target_path = temp_dir_.path();
99 LOG(ERROR) << "The XPK file is not valid.";
103 return Package::Extract(target_path);
106 } // namespace application