diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index 6d10718..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,101 +0,0 @@
-#
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH := $(my-dir)
-
-bvb_common_cflags := \
-    -D_FILE_OFFSET_BITS=64 \
-    -D_POSIX_C_SOURCE=199309L \
-    -Wa,--noexecstack \
-    -Werror \
-    -Wall \
-    -Wextra \
-    -Wformat=2 \
-    -Wno-psabi \
-    -Wno-unused-parameter \
-    -ffunction-sections \
-    -fstack-protector-strong \
-    -fvisibility=hidden
-bvb_common_cppflags := \
-    -Wnon-virtual-dtor \
-    -fno-strict-aliasing
-bvb_common_ldflags := \
-    -Wl,--gc-sections
-
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := bvbtool
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_IS_HOST_MODULE := true
-LOCAL_MODULE := bvbtool
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libbvb_refimpl
-LOCAL_MODULE_HOST_OS := linux
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_CLANG := true
-LOCAL_CFLAGS := $(bvb_common_cflags) -fno-stack-protector -DBVB_ENABLE_DEBUG -DBVB_REFIMPL_COMPILATION
-LOCAL_LDFLAGS := $(bvb_common_ldflags)
-LOCAL_C_INCLUDES :=
-LOCAL_SRC_FILES := \
-    refimpl/bvb_property.c \
-    refimpl/bvb_rsa.c \
-    refimpl/bvb_sha256.c \
-    refimpl/bvb_sha512.c \
-    refimpl/bvb_util.c \
-    refimpl/bvb_verify.c
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libbvb_refimpl_sysdeps
-LOCAL_MODULE_HOST_OS := linux
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_CLANG := true
-LOCAL_CFLAGS := $(bvb_common_cflags) -DBVB_ENABLE_DEBUG -DBVB_REFIMPL_COMPILATION
-LOCAL_LDFLAGS := $(bvb_common_ldflags)
-LOCAL_C_INCLUDES :=
-LOCAL_SRC_FILES := \
-    refimpl/bvb_sysdeps_stub.c
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libbvb_refimpl_unittest
-LOCAL_MODULE_HOST_OS := linux
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_CLANG := true
-LOCAL_CFLAGS := $(bvb_common_cflags)
-LOCAL_CPPFLAGS := $(bvb_common_cppflags)
-LOCAL_LDFLAGS := $(bvb_common_ldflags)
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/refimpl external/gtest/include
-LOCAL_STATIC_LIBRARIES := \
-    libbvb_refimpl \
-    libbvb_refimpl_sysdeps \
-    libgmock_host \
-    libgtest_host
-LOCAL_SHARED_LIBRARIES := \
-    libchrome
-LOCAL_SRC_FILES := \
-    bvb_util_unittest.cc \
-    bvb_verify_unittest.cc \
-    bvbtool_unittest.cc
-LOCAL_LDLIBS_linux := -lrt
-include $(BUILD_HOST_NATIVE_TEST)
-
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := bvb_refimpl_symbols_test
-LOCAL_MODULE_TAGS := debug
-LOCAL_ADDITIONAL_DEPENDENCIES := libbvb_refimpl
-include $(BUILD_HOST_PREBUILT)
diff --git a/DEAD_REPO_MOVED_TO_external_bvb b/DEAD_REPO_MOVED_TO_external_bvb
new file mode 100644
index 0000000..1e2637a
--- /dev/null
+++ b/DEAD_REPO_MOVED_TO_external_bvb
@@ -0,0 +1 @@
+Code that used to be in this repository has been moved to external/bvb.
diff --git a/README b/README
deleted file mode 100644
index 37c5dac..0000000
--- a/README
+++ /dev/null
@@ -1,139 +0,0 @@
-This directory contains the specification for the Brillo Verified Boot
-boot image, a reference implementation for verified boot and A/B
-selection to be used in boot loaders, and a tool for generating and
-signing boot images.
-
--- FILES AND DIRECTORIES
-
- refimpl/
-
-   The reference implementation for boot image verification and A/B
-   selection is in the refimpl sub-directory.
-
-   Part of this code is considered internal to the reference
-   implementation and should not be used outside it. This includes the
-   bvb_rsa.[ch] and bvb_sha.[ch] files.
-
-   System dependencies expected to be provided by the platform is
-   defined in bvb_sysdeps.h. If the platform provides the standard C
-   runtime bvb_sysdeps_stub.c can be used.
-
- Android.mk
-
-   Build instructions for building the reference implementation and
-   associated unit tests.
-
- bvb_util_unittest.cc, bvb_verify_unittest.cc, bvb_unittest_util.h
-
-   Unit tests for the reference implementation.
-
- bvbtool_unittest.cc
-
-   Unit tests for bvbtool.
-
- bvbtool
-
-   A tool written in Python for working with Brillo boot images.
-
- test/
-
-   Contains test data used in unit tests.
-
--- AUDIENCE AND PORTABILITY NOTES
-
-This code is intended to be used in bootloaders in devices running
-Brillo. The suggested approach is to copy the appropriate header and C
-files mentioned in the previous section into the boot loader and
-integrate as appropriate.
-
-The reference implementation will evolve over time so integration
-should be as non-invasive as possible. The intention is to keep the
-API of the reference implementation stable however it will be broken
-if necessary.
-
-As for portability, the reference implementation is intended to be
-highly portable, work on both little- and big-endian architectures and
-32- and 64-bit. It's also intended to work in non-standard
-environments without the standard C library and runtime.
-
-If the BVB_ENABLE_DEBUG preprocessor symbol is set, the code will
-include useful debug information and run-time checks. Production
-builds should not use this.
-
-The preprocessor symbol BVB_REFIMPL_COMPILATION should be set when
-compiling the code. The code must be compiled into a separate library.
-
-Applications using the compiled library must only include the
-refimpl/bvb_refimpl.h file (which will include all public interfaces)
-and must not have the BVB_REFIMPL_COMPILATION preprocessor symbol
-set. This is to ensure that internal code that may be change in the
-future (for example refimpl/bvb_sha.[ch] and refimpl/bvb_rsa.[ch])
-will not be visible to application code.
-
--- COMPATIBILITY NOTES
-
-The Brillo Boot Image structure (as defined in refimpl/bvb_boot_image.h)
-guarantees forwards- and backwards-compatibility provided the major
-version does not change.
-
-When backwards-compatible changes are made - for example, when a new
-field is added to BvbBootImageHeader - the minor version will be
-bumped. At the same time, the reference implementation will also be
-modified to test for the appropriate minor version before attempting
-to access the newly added field. This ensures that version 1.N of the
-reference implementation is able to read an old boot image header
-produced with version 1.M where N > M.
-
-The usual scenario is that the code parsing the BvbBootImageHeader
-rarely changes (it's usually in the firmware of a device and this
-firmware is rarely updated if ever), let's say it's fixed at version
-1.N. At the same time, the version of the bvbtool used to produce the
-boot image is rolling forward and is at version 1.M where M > N. The
-problem with this scenario is that version 1.M may easily and
-inadvertently introduce a seemingly compatible change that isn't. For
-example, consider if a new verification algorithm is added - in this
-case version 1.N of the reference implementation will fail at
-verification time when validating the |algorithm_field| of a 1.M image
-if it's set to the new algorithm.
-
-The best approach for dealing with this problem is to always used a
-pinned version of bvbtool (say, use version 1.N to generate images
-targeted for devices running version 1.N) for generating and signing
-images but sometimes this is not always possible nor
-desirable. Therefore, to avoid this compatibility problem, bvbtool is
-designed to always take such input as a command-line argument so it
-can be kept constant by the caller. In other words, as long as you
-keep your command-line options passed to the bvb tool the same, images
-produced by newer versions of bvb will continue to work on the same
-version of the reference implementation.
-
--- BUILD SYSTEM INTEGRATION NOTES
-
-Brillo Verified Boot is enabled by the BOARD_BVB_ENABLE variable
-
- BOARD_BVB_ENABLE := true
-
-By default, the algorithm SHA256_RSA4096 is used with a test key from
-this directory. This can be overriden by the BOARD_BVB_ALGORITHM and
-BOARD_BVB_KEY_PATH variables to use e.g. RSA-4096:
-
- BOARD_BVB_ALGORITHM := SHA512_RSA4096
- BOARD_BVB_KEY_PATH := /path/to/rsa_key_4096bits.pem
-
-Remember that the public part of this key needs to be embedded in the
-bootloader of the device expected to process resulting images. Use
-'bvbtool extract_public_key' to do this.
-
-To prevent rollback attakcs, the rollback index should be increased on
-a regular basis. The rollback index can be set with the
-BOARD_BVB_ROLLBACK_INDEX variable:
-
- BOARD_BVB_ROLLBACK_INDEX := 5
-
-If this is not set, the rollback index defaults to 0.
-
-Additionally, the variables BOARD_BVB_MAKE_BOOT_IMAGE_ARGS,
-BOARD_BVB_SIGN_BOOT_IMAGE_ARGS, and BOARD_BVB_ADD_IMAGE_HASHES_ARGS
-can be used to specify additional options passed to respectively
-'bvbtool make_boot_image', 'bvbtool sign_boot_image', and 'bvbtool
-add_image_hashes'.
diff --git a/bvb_refimpl_symbols_test b/bvb_refimpl_symbols_test
deleted file mode 100755
index 6c29871..0000000
--- a/bvb_refimpl_symbols_test
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# This shell-script checks the symbols in libbvb_refimpl.a and fails
-# if a reference not starting with bvb_ is referenced. It's intended
-# to catch mistakes where the standard C library is inadvertently
-# used.
-
-set -e
-
-SYMBOLS_FILE=$(mktemp /tmp/libbvb_refimpl_symbols.XXXXXXXXXX)
-
-trap "rm -f '${SYMBOLS_FILE}'" EXIT
-
-readelf --symbols --wide "${ANDROID_HOST_OUT}/obj/STATIC_LIBRARIES/libbvb_refimpl_intermediates/libbvb_refimpl.a" | \
-  awk '$7 == "UND" && $8 != "" {print $8}' | \
-  grep -v ^bvb_ | \
-  sort -u > "${SYMBOLS_FILE}"
-
-# If this file is non-empty, it means that the library is using
-# symbols not starting with "bvb_".
-if [ -s "${SYMBOLS_FILE}" ] ; then
-  echo "ERROR: $0: Unexpected symbols in libbvb_refimpl:" >&2
-  cat "${SYMBOLS_FILE}" >&2
-  exit 1
-fi
diff --git a/bvb_unittest_util.h b/bvb_unittest_util.h
deleted file mode 100644
index 30951a9..0000000
--- a/bvb_unittest_util.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef BVB_UNITTEST_UTIL_H_
-#define BVB_UNITTEST_UTIL_H_
-
-#include <inttypes.h>
-
-#include <gtest/gtest.h>
-
-#include <base/files/file_util.h>
-#include <base/strings/string_util.h>
-#include <base/strings/stringprintf.h>
-
-/* Utility macro to run the command expressed by the printf()-style string
- * |command_format| using the system(3) utility function. Will assert unless
- * the command exits normally with exit status |expected_exit_status|.
- */
-#define EXPECT_COMMAND(expected_exit_status, command_format, ...) do { \
-  int rc = system(base::StringPrintf(command_format, ## __VA_ARGS__).c_str()); \
-  EXPECT_TRUE(WIFEXITED(rc)); \
-  EXPECT_EQ(WEXITSTATUS(rc), expected_exit_status); \
-} while (0);
-
-/* Base-class used for unit test. */
-class BaseBvbToolTest : public ::testing::Test {
-public:
-  BaseBvbToolTest() {}
-
-protected:
-  virtual ~BaseBvbToolTest() {}
-
-  /* Generates a Brillo Boot Image, using bvbtoool. The generated boot
-   * image will written to disk, see the |boot_image_path| variable
-   * for its path and |boot_image_| for the content.
-   */
-  void GenerateBootImage(const std::string& algorithm,
-                         const std::string& kernel_cmdline,
-                         uint64_t rollback_index,
-                         const base::FilePath& key_path,
-                         const std::string& additional_options = "") {
-    boot_image_path_ = testdir_.Append("boot_brillo.img");
-    EXPECT_COMMAND(0,
-                   "./bvbtool make_boot_image"
-                   " --kernel %s"
-                   " --initrd %s"
-                   " --kernel_cmdline \"%s\""
-                   " --rollback_index %" PRIu64
-                   " %s "
-                   " --output %s",
-                   base::FilePath("test/dummy_kernel.bin").value().c_str(),
-                   base::FilePath("test/dummy_initrd.bin").value().c_str(),
-                   kernel_cmdline.c_str(),
-                   rollback_index,
-                   additional_options.c_str(),
-                   boot_image_path_.value().c_str());
-    if (algorithm != "") {
-      EXPECT_COMMAND(0,
-                     "./bvbtool sign_boot_image --key %s"
-                     " --image %s --algorithm %s",
-                     key_path.value().c_str(),
-                     boot_image_path_.value().c_str(),
-                     algorithm.c_str());
-    }
-    int64_t file_size;
-    ASSERT_TRUE(base::GetFileSize(boot_image_path_, &file_size));
-    boot_image_.resize(file_size);
-    ASSERT_TRUE(base::ReadFile(boot_image_path_,
-                               reinterpret_cast<char*>(boot_image_.data()),
-                               boot_image_.size()));
-  }
-
-  /* Create temporary directory to stash images in. */
-  virtual void SetUp() override {
-    base::FilePath ret;
-    char* buf = strdup("/tmp/bvb-refimpl-tests.XXXXXX");
-    ASSERT_TRUE(mkdtemp(buf) != nullptr);
-    testdir_ = base::FilePath(buf);
-    free(buf);
-  }
-
-  /* Nuke temporary directory. */
-  virtual void TearDown() override {
-    ASSERT_EQ(0U, testdir_.value().find("/tmp/bvb-refimpl-tests"));
-    ASSERT_TRUE(base::DeleteFile(testdir_, true /* recursive */));
-  }
-
-  /* Temporary directory created in SetUp(). */
-  base::FilePath testdir_;
-
-  /* Path to boot image generated with GenerateBootImage(). */
-  base::FilePath boot_image_path_;
-
-  /* Contents of the image generated with GenerateBootImage(). */
-  std::vector<uint8_t> boot_image_;
-};
-
-#endif  /* BVB_UNITTEST_UTIL_H_ */
diff --git a/bvb_util_unittest.cc b/bvb_util_unittest.cc
deleted file mode 100644
index 4ef9955..0000000
--- a/bvb_util_unittest.cc
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <string.h>
-
-#include <gtest/gtest.h>
-
-#include "bvb_refimpl.h"
-
-TEST(UtilTest, BootImageHeaderByteswap)
-{
-  BvbBootImageHeader h;
-  BvbBootImageHeader s;
-  uint32_t n32;
-  uint64_t n64;
-
-  n32 = 0x11223344;
-  n64 = 0x1122334455667788;
-
-  h.header_version_major = htobe32(n32); n32++;
-  h.header_version_minor = htobe32(n32); n32++;
-  h.authentication_data_block_size = htobe64(n64); n64++;
-  h.auxilary_data_block_size = htobe64(n64); n64++;
-  h.payload_data_block_size = htobe64(n64); n64++;
-  h.algorithm_type = htobe32(n32); n32++;
-  h.hash_offset = htobe64(n64); n64++;
-  h.hash_size = htobe64(n64); n64++;
-  h.signature_offset = htobe64(n64); n64++;
-  h.signature_size = htobe64(n64); n64++;
-  h.public_key_offset = htobe64(n64); n64++;
-  h.public_key_size = htobe64(n64); n64++;
-  h.properties_offset = htobe64(n64); n64++;
-  h.properties_size = htobe64(n64); n64++;
-  h.rollback_index = htobe64(n64); n64++;
-  h.kernel_offset = htobe64(n64); n64++;
-  h.kernel_size = htobe64(n64); n64++;
-  h.initrd_offset = htobe64(n64); n64++;
-  h.initrd_size = htobe64(n64); n64++;
-  h.kernel_addr = htobe64(n64); n64++;
-  h.initrd_addr = htobe64(n64); n64++;
-
-  bvb_boot_image_header_to_host_byte_order(&h, &s);
-
-  n32 = 0x11223344;
-  n64 = 0x1122334455667788;
-
-  EXPECT_EQ(n32, s.header_version_major); n32++;
-  EXPECT_EQ(n32, s.header_version_minor); n32++;
-  EXPECT_EQ(n64, s.authentication_data_block_size); n64++;
-  EXPECT_EQ(n64, s.auxilary_data_block_size); n64++;
-  EXPECT_EQ(n64, s.payload_data_block_size); n64++;
-  EXPECT_EQ(n32, s.algorithm_type); n32++;
-  EXPECT_EQ(n64, s.hash_offset); n64++;
-  EXPECT_EQ(n64, s.hash_size); n64++;
-  EXPECT_EQ(n64, s.signature_offset); n64++;
-  EXPECT_EQ(n64, s.signature_size); n64++;
-  EXPECT_EQ(n64, s.public_key_offset); n64++;
-  EXPECT_EQ(n64, s.public_key_size); n64++;
-  EXPECT_EQ(n64, s.properties_offset); n64++;
-  EXPECT_EQ(n64, s.properties_size); n64++;
-  EXPECT_EQ(n64, s.rollback_index); n64++;
-  EXPECT_EQ(n64, s.kernel_offset); n64++;
-  EXPECT_EQ(n64, s.kernel_size); n64++;
-  EXPECT_EQ(n64, s.initrd_offset); n64++;
-  EXPECT_EQ(n64, s.initrd_size); n64++;
-  EXPECT_EQ(n64, s.kernel_addr); n64++;
-  EXPECT_EQ(n64, s.initrd_addr); n64++;
-
-  // If new fields are added, the following will fail. This is to
-  // remind that byteswapping code (in bvb_util.c) and unittests for
-  // this should be updated.
-  static_assert(offsetof(BvbBootImageHeader, reserved) == 4256,
-                "Remember to unittest byteswapping of newly added fields");
-}
-
-TEST(UtilTest, RSAPublicKeyHeaderByteswap)
-{
-  BvbRSAPublicKeyHeader h;
-  BvbRSAPublicKeyHeader s;
-  uint32_t n32;
-  uint64_t n64;
-
-  n32 = 0x11223344;
-  n64 = 0x1122334455667788;
-
-  h.key_num_bits = htobe32(n32); n32++;
-  h.n0inv = htobe32(n32); n32++;
-
-  bvb_rsa_public_key_header_to_host_byte_order(&h, &s);
-
-  n32 = 0x11223344;
-  n64 = 0x1122334455667788;
-
-  EXPECT_EQ(n32, s.key_num_bits); n32++;
-  EXPECT_EQ(n32, s.n0inv); n32++;
-}
-
-TEST(UtilTest, SafeAddition) {
-  uint64_t value;
-  uint64_t pow2_60 = 1ULL << 60;
-
-  value = 2;
-  EXPECT_NE(0, bvb_safe_add_to(&value, 5));
-  EXPECT_EQ(7UL, value);
-
-  /* These should not overflow */
-  value = 1*pow2_60;
-  EXPECT_NE(0, bvb_safe_add_to(&value, 2*pow2_60));
-  EXPECT_EQ(3*pow2_60, value);
-  value = 7*pow2_60;
-  EXPECT_NE(0, bvb_safe_add_to(&value, 8*pow2_60));
-  EXPECT_EQ(15*pow2_60, value);
-  value = 9*pow2_60;
-  EXPECT_NE(0, bvb_safe_add_to(&value, 3*pow2_60));
-  EXPECT_EQ(12*pow2_60, value);
-  value = 0xfffffffffffffffcUL;
-  EXPECT_NE(0, bvb_safe_add_to(&value, 2));
-  EXPECT_EQ(0xfffffffffffffffeUL, value);
-
-  /* These should overflow. */
-  value = 8*pow2_60;
-  EXPECT_EQ(0, bvb_safe_add_to(&value, 8*pow2_60));
-  value = 0xfffffffffffffffcUL;
-  EXPECT_EQ(0, bvb_safe_add_to(&value, 4));
-}
diff --git a/bvb_verify_unittest.cc b/bvb_verify_unittest.cc
deleted file mode 100644
index fb71777..0000000
--- a/bvb_verify_unittest.cc
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <iostream>
-
-#include <endian.h>
-#include <inttypes.h>
-#include <string.h>
-
-#include <base/files/file_util.h>
-#include <base/strings/string_util.h>
-#include <base/strings/stringprintf.h>
-
-#include "bvb_unittest_util.h"
-#include "bvb_refimpl.h"
-
-class VerifyTest : public BaseBvbToolTest {
-public:
-  VerifyTest() {}
-
-protected:
-
-  // Helper function for ModificationDetection test. Modifies
-  // boot_image_ in a number of places in the sub-array at |offset| of
-  // size |length| and checks that bvb_verify_boot_image() returns
-  // |expected_result|.
-  bool test_modification(BvbVerifyResult expected_result,
-                         size_t offset, size_t length);
-
-};
-
-TEST_F(VerifyTest, BootImageStructSize) {
-  EXPECT_EQ(8192UL, sizeof(BvbBootImageHeader));
-}
-
-TEST_F(VerifyTest, CheckSHA256RSA2048) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, CheckSHA256RSA4096) {
-  GenerateBootImage("SHA256_RSA4096", "", 0
-                    , base::FilePath("test/testkey_rsa4096.pem"));
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, CheckSHA256RSA8192) {
-  GenerateBootImage("SHA256_RSA8192", "", 0,
-                    base::FilePath("test/testkey_rsa8192.pem"));
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, CheckSHA512RSA2048) {
-  GenerateBootImage("SHA512_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, CheckSHA512RSA4096) {
-  GenerateBootImage("SHA512_RSA4096", "", 0,
-                    base::FilePath("test/testkey_rsa4096.pem"));
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, CheckSHA512RSA8192) {
-  GenerateBootImage("SHA512_RSA8192", "", 0,
-                    base::FilePath("test/testkey_rsa8192.pem"));
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, CheckBiggerLength) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-  // Check that it's OK if we pass a bigger length than what the
-  // header indicates.
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(),
-                                  boot_image_.size() + 8192,
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, CheckUnsigned) {
-  GenerateBootImage("", "", 0, base::FilePath(""));
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK_NOT_SIGNED,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, BadMagic) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-  boot_image_[0] = 'A';
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-
-TEST_F(VerifyTest, MajorVersionCheck) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader *h =
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data());
-  h->header_version_major = htobe32(1 + be32toh(h->header_version_major));
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-
-TEST_F(VerifyTest, MinorVersionCheck) {
-  GenerateBootImage("", "", 0, base::FilePath(""));
-
-  BvbBootImageHeader *h =
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data());
-  h->header_version_minor = htobe32(1 + be32toh(h->header_version_minor));
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK_NOT_SIGNED,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, BlockSizesAddUpToLessThanLength) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader *h =
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data());
-  BvbBootImageHeader backup = *h;
-
-  // Check that the sum of the three block lengths is less than passed
-  // in size. Use a size that's a multiple of 64 to avoid failure on
-  // earlier check.
-  uint64_t size = boot_image_.size() & (~0x3f);
-
-  h->authentication_data_block_size = htobe64(size);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-  *h = backup;
-
-  h->auxilary_data_block_size = htobe64(size);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-  *h = backup;
-
-  h->payload_data_block_size = htobe64(size);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-  *h = backup;
-
-  // Overflow checks - choose overflow candidate so it's a multiple of
-  // 64 otherwise we'll fail on an earlier check.
-  size = 0xffffffffffffffc0UL;
-
-  h->authentication_data_block_size = htobe64(size);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-  *h = backup;
-
-  h->auxilary_data_block_size = htobe64(size);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-  *h = backup;
-
-  h->payload_data_block_size = htobe64(size);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-  *h = backup;
-
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, BlockSizesMultipleOf64) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader *h =
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data());
-  BvbBootImageHeader backup = *h;
-
-  h->authentication_data_block_size =
-      htobe32(be32toh(h->authentication_data_block_size) - 32);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size() - 32,
-                                  NULL, NULL));
-  *h = backup;
-
-  h->auxilary_data_block_size =
-      htobe32(be32toh(h->auxilary_data_block_size) - 32);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size() - 32,
-                                  NULL, NULL));
-  *h = backup;
-
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, HashOutOfBounds) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader *h =
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data());
-
-  // Check we catch when hash data goes out of bounds.
-  h->hash_offset = htobe64(4);
-  h->hash_size = htobe64(be64toh(h->authentication_data_block_size));
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-
-  // Overflow checks.
-  h->hash_offset = htobe64(4);
-  h->hash_size = htobe64(0xfffffffffffffffeUL);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, SignatureOutOfBounds) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader *h =
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data());
-
-  // Check we catch when signature data goes out of bounds.
-  h->signature_offset = htobe64(4);
-  h->signature_size = htobe64(be64toh(h->authentication_data_block_size));
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-
-  // Overflow checks.
-  h->signature_offset = htobe64(4);
-  h->signature_size = htobe64(0xfffffffffffffffeUL);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, PublicKeyOutOfBounds) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader *h =
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data());
-
-  // Check we catch when public key data goes out of bounds.
-  h->public_key_offset = htobe64(4);
-  h->public_key_size = htobe64(be64toh(h->auxilary_data_block_size));
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-
-  // Overflow checks.
-  h->public_key_offset = htobe64(4);
-  h->public_key_size = htobe64(0xfffffffffffffffeUL);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, KernelOutOfBounds) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader *h =
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data());
-
-  // Check we catch when kernel data goes out of bounds.
-  h->kernel_offset = htobe64(4);
-  h->kernel_size = htobe64(be64toh(h->payload_data_block_size));
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-
-  // Overflow checks.
-  h->kernel_offset = htobe64(4);
-  h->kernel_size = htobe64(0xfffffffffffffffeUL);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, InitrdOutOfBounds) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader *h =
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data());
-
-  // Check we catch when initrd data goes out of bounds.
-  h->initrd_offset = htobe64(4);
-  h->initrd_size = htobe64(be64toh(h->payload_data_block_size));
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-
-  // Overflow checks.
-  h->initrd_offset = htobe64(4);
-  h->initrd_size = htobe64(0xfffffffffffffffeUL);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, InvalidAlgorithmField) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader *h =
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data());
-  BvbBootImageHeader backup = *h;
-
-  // Check we bail on unknown algorithm.
-  h->algorithm_type = htobe32(_BVB_ALGORITHM_NUM_TYPES);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-  *h = backup;
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-TEST_F(VerifyTest, PublicKeyBlockTooSmall) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader *h =
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data());
-  BvbBootImageHeader backup = *h;
-
-  // Check we bail if the auxilary data block is too small.
-  uint64_t change = be64toh(h->auxilary_data_block_size) - 64;
-  h->auxilary_data_block_size = htobe64(change);
-  EXPECT_EQ(BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-            bvb_verify_boot_image(boot_image_.data(),
-                                  boot_image_.size() - change,
-                                  NULL, NULL));
-  *h = backup;
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-}
-
-bool VerifyTest::test_modification(BvbVerifyResult expected_result,
-                                    size_t offset, size_t length) {
-  uint8_t *d = reinterpret_cast<uint8_t*>(boot_image_.data());
-  const int kNumCheckpoints = 16;
-
-  // Test |kNumCheckpoints| modifications in the start, middle, and
-  // end of given sub-array.
-  for (int n = 0; n <= kNumCheckpoints; n++) {
-    size_t o = std::min(length*n/kNumCheckpoints, length - 1) + offset;
-    d[o] ^= 0x80;
-    BvbVerifyResult result = bvb_verify_boot_image(boot_image_.data(),
-                                                   boot_image_.size(),
-                                                   NULL, NULL);
-    d[o] ^= 0x80;
-    if (result != expected_result)
-      return false;
-  }
-
-  return true;
-}
-
-TEST_F(VerifyTest, ModificationDetection) {
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  NULL, NULL));
-
-  BvbBootImageHeader h;
-  bvb_boot_image_header_to_host_byte_order(
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data()), &h);
-
-  size_t header_block_offset = 0;
-  size_t authentication_block_offset = header_block_offset + sizeof(BvbBootImageHeader);
-  size_t auxilary_block_offset = authentication_block_offset + h.authentication_data_block_size;
-  size_t payload_block_offset = auxilary_block_offset + h.auxilary_data_block_size;
-
-  // Ensure we detect modification of the header data block. Do this
-  // in a field that's not validated so INVALID_BOOT_IMAGE_HEADER
-  // isn't returned.
-  EXPECT_TRUE(test_modification(BVB_VERIFY_RESULT_HASH_MISMATCH,
-                                offsetof(BvbBootImageHeader, kernel_cmdline),
-                                BVB_KERNEL_CMDLINE_MAX_LEN));
-  // Also check the |reserved| field.
-  EXPECT_TRUE(test_modification(BVB_VERIFY_RESULT_HASH_MISMATCH,
-                                offsetof(BvbBootImageHeader, reserved),
-                                sizeof(BvbBootImageHeader().reserved)));
-
-  // Ensure we detect modifications in the auxilary data block.
-  EXPECT_TRUE(test_modification(BVB_VERIFY_RESULT_HASH_MISMATCH,
-                                auxilary_block_offset,
-                                h.auxilary_data_block_size));
-
-  // Ensure we detect modifications in the payload key data block.
-  EXPECT_TRUE(test_modification(BVB_VERIFY_RESULT_HASH_MISMATCH,
-                                payload_block_offset,
-                                h.payload_data_block_size));
-
-  // Modifications in the hash part of the Authentication data block
-  // should also yield HASH_MISMATCH. This is because the hash check
-  // compares the calculated hash against the stored hash.
-  EXPECT_TRUE(test_modification(BVB_VERIFY_RESULT_HASH_MISMATCH,
-                                authentication_block_offset + h.hash_offset,
-                                h.hash_size));
-
-  // Modifications in the signature part of the Authentication data
-  // block, should not cause a hash mismatch ... but will cause a
-  // signature mismatch.
-  EXPECT_TRUE(test_modification(BVB_VERIFY_RESULT_SIGNATURE_MISMATCH,
-                                authentication_block_offset +
-                                  h.signature_offset,
-                                h.signature_size));
-
-  // Mofications outside the hash and signature parts of the
-  // Authentication data block are not detected. This is because it's
-  // not part of the hash calculation.
-  uint64_t offset = h.signature_offset + h.signature_size;
-  ASSERT_LT(h.hash_offset, h.signature_offset);
-  ASSERT_LT(offset + 1, h.authentication_data_block_size);
-  EXPECT_TRUE(test_modification(BVB_VERIFY_RESULT_OK,
-                                authentication_block_offset + offset,
-                                h.authentication_data_block_size - offset));
-}
diff --git a/bvbtool b/bvbtool
deleted file mode 100755
index d91069d..0000000
--- a/bvbtool
+++ /dev/null
@@ -1,1083 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2016, The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Command-line tool for working with Brillo Verified Boot images."""
-
-import argparse
-import hashlib
-import os
-import struct
-import subprocess
-import sys
-
-import Crypto.PublicKey.RSA
-
-# Keep in sync with bvb_boot_image_header.h.
-BVB_VERSION_MAJOR = 1
-BVB_VERSION_MINOR = 0
-
-
-class Algorithm(object):
-  """Contains details about an algorithm.
-
-  See the bvb_boot_image_header.h file for more details about
-  algorithms.
-
-  The constant |ALGORITHMS| is a dictionary from human-readable
-  names (e.g 'SHA256_RSA2048') to instances of this class.
-
-  Attributes:
-    algorithm_type: Integer code corresponding to |BvbAlgorithmType|.
-    hash_num_bytes: Number of bytes used to store the hash.
-    signature_num_bytes: Number of bytes used to store the signature.
-    public_key_num_bytes: Number of bytes used to store the public key.
-    padding: Padding used for signature, if any.
-  """
-
-  def __init__(self, algorithm_type, hash_num_bytes, signature_num_bytes,
-               public_key_num_bytes, padding):
-    self.algorithm_type = algorithm_type
-    self.hash_num_bytes = hash_num_bytes
-    self.signature_num_bytes = signature_num_bytes
-    self.public_key_num_bytes = public_key_num_bytes
-    self.padding = padding
-
-# This must be kept in sync with bvb_verify.h.
-ALGORITHMS = {
-    'NONE': Algorithm(
-        algorithm_type=0,        # BVB_ALGORITHM_TYPE_NONE
-        hash_num_bytes=0,
-        signature_num_bytes=0,
-        public_key_num_bytes=0,
-        padding=[]),
-    'SHA256_RSA2048': Algorithm(
-        algorithm_type=1,        # BVB_ALGORITHM_TYPE_SHA256_RSA2048
-        hash_num_bytes=32,
-        signature_num_bytes=256,
-        public_key_num_bytes=8 + 2*2048/8,
-        padding=[
-            # PKCS1-v1_5 padding
-            0x00, 0x01] + [0xff]*202 + [0x00] + [
-                # ASN.1 header
-                0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
-                0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
-                0x00, 0x04, 0x20,
-            ]),
-    'SHA256_RSA4096': Algorithm(
-        algorithm_type=2,        # BVB_ALGORITHM_TYPE_SHA256_RSA4096
-        hash_num_bytes=32,
-        signature_num_bytes=512,
-        public_key_num_bytes=8 + 2*4096/8,
-        padding=[
-            # PKCS1-v1_5 padding
-            0x00, 0x01] + [0xff]*458 + [0x00] + [
-                # ASN.1 header
-                0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
-                0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
-                0x00, 0x04, 0x20,
-            ]),
-    'SHA256_RSA8192': Algorithm(
-        algorithm_type=3,        # BVB_ALGORITHM_TYPE_SHA256_RSA8192
-        hash_num_bytes=32,
-        signature_num_bytes=1024,
-        public_key_num_bytes=8 + 2*8192/8,
-        padding=[
-            # PKCS1-v1_5 padding
-            0x00, 0x01] + [0xff]*970 + [0x00] + [
-                # ASN.1 header
-                0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
-                0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
-                0x00, 0x04, 0x20,
-            ]),
-    'SHA512_RSA2048': Algorithm(
-        algorithm_type=4,        # BVB_ALGORITHM_TYPE_SHA512_RSA2048
-        hash_num_bytes=64,
-        signature_num_bytes=256,
-        public_key_num_bytes=8 + 2*2048/8,
-        padding=[
-            # PKCS1-v1_5 padding
-            0x00, 0x01] + [0xff]*170 + [0x00] + [
-                # ASN.1 header
-                0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
-                0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05,
-                0x00, 0x04, 0x40
-            ]),
-    'SHA512_RSA4096': Algorithm(
-        algorithm_type=5,        # BVB_ALGORITHM_TYPE_SHA512_RSA4096
-        hash_num_bytes=64,
-        signature_num_bytes=512,
-        public_key_num_bytes=8 + 2*4096/8,
-        padding=[
-            # PKCS1-v1_5 padding
-            0x00, 0x01] + [0xff]*426 + [0x00] + [
-                # ASN.1 header
-                0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
-                0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05,
-                0x00, 0x04, 0x40
-            ]),
-    'SHA512_RSA8192': Algorithm(
-        algorithm_type=6,        # BVB_ALGORITHM_TYPE_SHA512_RSA8192
-        hash_num_bytes=64,
-        signature_num_bytes=1024,
-        public_key_num_bytes=8 + 2*8192/8,
-        padding=[
-            # PKCS1-v1_5 padding
-            0x00, 0x01] + [0xff]*938 + [0x00] + [
-                # ASN.1 header
-                0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
-                0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05,
-                0x00, 0x04, 0x40
-            ]),
-}
-
-
-def round_to_multiple(number, size):
-  """Rounds a number up to nearest multiple of another number.
-
-  Args:
-    number: The number to round up.
-    size: The multiple to round up to.
-
-  Returns:
-    If |number| is a multiple of |size|, returns |number|, otherwise
-    returns |number| + |size|.
-  """
-  remainder = number % size
-  if remainder == 0:
-    return number
-  return number + size - remainder
-
-
-def round_to_pow2(number):
-  """Rounds a number up to the next power of 2.
-
-  Args:
-    number: The number to round up.
-
-  Returns:
-    If |number| is already a power of 2 then |number| is
-    returned. Otherwise the smallest power of 2 greater than |number|
-    is returned.
-  """
-  return 2**((number - 1).bit_length())
-
-
-def write_long(output, num_bits, value):
-  """Writes a long to an output stream using a given amount of bits.
-
-  This number is written big-endian, e.g. with the most significant
-  bit first.
-
-  Arguments:
-    output: The object to write the output to.
-    num_bits: The number of bits to write, e.g. 2048.
-    value: The value to write.
-  """
-  for bit_pos in range(num_bits, 0, -8):
-    octet = (value >> (bit_pos - 8)) & 0xff
-    output.write(struct.pack('!B', octet))
-
-
-def egcd(a, b):
-  """Calculate greatest common divisor of two numbers.
-
-  This implementation uses a recursive version of the extended
-  Euclidian algorithm.
-
-  Arguments:
-    a: First number.
-    b: Second number.
-
-  Returns:
-    A tuple (gcd, x, y) that where |gcd| is the greatest common
-    divisor of |a| and |b| and |a|*|x| + |b|*|y| = |gcd|.
-  """
-  if a == 0:
-    return (b, 0, 1)
-  else:
-    g, y, x = egcd(b % a, a)
-    return (g, x - (b // a) * y, y)
-
-
-def modinv(a, m):
-  """Calculate modular multiplicative inverse of |a| modulo |m|.
-
-  This calculates the number |x| such that |a| * |x| == 1 (modulo
-  |m|). This number only exists if |a| and |m| are co-prime - |None|
-  is returned if this isn't true.
-
-  Arguments:
-    a: The number to calculate a modular inverse of.
-    m: The modulo to use.
-
-  Returns:
-    The modular multiplicative inverse of |a| and |m| or |None| if
-    these numbers are not co-prime.
-  """
-  gcd, x, _ = egcd(a, m)
-  if gcd != 1:
-    return None  # modular inverse does not exist
-  else:
-    return x % m
-
-
-def parse_number(string):
-  """Parse a string as a number.
-
-  This is just a short-hand for int(string, 0) suitable for use in the
-  |type| parameter of |ArgumentParser|'s add_argument() function. An
-  improvement to just using type=int is that this function supports
-  numbers in other bases, e.g. "0x1234".
-
-  Arguments:
-    string: The string to parse.
-
-  Returns:
-    The parsed integer.
-
-  Raises:
-    ValueError: If the number could not be parsed.
-  """
-  return int(string, 0)
-
-
-def write_rsa_key(output, key):
-  """Writes a public RSA key in |BvBRSAPublicKeyHeader| format.
-
-  This writes the |BvBRSAPublicKeyHeader| as well as the two large
-  numbers (|key_num_bits| bits long) following it.
-
-  Arguments:
-    output: The object to write the output to.
-    key: A Crypto.PublicKey.RSA object.
-  """
-  # key.e is exponent
-  # key.n is modulus
-  key_num_bits = key.size() + 1
-  # Calculate n0inv = -1/n[0] (mod 2^32)
-  b = 2L**32
-  n0inv = b - modinv(key.n, b)
-  # Calculate rr = r^2 (mod N), where r = 2^(# of key bits)
-  r = 2L**key.n.bit_length()
-  rrmodn = r * r % key.n
-  output.write(struct.pack('!II', key_num_bits, n0inv))
-  write_long(output, key_num_bits, key.n)
-  write_long(output, key_num_bits, rrmodn)
-
-
-def lookup_algorithm_by_type(alg_type):
-  """Looks up algorithm by type.
-
-  Arguments:
-    alg_type: The integer representing the type.
-
-  Returns:
-    A tuple with the algorithm name and an |Algorithm| instance.
-
-  Raises:
-    Exception: If the algorithm cannot be found
-  """
-  for alg_name in ALGORITHMS:
-    alg_data = ALGORITHMS[alg_name]
-    if alg_data.algorithm_type == alg_type:
-      return (alg_name, alg_data)
-  raise Exception('Unknown algorithm type %d' % alg_type)
-
-
-def add_property(encoded_props, key, value):
-  """Helper function to add a key/value pair to a bytearray.
-
-  The encoding specified in the |BvbPropertyHeader| in
-  bvb_boot_image_header.h is used.
-
-  Arguments:
-    encoded_props: A bytearray to append to.
-    key: The key to write.
-    value: The value to write.
-  """
-  encoded_props.extend(struct.pack('!QQ', len(key), len(value)))
-  encoded_props.extend(key)
-  encoded_props.append(0)
-  encoded_props.extend(value)
-  encoded_props.append(0)
-  num_bytes = 2 * 8 + len(key) + len(value) + 2
-  padding_bytes = (8 - num_bytes) & 7
-  for _ in range(padding_bytes):
-    encoded_props.append(0)
-
-
-class BvbIntegrityFooter(object):
-  """A class for parsing and writing Integrity Footers.
-
-  Integrity footers are stored at the end of filesystems where
-  dm-verity hashes have been added with the 'add_image_hashes'
-  command.
-
-  Attributes:
-    magic: Magic for identifying the footer, see |MAGIC|.
-    version_major: The major version of bvbtool that wrote the footer.
-    version_minor: The minor version of bvbtool that wrote the footer.
-    dm_verity_version: dm-verity version used.
-    image_size: Size of the image, after rounding up to |block_size|.
-    tree_offset: Offset of the hash tree in the file.
-    tree_size: Size of the tree.
-    data_block_size: Data block size
-    hash_block_size: Hash block size
-    hash_algorithm: Hash algorithm used.
-    salt_hex: Salt used, as a hex-string
-    root_hash_hex: Root hash, as a hex-string.
-  """
-
-  MAGIC = 'BVBi'
-  SIZE = 4096
-  RESERVED = 1968
-  FORMAT_STRING = ('!4s2L'  # magic, 2 x version
-                   'L'  # dm-verity version used
-                   'Q'  # image size (bytes)
-                   'Q'  # tree offset (bytes)
-                   'Q'  # tree size (bytes)
-                   'L'  # data block size (bytes)
-                   'L'  # hash block size (bytes)
-                   '32s'  # hash algorithm used
-                   '1024s'  # salt, as a hex string
-                   '1024s' +  # root hash, as a hex string
-                   str(RESERVED) + 'x')  # padding for reserved bytes
-
-  def __init__(self, data=None):
-    """Initializes a new footer object.
-
-    Arguments:
-      data: If not None, must be a bytearray of size 4096.
-
-    Raises:
-      LookupError: If the given footer is malformed.
-      struct.error: If the given data has no footer.
-    """
-    assert struct.calcsize(self.FORMAT_STRING) == self.SIZE
-
-    if data:
-      (self.magic, self.version_major, self.version_minor,
-       self.dm_verity_version, self.image_size, self.tree_offset,
-       self.tree_size, self.data_block_size, self.hash_block_size,
-       self.hash_algorithm, self.salt_hex,
-       self.root_hash_hex) = struct.unpack(self.FORMAT_STRING, data)
-      if self.magic != self.MAGIC:
-        raise LookupError('Given data does not look like a Brillo '
-                          'integrity footer.')
-      # Nuke NUL-bytes at the end.
-      self.hash_algorithm = self.hash_algorithm.split('\0', 1)[0]
-      self.salt_hex = self.salt_hex.split('\0', 1)[0]
-      self.root_hash_hex = self.root_hash_hex.split('\0', 1)[0]
-    else:
-      self.magic = self.MAGIC
-      self.version_major = BVB_VERSION_MAJOR
-      self.version_minor = BVB_VERSION_MINOR
-      self.dm_verity_version = 0
-      self.image_size = 0
-      self.tree_offset = 0
-      self.tree_size = 0
-      self.data_block_size = 0
-      self.hash_block_size = 0
-      self.hash_algorithm = ''
-      self.salt_hex = ''
-      self.root_hash_hex = ''
-
-  def save(self, output):
-    """Serializes the header (4096 bytes) to disk.
-
-    Arguments:
-      output: The object to write the output to.
-    """
-    output.write(struct.pack(
-        self.FORMAT_STRING, self.magic, self.version_major, self.version_minor,
-        self.dm_verity_version, self.image_size, self.tree_offset,
-        self.tree_size, self.data_block_size, self.hash_block_size,
-        self.hash_algorithm, self.salt_hex, self.root_hash_hex))
-
-
-class BvbHeader(object):
-  """A class for parsing and writing Brillo Verified Boot headers.
-
-  Attributes:
-    The attributes correspond to the |BvBBootImageHeader| struct
-    defined in bvb_boot_image_header.h.
-  """
-
-  SIZE = 8192
-
-  # Keep in sync with |reserved| field of |BvbBootImageHeader|.
-  RESERVED = 3936
-
-  # Keep in sync with |BvbBootImageHeader|.
-  FORMAT_STRING = ('!4s2L'  # magic, 2 x version
-                   '3Q'  # 3 x block size
-                   'L'  # algorithm type
-                   '2Q'  # offset, size (hash)
-                   '2Q'  # offset, size (signature)
-                   '2Q'  # offset, size (public key)
-                   '2Q'  # offset, size (properties)
-                   'Q'  # rollback_index
-                   '2Q'  # offset, size (kernel)
-                   '2Q'  # offset, size (initrd)
-                   'Q'  # kernel load address
-                   'Q'  # initrd load address
-                   '4096s' +  # cmdline
-                   str(RESERVED) + 'x')  # padding for reserved bytes
-
-  def __init__(self, data=None):
-    """Initializes a new header object.
-
-    Arguments:
-      data: If not None, must be a bytearray of size 8192.
-
-    Raises:
-      Exception: If the given data is malformed.
-    """
-    assert struct.calcsize(self.FORMAT_STRING) == self.SIZE
-
-    if data:
-      (self.magic, self.header_version_major, self.header_version_minor,
-       self.authentication_data_block_size, self.auxilary_data_block_size,
-       self.payload_data_block_size, self.algorithm_type, self.hash_offset,
-       self.hash_size, self.signature_offset, self.signature_size,
-       self.public_key_offset, self.public_key_size, self.properties_offset,
-       self.properties_size, self.rollback_index, self.kernel_offset,
-       self.kernel_size, self.initrd_offset, self.initrd_size,
-       self.kernel_address, self.initrd_address,
-       self.kernel_cmdline) = struct.unpack(self.FORMAT_STRING, data)
-      # Nuke NUL-bytes at the end of the string.
-      self.kernel_cmdline = self.kernel_cmdline.split('\0', 1)[0]
-      if self.magic != 'BVB0':
-        raise Exception('Given image does not look like a Brillo boot image')
-    else:
-      self.magic = 'BVB0'
-      self.header_version_major = BVB_VERSION_MAJOR
-      self.header_version_minor = BVB_VERSION_MINOR
-      self.authentication_data_block_size = 0
-      self.auxilary_data_block_size = 0
-      self.payload_data_block_size = 0
-      self.algorithm_type = 0
-      self.hash_offset = 0
-      self.hash_size = 0
-      self.signature_offset = 0
-      self.signature_size = 0
-      self.public_key_offset = 0
-      self.public_key_size = 0
-      self.properties_offset = 0
-      self.properties_size = 0
-      self.rollback_index = 0
-      self.kernel_offset = 0
-      self.kernel_size = 0
-      self.initrd_offset = 0
-      self.initrd_size = 0
-      self.kernel_address = 0
-      self.initrd_address = 0
-      self.kernel_cmdline = ''
-
-  def save(self, output):
-    """Serializes the header (8192 bytes) to disk.
-
-    Arguments:
-      output: The object to write the output to.
-    """
-    output.write(struct.pack(
-        self.FORMAT_STRING, self.magic, self.header_version_major,
-        self.header_version_minor, self.authentication_data_block_size,
-        self.auxilary_data_block_size, self.payload_data_block_size,
-        self.algorithm_type, self.hash_offset, self.hash_size,
-        self.signature_offset, self.signature_size, self.public_key_offset,
-        self.public_key_size, self.properties_offset, self.properties_size,
-        self.rollback_index, self.kernel_offset, self.kernel_size,
-        self.initrd_offset, self.initrd_size, self.kernel_address,
-        self.initrd_address, self.kernel_cmdline))
-
-
-class BvbTool(object):
-  """Object for bvbtool."""
-
-  def __init__(self):
-    """Initiailzes the object."""
-    parser = argparse.ArgumentParser(usage="""bvbtool COMMAND [<args>]
-
-Commands:
-   version              Prints out version of bvbtool.
-   make_boot_image      Make boot image.
-   sign_boot_image      Sign boot image.
-   info_boot_image      Show information about boot image.
-   add_image_hashes     Add hashes for integrity-checking to image.
-   info_image_hashes    Show information about integrity-checking hashes.
-   extract_public_key   Extract public key.
-
-""")
-    parser.add_argument('COMMAND', help='The command to run')
-    args = parser.parse_args(sys.argv[1:2])
-    if not hasattr(self, args.COMMAND):
-      print 'Unrecognized command'
-      parser.print_help()
-      sys.exit(1)
-    getattr(self, args.COMMAND)()
-
-  def version(self):
-    """Implements the 'version' command."""
-    print '%d.%d' % (BVB_VERSION_MAJOR, BVB_VERSION_MINOR)
-
-  def info_boot_image(self):
-    """Implements the 'info_boot_image' command."""
-    parser = argparse.ArgumentParser(
-        prog='bvbtool info_boot_image',
-        description='Show information about Brillo boot image.')
-    parser.add_argument('--image',
-                        help='Brillo boot image to use',
-                        type=argparse.FileType('rb'),
-                        required=True)
-    parser.add_argument('--output',
-                        help='Write info to file',
-                        type=argparse.FileType('wt'),
-                        default=sys.stdout)
-    args = parser.parse_args(sys.argv[2:])
-
-    h = BvbHeader(args.image.read(BvbHeader.SIZE))
-
-    (alg_name, _) = lookup_algorithm_by_type(h.algorithm_type)
-
-    o = args.output
-    o.write('Boot Image version:       %d.%d\n' %
-            (h.header_version_major, h.header_version_minor))
-    o.write('Header Block:             %d bytes\n' % BvbHeader.SIZE)
-    o.write('Authentication Block:     %d bytes\n' %
-            h.authentication_data_block_size)
-    o.write('Auxilary Block:           %d bytes\n' % h.auxilary_data_block_size)
-    o.write('Payload Block:            %d bytes\n' % h.payload_data_block_size)
-    o.write('Algorithm:                %s\n' % alg_name)
-    o.write('Rollback Index:           %d\n' % h.rollback_index)
-    o.write('Kernel:                   %d bytes\n' % h.kernel_size)
-    o.write('Initrd:                   %d bytes\n' % h.initrd_size)
-    o.write('Kernel Load Address:      0x%08x\n' % h.kernel_address)
-    o.write('Initrd Load Address:      0x%08x\n' % h.initrd_address)
-    o.write('Kernel Cmdline:           %s\n' % h.kernel_cmdline)
-
-    # Print properties.
-    o.write('Properties:\n')
-    authentication_block_offset = BvbHeader.SIZE
-    auxilary_block_offset = (
-        authentication_block_offset + h.authentication_data_block_size)
-    prop_start_offset = auxilary_block_offset + h.properties_offset
-    prop_end_offset = prop_start_offset + h.properties_size
-    args.image.seek(prop_start_offset)
-    num_printed = 0
-    while args.image.tell() < prop_end_offset:
-      (key_len, value_len) = struct.unpack('!2Q', args.image.read(16))
-      num_bytes = key_len + value_len + 2
-      padding_bytes = (8 - num_bytes) & 7
-      prop_data = args.image.read(num_bytes + padding_bytes)
-      key = prop_data[0:key_len]
-      # Avoid printing large property values (e.g. blobs).
-      if value_len >= 256:
-        o.write('    %s: (%d bytes)\n' % (key, value_len))
-      else:
-        value = prop_data[key_len + 1:key_len + 1 + value_len]
-        o.write('    %s: %s\n' % (key, repr(value)))
-      num_printed += 1
-    if num_printed == 0:
-      o.write('    (none)\n')
-
-  def make_boot_image(self):
-    """Implements the 'make_boot_image' command."""
-    parser = argparse.ArgumentParser(prog='bvbtool make_boot_image',
-                                     description='Make Brillo boot image.')
-
-    parser.add_argument('--kernel',
-                        help='Path to kernel',
-                        type=argparse.FileType('rb'))  #, required=True)
-    parser.add_argument('--initrd',
-                        help='Path to ramdisk',
-                        type=argparse.FileType('rb'))
-    parser.add_argument('--kernel_address',
-                        help='Kernel load address',
-                        type=parse_number,
-                        default=0x10008000)
-    parser.add_argument('--initrd_address',
-                        help='Ramdisk load address',
-                        type=parse_number,
-                        default=0x11000000)
-    parser.add_argument('--kernel_cmdline',
-                        help='Kernel command-line',
-                        default='')
-    parser.add_argument('--rootfs_with_hashes',
-                        help='Setup dm-verity for given rootfs',
-                        type=argparse.FileType('rb'))
-    parser.add_argument('--rollback_index',
-                        help='Rollback Index',
-                        type=parse_number,
-                        default=0)
-    parser.add_argument('--prop',
-                        help='Add property',
-                        metavar='KEY:VALUE',
-                        action='append')
-    parser.add_argument('--prop_from_file',
-                        help='Add property from file',
-                        metavar='KEY:PATH',
-                        action='append')
-    parser.add_argument('--output',
-                        help='Output file name',
-                        type=argparse.FileType('wb'),
-                        required=True)
-    args = parser.parse_args(sys.argv[2:])
-
-    h = BvbHeader()
-
-    # Write header data block and leave ample room for hash, signature
-    # and public key.
-    h.authentication_data_block_size = 4096
-    h.kernel_offset = 0
-    h.kernel_size = os.fstat(args.kernel.fileno()).st_size
-    h.initrd_offset = 0
-    h.initrd_size = 0
-    if args.initrd:
-      h.initrd_offset = h.kernel_offset + h.kernel_size
-      h.initrd_size = os.fstat(args.initrd.fileno()).st_size
-    h.payload_data_block_size = h.kernel_size + h.initrd_size
-
-    # Generate properties blob.
-    encoded_props = bytearray()
-    if args.prop:
-      for prop in args.prop:
-        idx = prop.find(':')
-        if idx == -1:
-          sys.stderr.write('Malformed --property value %s.\n', prop)
-          sys.exit(1)
-        key = prop[0:idx]
-        value = prop[(idx + 1):]
-        add_property(encoded_props, key, value)
-    if args.prop_from_file:
-      for prop in args.prop_from_file:
-        idx = prop.find(':')
-        if idx == -1:
-          sys.stderr.write('Malformed --property value %s.\n', prop)
-          sys.exit(1)
-        key = prop[0:idx]
-        file_path = prop[(idx + 1):]
-        value = open(file_path, 'rb').read()
-        add_property(encoded_props, key, value)
-
-    # We'll store the properties at offset 0 in the Auxiliary data
-    # block. Make sure it's big enough to hold the biggest
-    # possible key.
-    h.auxilary_data_block_size = round_to_multiple(
-        len(encoded_props) + 4096, 64)
-    h.properties_offset = 0
-    h.properties_size = len(encoded_props)
-
-    h.rollback_index = args.rollback_index
-    h.kernel_address = args.kernel_address
-    h.initrd_address = args.initrd_address
-    h.kernel_cmdline = args.kernel_cmdline
-
-    # Setup dm-verity, if requested.
-    if args.rootfs_with_hashes:
-      args.rootfs_with_hashes.seek(0, os.SEEK_END)
-      image_size = args.rootfs_with_hashes.tell()
-      args.rootfs_with_hashes.seek(image_size - BvbIntegrityFooter.SIZE)
-      f = BvbIntegrityFooter(args.rootfs_with_hashes.read(
-          BvbIntegrityFooter.SIZE))
-      c = 'dm="1 vroot none ro 1,'
-      c += '0 '  # start
-      c += '%d ' % (f.image_size / 512)  # size (# sectors)
-      c += 'verity %d ' % f.dm_verity_version  # type and version
-      c += 'PARTUUID=$(ANDROID_SYSTEM_PARTUUID) '  # data_dev
-      c += 'PARTUUID=$(ANDROID_SYSTEM_PARTUUID) '  # hash_dev
-      c += '%d ' % f.data_block_size  # data_block
-      c += '%d ' % f.hash_block_size  # hash_block
-      c += '%d ' % (f.image_size / f.data_block_size)  # #blocks
-      c += '%d ' % (f.image_size / f.data_block_size)  # hash_offset
-      c += '%s ' % f.hash_algorithm  # hash_alg
-      c += '%s ' % f.root_hash_hex  # root_digest
-      c += '%s' % f.salt_hex  # salt
-      c += '"'
-      if h.kernel_cmdline:
-        c += ' '
-      h.kernel_cmdline = c + h.kernel_cmdline
-
-    # Save the header.
-    h.save(args.output)
-
-    # Write Authentication data block, as zeroes.
-    args.output.write(struct.pack(str(h.authentication_data_block_size) + 'x'))
-
-    # Write Auxilary data block. First properties, then pad with zeroes.
-    args.output.write(encoded_props)
-    args.output.write(struct.pack(str(h.auxilary_data_block_size - len(
-        encoded_props)) + 'x'))
-
-    # Write Payload data block: kernel and initrd
-    args.output.write(args.kernel.read())
-    if args.initrd:
-      args.output.write(args.initrd.read())
-
-  def sign_boot_image(self):
-    """Implements the 'sign_boot_image' command."""
-    parser = argparse.ArgumentParser(prog='bvbtool sign_boot_image',
-                                     description='Sign Brillo boot image.')
-    group = parser.add_argument_group()
-    group.add_argument('--show_algorithms',
-                       help='Show avaiable algorithms',
-                       action='store_true')
-    group = parser.add_argument_group()
-    group.add_argument('--image',
-                       help='Brillo boot image to sign',
-                       type=argparse.FileType('rab+'))
-    group.add_argument('--key', help='Path to RSA private key file')
-    group.add_argument('--algorithm', help='Algorithm to use')
-    args = parser.parse_args(sys.argv[2:])
-
-    if args.show_algorithms:
-      algs = []
-      for alg_name in ALGORITHMS:
-        if alg_name != 'NONE':
-          algs.append(alg_name)
-      algs.sort()
-      for alg in algs:
-        print alg
-      sys.exit(0)
-
-    # Support 'NONE' to avoid conditionals in build systems if
-    # signing is not needed (this way they can always execute
-    # 'bvbtool sign_boot_image --algorithm NONE')
-    if args.algorithm == 'NONE':
-      sys.exit(0)
-
-    if not args.algorithm:
-      sys.stderr.write('Option --algorithm is required.\n')
-      sys.exit(1)
-    if not args.image:
-      sys.stderr.write('Option --image is required.\n')
-      sys.exit(1)
-    if not args.key:
-      sys.stderr.write('Option --key is required.\n')
-      sys.exit(1)
-
-    try:
-      alg = ALGORITHMS[args.algorithm]
-    except IndexError:
-      sys.stderr.write('Unknown algorithm %s.\n' % args.algorithm)
-      sys.exit(1)
-
-    h = BvbHeader(args.image.read(BvbHeader.SIZE))
-
-    if h.properties_offset != 0:
-      # This is just an implementation limitation which can be lifted later.
-      sys.stderr.write('Only support images with props at the top.\n')
-      sys.exit(1)
-
-    if h.authentication_data_block_size < (
-        alg.hash_num_bytes + alg.signature_num_bytes):
-      sys.stderr.write('Insufficient room for storing hash and signature.\n')
-      sys.exit(1)
-
-    if h.auxilary_data_block_size < alg.public_key_num_bytes:
-      sys.stderr.write('Insufficient room for storing public key.\n')
-      sys.exit(1)
-
-    authentication_data_block_offset = BvbHeader.SIZE
-    auxilary_data_block_offset = (
-        authentication_data_block_offset + h.authentication_data_block_size)
-
-    # Update header with hash type/offset/size, signature
-    # type/offset/size, and public key size.
-    h.algorithm_type = alg.algorithm_type
-    # Hash offset and size (in Authentication data block).
-    h.hash_offset = 0
-    h.hash_size = alg.hash_num_bytes
-    # Signature offset and size - it's stored right after the hash
-    # (in Authentication data block).
-    h.signature_offset = alg.hash_num_bytes
-    h.signature_size = alg.signature_num_bytes
-    # Public key offset and size - follows properties (in Auxilary data block).
-    h.public_key_offset = h.properties_size
-    h.public_key_size = alg.public_key_num_bytes
-
-    # Extract public key and insert it into "Auxilary data" block.
-    key = Crypto.PublicKey.RSA.importKey(open(args.key).read())
-    args.image.seek(auxilary_data_block_offset + h.properties_size)
-    write_rsa_key(args.image, key)
-
-    # Save the updated header.
-    args.image.seek(0)
-    h.save(args.image)
-
-    # Calculate the hash.
-    if args.algorithm[0:6] == 'SHA256':
-      ha = hashlib.sha256()
-    elif args.algorithm[0:6] == 'SHA512':
-      ha = hashlib.sha512()
-    else:
-      sys.stderr.write('Unsupported algorithm.\n')
-      sys.exit(1)
-    args.image.seek(0)
-    ha.update(args.image.read(BvbHeader.SIZE))
-    args.image.seek(auxilary_data_block_offset)
-    ha.update(args.image.read(h.auxilary_data_block_size))
-    ha.update(args.image.read(h.payload_data_block_size))
-    # Write the hash
-    args.image.seek(authentication_data_block_offset)
-    binary_hash = ha.digest()
-    args.image.write(binary_hash)
-
-    # Calculate the signature.
-    p = subprocess.Popen(
-        ['openssl', 'rsautl', '-sign', '-inkey', args.key, '-raw'],
-        stdin=subprocess.PIPE,
-        stdout=subprocess.PIPE,
-        stderr=subprocess.PIPE)
-    padding_and_hash = str(bytearray(alg.padding)) + binary_hash
-    (pout, perr) = p.communicate(padding_and_hash)
-    retcode = p.wait()
-    if retcode != 0:
-      sys.stderr.write('Error signing: %s\n' % perr)
-      sys.exit(1)
-    # Write the signature.
-    args.image.seek(authentication_data_block_offset + alg.hash_num_bytes)
-    args.image.write(pout)
-
-  def extract_public_key(self):
-    """Implements the 'extract_public_key' command."""
-    parser = argparse.ArgumentParser(
-        prog='bvbtool extract_public_key',
-        description=
-        'Extract public key and dump it in the format used by Brillo.')
-    parser.add_argument('--key',
-                        help='Path to RSA private key file',
-                        required=True)
-    parser.add_argument('--output',
-                        help='Output file name',
-                        type=argparse.FileType('wb'),
-                        required=True)
-    args = parser.parse_args(sys.argv[2:])
-
-    key = Crypto.PublicKey.RSA.importKey(open(args.key).read())
-    write_rsa_key(args.output, key)
-
-  def info_image_hashes(self):
-    """Implements the 'info_boot_image' command."""
-    parser = argparse.ArgumentParser(
-        prog='bvbtool info_image_hashes',
-        description='Show information about integrity-checking hashes.')
-    parser.add_argument('--image',
-                        help='Brillo boot image to use',
-                        type=argparse.FileType('rb'),
-                        required=True)
-    parser.add_argument('--output',
-                        help='Write info to file',
-                        type=argparse.FileType('wt'),
-                        default=sys.stdout)
-    args = parser.parse_args(sys.argv[2:])
-
-    args.image.seek(0, os.SEEK_END)
-    image_size = args.image.tell()
-    args.image.seek(image_size - BvbIntegrityFooter.SIZE)
-    footer = BvbIntegrityFooter(args.image.read(BvbIntegrityFooter.SIZE))
-
-    o = args.output
-    o.write('Footer version:        %d.%d\n' %
-            (footer.version_major, footer.version_minor))
-    o.write('Version of dm-verity:  %d\n' % footer.dm_verity_version)
-    o.write('Image Size:            %d bytes\n' % footer.image_size)
-    o.write('Tree Offset:           %d\n' % footer.tree_offset)
-    o.write('Tree Size:             %d bytes\n' % footer.tree_size)
-    o.write('Data Block Size:       %d bytes\n' % footer.data_block_size)
-    o.write('Hash Block Size:       %d bytes\n' % footer.hash_block_size)
-    o.write('Hash Algorithm:        %s\n' % footer.hash_algorithm)
-    o.write('Salt:                  %s\n' % footer.salt_hex)
-    o.write('Root Hash:             %s\n' % footer.root_hash_hex)
-
-  def add_image_hashes(self):
-    """Implements the 'add_image_hashes' command.
-
-    See https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity for
-    more information about dm-verity and these hashes.
-    """
-    parser = argparse.ArgumentParser(
-        prog='bvbtool add_hashes_to_image',
-        description='Add hashes for integrity-checking to image.')
-    parser.add_argument('--image',
-                        help='Brillo boot image to add hashes to',
-                        type=argparse.FileType('rab+'))
-    parser.add_argument('--hash',
-                        help='Hash algorithm to use (default: sha1)',
-                        default='sha1')
-    parser.add_argument('--salt', help='Salt in hex (default: /dev/urandom)')
-    parser.add_argument('--block_size',
-                        help='Block size (default: 4096)',
-                        type=parse_number,
-                        default=4096)
-    args = parser.parse_args(sys.argv[2:])
-
-    # If there's already a footer of ours, truncate it. This way
-    # 'bvbtool add_hashes_to_image' is idempotent modulo salts.
-    args.image.seek(0, os.SEEK_END)
-    image_size = args.image.tell()
-    args.image.seek(image_size - BvbIntegrityFooter.SIZE)
-    try:
-      footer = BvbIntegrityFooter(args.image.read(BvbIntegrityFooter.SIZE))
-      # Existing footer found. Just truncate.
-      image_size = footer.image_size
-      args.image.truncate(image_size)
-    except (LookupError, struct.error):
-      pass
-
-    # Ensure image is multiple of block_size
-    rounded_image_size = round_to_multiple(image_size, args.block_size)
-    if rounded_image_size > image_size:
-      args.image.write('\0' * (rounded_image_size - image_size))
-      image_size = rounded_image_size
-
-    tree_offset = image_size
-
-    digest_size = len(hashlib.new(name=args.hash).digest())
-    digest_padding = round_to_pow2(digest_size) - digest_size
-
-    if args.salt:
-      salt = args.salt.decode('hex')
-    else:
-      if args.salt is None:
-        # If salt is not explicitly specified, choose a hash
-        # that's the same size as the hash size.
-        hash_size = digest_size
-        salt = open('/dev/urandom').read(hash_size)
-      else:
-        salt = ''
-
-    # Hashes are stored upside down so we need to calcuate hash
-    # offsets in advance.
-    (hash_level_offsets, tree_size) = calc_hash_level_offsets(
-        image_size, args.block_size, digest_size + digest_padding)
-
-    # Make room for the tree.
-    args.image.truncate(image_size + tree_size)
-
-    # Generate the tree.
-    root_hash = generate_hash_tree(args.image, image_size, args.block_size,
-                                   args.hash, salt, digest_padding, tree_offset,
-                                   hash_level_offsets)
-
-    # Write footer with the root hash and other information.
-    footer = BvbIntegrityFooter()
-    footer.dm_verity_version = 1
-    footer.image_size = image_size
-    footer.tree_offset = tree_offset
-    footer.tree_size = tree_size
-    footer.data_block_size = args.block_size
-    footer.hash_block_size = args.block_size
-    footer.hash_algorithm = args.hash
-    footer.salt_hex = salt.encode('hex')
-    footer.root_hash_hex = root_hash.encode('hex')
-    args.image.seek(tree_offset + tree_size)
-    footer.save(args.image)
-
-
-def calc_hash_level_offsets(image_size, block_size, digest_size):
-  """Calculate the offsets of all the hash-levels in a Merkle-tree.
-
-  Arguments:
-    image_size: The size of the image to calculate a Merkle-tree for.
-    block_size: The block size, e.g. 4096.
-    digest_size: The size of each hash, e.g. 32 for SHA-256.
-
-  Returns:
-    A tuple where the first argument is an array of offsets and the
-    second is size of the tree, in bytes.
-  """
-  level_offsets = []
-  level_sizes = []
-  tree_size = 0
-
-  num_levels = 0
-  size = image_size
-  while size > block_size:
-    num_blocks = (size + block_size - 1) / block_size
-    level_size = round_to_multiple(num_blocks * digest_size, block_size)
-
-    level_sizes.append(level_size)
-    tree_size += level_size
-    num_levels += 1
-
-    size = level_size
-
-  for n in range(0, num_levels):
-    offset = 0
-    for m in range(n + 1, num_levels):
-      offset += level_sizes[m]
-    level_offsets.append(offset)
-
-  return (level_offsets, tree_size)
-
-
-def generate_hash_tree(image, image_size, block_size, hash_alg_name, salt,
-                       digest_padding, tree_offset, hash_level_offsets):
-  """Generates a Merkle-tree for a file.
-
-  Args:
-    image: The image, as a file.
-    image_size: The size of the image.
-    block_size: The block size, e.g. 4096.
-    hash_alg_name: The hash algorithm, e.g. 'sha256' or 'sha1'.
-    salt: The salt to use.
-    digest_padding: The padding for each digest.
-    tree_offset: The offset of where to store the Merkle tree in |image|.
-    hash_level_offsets: The offsets from calc_hash_level_offsets().
-
-  Returns:
-    The top-level hash.
-  """
-  hash_src_offset = 0
-  hash_src_size = image_size
-  level_num = 0
-  while hash_src_size > block_size:
-    level_output = ''
-    image.seek(hash_src_offset)
-    remaining = hash_src_size
-    while remaining > 0:
-      hasher = hashlib.new(name=hash_alg_name, string=salt)
-      data = image.read(min(remaining, block_size))
-      assert data
-      remaining -= len(data)
-      hasher.update(data)
-      if len(data) < block_size:
-        hasher.update('\0' * (block_size - len(data)))
-      level_output += hasher.digest()
-      if digest_padding > 0:
-        level_output += '\0' * digest_padding
-
-    padding_needed = (round_to_multiple(
-        len(level_output), block_size) - len(level_output))
-    level_output += '\0' * padding_needed
-
-    hash_dest_offset = hash_level_offsets[level_num] + tree_offset
-
-    image.seek(hash_dest_offset)
-    image.write(level_output)
-
-    hash_src_offset = hash_dest_offset
-    hash_src_size = len(level_output)
-
-    level_num += 1
-
-  hasher = hashlib.new(name=hash_alg_name, string=salt)
-  hasher.update(level_output)
-  return hasher.digest()
-
-
-if __name__ == '__main__':
-  BvbTool()
diff --git a/bvbtool_unittest.cc b/bvbtool_unittest.cc
deleted file mode 100644
index 975691a..0000000
--- a/bvbtool_unittest.cc
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <iostream>
-
-#include <endian.h>
-#include <inttypes.h>
-#include <string.h>
-
-#include <base/files/file_util.h>
-#include <base/strings/string_util.h>
-#include <base/strings/stringprintf.h>
-
-#include "bvb_unittest_util.h"
-#include "bvb_refimpl.h"
-
-class BvbToolTest : public BaseBvbToolTest {
-public:
-  BvbToolTest() {}
-};
-
-// This test ensure that the version is increased in both
-// bvb_boot_image.h and the bvb tool.
-TEST_F(BvbToolTest, BvbVersionInSync)
-{
-  base::FilePath path = testdir_.Append("version.txt");
-  EXPECT_COMMAND(0,
-                 "./bvbtool version > %s",
-                 path.value().c_str());
-  std::string printed_version;
-  ASSERT_TRUE(base::ReadFileToString(path, &printed_version));
-  base::TrimWhitespaceASCII(printed_version, base::TRIM_ALL, &printed_version);
-  std::string expected_version = base::StringPrintf("%d.%d",
-                                                    BVB_MAJOR_VERSION,
-                                                    BVB_MINOR_VERSION);
-  EXPECT_EQ(printed_version, expected_version);
-}
-
-TEST_F(BvbToolTest, ExtractPublicKey)
-{
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  base::FilePath public_key_path = testdir_.Append("public_key.bin");
-  EXPECT_COMMAND(0,
-                 "./bvbtool extract_public_key --key test/testkey_rsa2048.pem"
-                 " --output %s",
-                 public_key_path.value().c_str());
-
-  std::string key_data;
-  ASSERT_TRUE(base::ReadFileToString(public_key_path, &key_data));
-
-  BvbBootImageHeader h;
-  bvb_boot_image_header_to_host_byte_order(
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data()), &h);
-  uint8_t *d = reinterpret_cast<uint8_t*>(boot_image_.data());
-  size_t auxilary_data_block_offset =
-      sizeof(BvbBootImageHeader) + h.authentication_data_block_size;
-  EXPECT_GT(h.auxilary_data_block_size, key_data.size());
-  EXPECT_EQ(0, memcmp(key_data.data(),
-                      d + auxilary_data_block_offset + h.public_key_offset,
-                      key_data.size()));
-}
-
-TEST_F(BvbToolTest, PayloadsAreCorrect)
-{
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader h;
-  bvb_boot_image_header_to_host_byte_order(
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data()), &h);
-
-  uint8_t *d = reinterpret_cast<uint8_t*>(boot_image_.data()) +
-      sizeof(BvbBootImageHeader) +
-      h.authentication_data_block_size +
-      h.auxilary_data_block_size;
-
-  // Check that the kernel and initrd images are inserted correctly.
-  for (int n = 0; n < 2; n++) {
-    std::string paths[2] = {"test/dummy_kernel.bin",
-                            "test/dummy_initrd.bin"};
-    base::FilePath path(paths[n]);
-
-    int64_t file_size;
-    std::vector<uint8_t> file_data;
-    ASSERT_TRUE(base::GetFileSize(path, &file_size));
-    file_data.resize(file_size);
-    ASSERT_TRUE(base::ReadFile(path,
-                               reinterpret_cast<char*>(file_data.data()),
-                               file_data.size()));
-
-    switch (n) {
-      case 0:
-        // kernel
-        EXPECT_EQ(65536U, file_data.size());
-        EXPECT_EQ(file_data.size(), h.kernel_size);
-        EXPECT_EQ(0, memcmp(file_data.data(),
-                            d + h.kernel_offset,
-                            file_data.size()));
-        break;
-      case 1:
-        // initrd
-        EXPECT_EQ(131072U, file_data.size());
-        EXPECT_EQ(file_data.size(), h.initrd_size);
-        EXPECT_EQ(0, memcmp(file_data.data(),
-                            d + h.initrd_offset,
-                            file_data.size()));
-        break;
-      default:
-        ASSERT_TRUE(false);
-        break;
-    }
-  }
-}
-
-TEST_F(BvbToolTest, CheckCmdline)
-{
-  std::string cmdline("init=/sbin/init ro x y z");
-  GenerateBootImage("SHA256_RSA2048", cmdline, 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader h;
-  bvb_boot_image_header_to_host_byte_order(
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data()), &h);
-
-  EXPECT_EQ(0, ::strcmp(cmdline.c_str(),
-                        reinterpret_cast<const char*>(h.kernel_cmdline)));
-}
-
-TEST_F(BvbToolTest, CheckAddresses)
-{
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"),
-                    "--kernel_addr 0x42 --initrd_addr 43");
-
-  BvbBootImageHeader h;
-  bvb_boot_image_header_to_host_byte_order(
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data()), &h);
-
-  EXPECT_EQ(0x42U, h.kernel_addr);
-  EXPECT_EQ(43U, h.initrd_addr);
-}
-
-TEST_F(BvbToolTest, CheckProperties)
-{
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"),
-                    "--prop foo:brillo "
-                    "--prop bar:chromeos "
-                    "--prop prisoner:24601 "
-                    "--prop hexnumber:0xcafe "
-                    "--prop hexnumber_capital:0xCAFE "
-                    "--prop large_hexnumber:0xfedcba9876543210 "
-                    "--prop larger_than_uint64:0xfedcba98765432101 "
-                    "--prop almost_a_number:423x "
-                    "--prop_from_file blob:test/small_blob.bin "
-                    );
-
-  BvbBootImageHeader h;
-  bvb_boot_image_header_to_host_byte_order(
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data()), &h);
-
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  nullptr, nullptr));
-
-  const char *s;
-  size_t len;
-  uint64_t val;
-
-  // Basic.
-  s = bvb_lookup_property(boot_image_.data(), boot_image_.size(),
-                          "foo", 0, &len);
-  EXPECT_EQ(0, strcmp(s, "brillo"));
-  EXPECT_EQ(6U, len);
-  s = bvb_lookup_property(boot_image_.data(), boot_image_.size(),
-                          "bar", 0, &len);
-  EXPECT_EQ(0, strcmp(s, "chromeos"));
-  EXPECT_EQ(8U, len);
-  s = bvb_lookup_property(boot_image_.data(), boot_image_.size(),
-                          "non-existant", 0, &len);
-  EXPECT_EQ(0U, len);
-  EXPECT_EQ(NULL, s);
-
-  // Numbers.
-  EXPECT_NE(0, bvb_lookup_property_uint64(
-      boot_image_.data(), boot_image_.size(), "prisoner", 0, &val));
-  EXPECT_EQ(24601U, val);
-
-  EXPECT_NE(0, bvb_lookup_property_uint64(
-      boot_image_.data(), boot_image_.size(), "hexnumber", 0, &val));
-  EXPECT_EQ(0xcafeU, val);
-
-  EXPECT_NE(0, bvb_lookup_property_uint64(
-      boot_image_.data(), boot_image_.size(), "hexnumber_capital", 0, &val));
-  EXPECT_EQ(0xcafeU, val);
-
-  EXPECT_NE(0, bvb_lookup_property_uint64(
-      boot_image_.data(), boot_image_.size(), "large_hexnumber", 0, &val));
-  EXPECT_EQ(0xfedcba9876543210U, val);
-
-  // We could catch overflows and return an error ... but we currently don't.
-  EXPECT_NE(0, bvb_lookup_property_uint64(
-      boot_image_.data(), boot_image_.size(), "larger_than_uint64", 0, &val));
-  EXPECT_EQ(0xedcba98765432101U, val);
-
-  // Number-parsing failures.
-  EXPECT_EQ(0, bvb_lookup_property_uint64(
-      boot_image_.data(), boot_image_.size(), "foo", 0, &val));
-
-  EXPECT_EQ(0, bvb_lookup_property_uint64(
-      boot_image_.data(), boot_image_.size(), "almost_a_number", 0, &val));
-
-  // Blobs.
-  //
-  // test/small_blob.bin is 21 byte file full of NUL-bytes except for
-  // the string "brillo ftw!" at index 2 and '\n' at the last byte.
-  s = bvb_lookup_property(boot_image_.data(), boot_image_.size(),
-                          "blob", 0, &len);
-  EXPECT_EQ(21U, len);
-  EXPECT_EQ(0, memcmp(s,     "\0\0", 2));
-  EXPECT_EQ(0, memcmp(s +  2, "brillo ftw!", 11));
-  EXPECT_EQ(0, memcmp(s + 13, "\0\0\0\0\0\0\0", 7));
-  EXPECT_EQ('\n', s[20]);
-}
-
-TEST_F(BvbToolTest, CheckRollbackIndex)
-{
-  uint64_t rollback_index = 42;
-  GenerateBootImage("SHA256_RSA2048", "", rollback_index,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  BvbBootImageHeader h;
-  bvb_boot_image_header_to_host_byte_order(
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data()), &h);
-
-  EXPECT_EQ(rollback_index, h.rollback_index);
-}
-
-TEST_F(BvbToolTest, CheckPubkeyReturned)
-{
-  GenerateBootImage("SHA256_RSA2048", "", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"));
-
-  const uint8_t* pubkey = NULL;
-  size_t pubkey_length = 0;
-
-  EXPECT_EQ(BVB_VERIFY_RESULT_OK,
-            bvb_verify_boot_image(boot_image_.data(), boot_image_.size(),
-                                  &pubkey, &pubkey_length));
-
-  BvbBootImageHeader h;
-  bvb_boot_image_header_to_host_byte_order(
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data()), &h);
-
-  EXPECT_EQ(pubkey_length, h.public_key_size);
-
-  const uint8_t* expected_pubkey = boot_image_.data() +
-      sizeof(BvbBootImageHeader) +
-      h.authentication_data_block_size +
-      h.public_key_offset;
-  EXPECT_EQ(pubkey, expected_pubkey);
-}
-
-TEST_F(BvbToolTest, Info)
-{
-  GenerateBootImage("SHA256_RSA2048", "foobar=cmdline test=42", 0,
-                    base::FilePath("test/testkey_rsa2048.pem"),
-                    "--prop foo:brillo "
-                    "--prop bar:chromeos "
-                    "--prop prisoner:24601 "
-                    "--prop hexnumber:0xcafe "
-                    "--prop hexnumber_capital:0xCAFE "
-                    "--prop large_hexnumber:0xfedcba9876543210 "
-                    "--prop larger_than_uint64:0xfedcba98765432101 "
-                    "--prop almost_a_number:423x "
-                    "--prop_from_file blob:test/small_blob.bin "
-                    "--prop_from_file large_blob:test/dummy_kernel.bin");
-
-  base::FilePath info_path = testdir_.Append("info_output.txt");
-  EXPECT_COMMAND(0,
-                 "./bvbtool info_boot_image --image %s --output %s",
-                 boot_image_path_.value().c_str(),
-                 info_path.value().c_str());
-
-  std::string info_data;
-  ASSERT_TRUE(base::ReadFileToString(info_path, &info_data));
-
-  ASSERT_EQ(
-      "Boot Image version:       1.0\n"
-      "Header Block:             8192 bytes\n"
-      "Authentication Block:     4096 bytes\n"
-      "Auxilary Block:           70080 bytes\n"
-      "Payload Block:            196608 bytes\n"
-      "Algorithm:                SHA256_RSA2048\n"
-      "Rollback Index:           0\n"
-      "Kernel:                   65536 bytes\n"
-      "Initrd:                   131072 bytes\n"
-      "Kernel Load Address:      0x10008000\n"
-      "Initrd Load Address:      0x11000000\n"
-      "Kernel Cmdline:           foobar=cmdline test=42\n"
-      "Properties:\n"
-      "    foo: 'brillo'\n"
-      "    bar: 'chromeos'\n"
-      "    prisoner: '24601'\n"
-      "    hexnumber: '0xcafe'\n"
-      "    hexnumber_capital: '0xCAFE'\n"
-      "    large_hexnumber: '0xfedcba9876543210'\n"
-      "    larger_than_uint64: '0xfedcba98765432101'\n"
-      "    almost_a_number: '423x'\n"
-      "    blob: '\\x00\\x00brillo "
-      "ftw!\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\n'\n"
-      "    large_blob: (65536 bytes)\n",
-      info_data);
-}
-
-TEST_F(BvbToolTest, ImageHashes) {
-  // test/dummy_rootfs.bin is a 1,049,600 byte (1025 Kib) file.
-  EXPECT_COMMAND(
-      0, "cp test/dummy_rootfs.bin %s/rootfs.bin", testdir_.value().c_str());
-  EXPECT_COMMAND(
-      0,
-      "./bvbtool add_image_hashes --salt d00df00d  --image %s/rootfs.bin",
-      testdir_.value().c_str());
-
-  // We don't want to impose the requirement of having the
-  // veritysetup(1) command available on builders but leave it here so
-  // it can be manually enabled when making changes.
-  //
-  // (The fact that we end up with the correct root hash and tree size
-  // demonstrates correctness sufficiently well.)
-  if (false) {
-    EXPECT_COMMAND(0,
-                   "veritysetup --no-superblock --format=1 --hash=sha1 "
-                   "--data-block-size=4096 --hash-block-size=4096 "
-                   "--salt=d00df00d "
-                   "--data-blocks=257 "
-                   "--hash-offset=1052672 "
-                   "verify "
-                   "%s/rootfs.bin %s/rootfs.bin "
-                   "d0e3b9865f45fc66c1a64796dae1666647103f72",
-                   testdir_.value().c_str(),
-                   testdir_.value().c_str());
-  }
-
-  base::FilePath info_path = testdir_.Append("info_output.txt");
-  EXPECT_COMMAND(
-      0,
-      "./bvbtool info_image_hashes --image %s/rootfs.bin --output %s",
-      testdir_.value().c_str(),
-      info_path.value().c_str());
-
-  std::string info_data;
-  ASSERT_TRUE(base::ReadFileToString(info_path, &info_data));
-
-  // Note that image size is rounded up to block size (4096).
-  ASSERT_EQ(
-      "Footer version:        1.0\n"
-      "Version of dm-verity:  1\n"
-      "Image Size:            1052672 bytes\n"
-      "Tree Offset:           1052672\n"
-      "Tree Size:             16384 bytes\n"
-      "Data Block Size:       4096 bytes\n"
-      "Hash Block Size:       4096 bytes\n"
-      "Hash Algorithm:        sha1\n"
-      "Salt:                  d00df00d\n"
-      "Root Hash:             d0e3b9865f45fc66c1a64796dae1666647103f72\n",
-      info_data);
-
-  // Check that bvbtool injects the directives for setting up the
-  // rootfs for the given integrity-checked file system BEFORE the
-  // user-supplied command-line.
-  GenerateBootImage("SHA256_RSA2048",
-                    "some_option=42",
-                    0,
-                    base::FilePath("test/testkey_rsa2048.pem"),
-                    base::StringPrintf("--rootfs_with_hashes %s/rootfs.bin",
-                                       testdir_.value().c_str()));
-  BvbBootImageHeader h;
-  bvb_boot_image_header_to_host_byte_order(
-      reinterpret_cast<BvbBootImageHeader*>(boot_image_.data()), &h);
-
-  EXPECT_EQ(
-      "dm=\"1 vroot none ro 1,"
-      "0 2056 verity 1 PARTUUID=$(ANDROID_SYSTEM_PARTUUID) "
-      "PARTUUID=$(ANDROID_SYSTEM_PARTUUID) 4096 4096 257 257 sha1 "
-      "d0e3b9865f45fc66c1a64796dae1666647103f72 d00df00d\" "
-      "some_option=42",
-      std::string(reinterpret_cast<const char*>(h.kernel_cmdline)));
-}
diff --git a/refimpl/bvb_boot_image_header.h b/refimpl/bvb_boot_image_header.h
deleted file mode 100644
index 8f90e5e..0000000
--- a/refimpl/bvb_boot_image_header.h
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#if !defined (BVB_INSIDE_BVB_REFIMPL_H) && !defined (BVB_REFIMPL_COMPILATION)
-#error "Never include this file directly, include bvb_refimpl.h instead."
-#endif
-
-#ifndef BVB_BOOT_IMAGE_HEADER_H_
-#define BVB_BOOT_IMAGE_HEADER_H_
-
-#include "bvb_sysdeps.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Size of the Brillo boot image header. */
-#define BVB_BOOT_IMAGE_HEADER_SIZE 8192
-
-/* Magic for the Brillo boot image header. */
-#define BVB_MAGIC "BVB0"
-#define BVB_MAGIC_LEN 4
-
-/* The current MAJOR and MINOR versions used - keep in sync with bvbtool. */
-#define BVB_MAJOR_VERSION 1
-#define BVB_MINOR_VERSION 0
-
-/* Maximum number of bytes in the kernel command-line before substitution. */
-#define BVB_KERNEL_CMDLINE_MAX_LEN 4096
-
-/* Algorithms that can be used in the Brillo boot image for
- * verification. An algorithm consists of a hash type and a signature
- * type.
- *
- * The data used to calculate the hash is the four blocks mentioned in
- * the documentation for |BvbBootImageHeader| except for the data in
- * the "Authentication data" block.
- *
- * For signatures with RSA keys, PKCS v1.5 padding is used. The public
- * key data is stored in the auxilary data block, see
- * |BvbRSAPublicKeyHeader| for the serialization format.
- *
- * Each algorithm type is described below:
- *
- * BVB_ALGORITHM_TYPE_NONE: There is no hash, no signature of the
- * data, and no public key. The data cannot be verified. The fields
- * |hash_size|, |signature_size|, and |public_key_size| must be zero.
- *
- * BVB_ALGORITHM_TYPE_SHA256_RSA2048: The hash function used is
- * SHA-256, resulting in 32 bytes of hash digest data. This hash is
- * signed with a 2048-bit RSA key. The field |hash_size| must be 32,
- * |signature_size| must be 256, and the public key data must have
- * |key_num_bits| set to 2048.
- *
- * BVB_ALGORITHM_TYPE_SHA256_RSA4096: Like above, but only with
- * a 4096-bit RSA key and |signature_size| set to 512.
- *
- * BVB_ALGORITHM_TYPE_SHA256_RSA8192: Like above, but only with
- * a 8192-bit RSA key and |signature_size| set to 1024.
- *
- * BVB_ALGORITHM_TYPE_SHA512_RSA2048: The hash function used is
- * SHA-512, resulting in 64 bytes of hash digest data. This hash is
- * signed with a 2048-bit RSA key. The field |hash_size| must be 64,
- * |signature_size| must be 256, and the public key data must have
- * |key_num_bits| set to 2048.
- *
- * BVB_ALGORITHM_TYPE_SHA512_RSA4096: Like above, but only with
- * a 4096-bit RSA key and |signature_size| set to 512.
- *
- * BVB_ALGORITHM_TYPE_SHA512_RSA8192: Like above, but only with
- * a 8192-bit RSA key and |signature_size| set to 1024.
- */
-typedef enum {
-  BVB_ALGORITHM_TYPE_NONE,
-  BVB_ALGORITHM_TYPE_SHA256_RSA2048,
-  BVB_ALGORITHM_TYPE_SHA256_RSA4096,
-  BVB_ALGORITHM_TYPE_SHA256_RSA8192,
-  BVB_ALGORITHM_TYPE_SHA512_RSA2048,
-  BVB_ALGORITHM_TYPE_SHA512_RSA4096,
-  BVB_ALGORITHM_TYPE_SHA512_RSA8192,
-  _BVB_ALGORITHM_NUM_TYPES
-} BvbAlgorithmType;
-
-/* The header for a serialized RSA public key.
- *
- * The size of the key is given by |key_num_bits|, for example 2048
- * for a RSA-2048 key. By definition, a RSA public key is the pair (n,
- * e) where |n| is the modulus (which can be represented in
- * |key_num_bits| bits) and |e| is the public exponent. The exponent
- * is not stored since it's assumed to always be 65537.
- *
- * To optimize verification, the key block includes two precomputed
- * values, |n0inv| (fits in 32 bits) and |rr| and can always be
- * represented in |key_num_bits|.
-
- * The value |n0inv| is the value -1/n[0] (mod 2^32). The value |rr|
- * is (2^key_num_bits)^2 (mod n).
- *
- * Following this header is |key_num_bits| bits of |n|, then
- * |key_num_bits| bits of |rr|. Both values are stored with most
- * significant bit first. Each serialized number takes up
- * |key_num_bits|/8 bytes.
- *
- * All fields in this struct are stored in network byte order when
- * serialized.  To generate a copy with fields swapped to native byte
- * order, use the function bvb_rsa_public_key_header_to_host_byte_order().
- *
- * The bvb_RSAVerify() function expects a key in this serialized
- * format.
- *
- * The 'bvbtool extract_public_key' command can be used to generate a
- * serialized RSA public key.
- */
-typedef struct BvbRSAPublicKeyHeader {
-  uint32_t key_num_bits;
-  uint32_t n0inv;
-} __attribute__((packed)) BvbRSAPublicKeyHeader;
-
-/* The header for a serialized property.
- *
- * Following this header is |key_num_bytes| bytes of key data,
- * followed by a NUL byte, then |value_num_bytes| bytes of value data,
- * followed by a NUL byte and then enough padding to make the combined
- * size a multiple of 8.
- *
- * Headers with keys beginning with "brillo." are reserved for use in
- * the Brillo project and must not be used by others. Well-known
- * headers include
- *
- *   brillo.device_tree: The property value is a device-tree blob.
- */
-typedef struct BvbPropertyHeader {
-  uint64_t key_num_bytes;
-  uint64_t value_num_bytes;
-} __attribute__((packed)) BvbPropertyHeader;
-
-/* Binary format for header of the boot image used in Brillo.
- *
- * The Brillo boot image consists of four blocks:
- *
- *  +-----------------------------------------+
- *  | Header data - fixed size                |
- *  +-----------------------------------------+
- *  | Authentication data - variable size     |
- *  +-----------------------------------------+
- *  | Auxilary data - variable size           |
- *  +-----------------------------------------+
- *  | Payload data - variable size            |
- *  +-----------------------------------------+
- *
- * The "Header data" block is described by this struct and is always
- * |BVB_BOOT_IMAGE_HEADER_SIZE| bytes long.
- *
- * The "Authentication data" block is |authentication_data_block_size|
- * bytes long and contains the hash and signature used to authenticate
- * the boot image. The type of the hash and signature is defined by
- * the |algorithm_type| field.
- *
- * The "Auxilary data" is |auxilary_data_block_size| bytes long and
- * contains the auxilary data including the public key used to make
- * the signature and properties.
- *
- * The public key is at offset |public_key_offset| with size
- * |public_key_size| in this block. The size of the public key data is
- * defined by the |algorithm_type| field. The format of the public key
- * data is described in the |BvbRSAPublicKeyHeader| struct.
- *
- * The properties starts at |properties_offset| from the beginning of
- * the "Auxliary Data" block and take up |properties_size| bytes. Each
- * property is stored as |BvbPropertyHeader| with key, NUL, value,
- * NUL, and padding following. The number of properties can be
- * determined by walking this data until |properties_size| is
- * exhausted.
- *
- * The "Payload data" block is |payload_data_block_size| bytes
- * long. This is where the kernel, initramfs, and other data is
- * stored.
- *
- * The size of each of the "Authentication data" and "Auxilary data"
- * blocks must be divisible by 64. This is to ensure proper alignment.
- *
- * Properties are free-form key/value pairs stored in a part of the
- * boot partition subject to the same integrity checks as the rest of
- * the boot partition. See the documentation for |BvbPropertyHeader|
- * for well-known properties. See bvb_property_lookup() and
- * bvb_property_lookup_uint64() for convenience functions to look up
- * property values.
- *
- * This struct is versioned, see the |header_version_major| and
- * |header_version_minor| fields. Compatibility is guaranteed only
- * within the same major version.
- *
- * All fields are stored in network byte order when serialized. To
- * generate a copy with fields swapped to native byte order, use the
- * function bvb_boot_image_header_to_host_byte_order().
- *
- * Before reading and/or using any of this data, you MUST verify it
- * using bvb_verify_boot_image() and reject it unless it's signed by a
- * known good public key.
- */
-typedef struct BvbBootImageHeader {
-  /*   0: Four bytes equal to "BVB0" (BVB_MAGIC). */
-  uint8_t magic[BVB_MAGIC_LEN];
-  /*   4: The major version of the boot image header. */
-  uint32_t header_version_major;
-  /*   8: The minor version of the boot image header. */
-  uint32_t header_version_minor;
-
-  /*  12: The size of the signature block. */
-  uint64_t authentication_data_block_size;
-  /*  20: The size of the public key block. */
-  uint64_t auxilary_data_block_size;
-  /*  28: The size of the payload block. */
-  uint64_t payload_data_block_size;
-
-  /*  36: The verification algorithm used, see |BvbAlgorithmType| enum. */
-  uint32_t algorithm_type;
-
-  /*  40: Offset into the "Authentication data" block of hash data. */
-  uint64_t hash_offset;
-  /*  48: Length of the hash data. */
-  uint64_t hash_size;
-
-  /*  56: Offset into the "Authentication data" block of signature data. */
-  uint64_t signature_offset;
-  /*  64: Length of the signature data. */
-  uint64_t signature_size;
-
-  /*  72: Offset into the "Auxilary data" block of public key data. */
-  uint64_t public_key_offset;
-  /*  80: Length of the public key data. */
-  uint64_t public_key_size;
-
-  /*  88: Offset into the "Auxilary data" block of property data. */
-  uint64_t properties_offset;
-  /*  96: Length of property data. */
-  uint64_t properties_size;
-
-  /* 104: The rollback index which can be used to prevent rollback to
-   *  older versions.
-   */
-  uint64_t rollback_index;
-
-  /* 112: Offset into the "Payload data" block of kernel image. */
-  uint64_t kernel_offset;
-  /* 120: Length of the kernel image. */
-  uint64_t kernel_size;
-
-  /* 128: Offset into the "Payload data" block of initial ramdisk. */
-  uint64_t initrd_offset;
-  /* 136: Length of the initial ramdisk. */
-  uint64_t initrd_size;
-
-  /* 144: Physical kernel load address. */
-  uint64_t kernel_addr;
-
-  /* 152: Physical initial ramdisk load address. */
-  uint64_t initrd_addr;
-
-  /* 160: The NUL-terminated kernel command-line string, passed to the
-   * Linux kernel.
-   *
-   * Limited substitution will be performed by the boot loader - the
-   * following variables are supported:
-   *
-   *   $(ANDROID_SYSTEM_PARTUUID) - this place-holder will be replaced
-   *   with the image UUID/GUID of the corresponding system_X image of
-   *   the booted slot (where _X is the slot to boot).
-   *
-   *   $(ANDROID_BOOT_PARTUUID) - this place-holder will be replaced
-   *   with the image UUID/GUID of the boot image of the booted slot.
-   *
-   * For example, the snippet "root=PARTUUID=$(ANDROID_SYSTEM_PARTUUID)"
-   * in this field can be used to instruct the Linux kernel to use the
-   * system image in the booted slot as the root filesystem.
-   */
-  uint8_t kernel_cmdline[BVB_KERNEL_CMDLINE_MAX_LEN];
-
-  /* 4256: Padding to ensure struct is size BVB_BOOT_IMAGE_HEADER_SIZE
-   * bytes. This must be set to zeroes.
-   */
-  uint8_t reserved[3936];
-} __attribute__((packed)) BvbBootImageHeader;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* BVB_BOOT_IMAGE_HEADER_H_ */
diff --git a/refimpl/bvb_property.c b/refimpl/bvb_property.c
deleted file mode 100644
index 8b3ac3d..0000000
--- a/refimpl/bvb_property.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "bvb_boot_image_header.h"
-#include "bvb_util.h"
-
-const char* bvb_lookup_property(const uint8_t* image_data, size_t image_size,
-                                const char* key, size_t key_size,
-                                size_t* out_value_size) {
-  const BvbBootImageHeader *header = NULL;
-  const char* ret = NULL;
-  const uint8_t* image_end;
-  const uint8_t* prop_start;
-  const uint8_t* prop_end;
-  const uint8_t* p;
-
-  if (out_value_size != NULL)
-    *out_value_size = 0;
-
-  if (image_data == NULL) {
-    bvb_debug("image_data is NULL\n.");
-    goto out;
-  }
-
-  if (key == NULL) {
-    bvb_debug("key is NULL\n.");
-    goto out;
-  }
-
-  if (image_size < sizeof(BvbBootImageHeader)) {
-    bvb_debug("Length is smaller than header.\n");
-    goto out;
-  }
-
-  // Ensure magic is correct.
-  if (bvb_memcmp(image_data, BVB_MAGIC, BVB_MAGIC_LEN) != 0) {
-    bvb_debug("Magic is incorrect.\n");
-    goto out;
-  }
-
-  if (key_size == 0)
-    key_size = bvb_strlen(key);
-
-  // Careful, not byteswapped - also ensure it's aligned properly.
-  bvb_assert_word_aligned(image_data);
-  header = (const BvbBootImageHeader *) image_data;
-  image_end = image_data + image_size;
-
-  prop_start = image_data + sizeof(BvbBootImageHeader) +
-      bvb_be64toh(header->authentication_data_block_size) +
-      bvb_be64toh(header->properties_offset);
-
-  prop_end = prop_start + bvb_be64toh(header->properties_size);
-
-  if (prop_start < image_data || prop_start > image_end ||
-      prop_end < image_data || prop_end > image_end ||
-      prop_end < prop_start) {
-    bvb_debug("Properties not inside passed-in data.\n");
-    goto out;
-  }
-
-  for (p = prop_start; p < prop_end; ) {
-    const BvbPropertyHeader *ph = (const BvbPropertyHeader *) p;
-    bvb_assert_word_aligned(ph);
-    uint64_t key_nb = bvb_be64toh(ph->key_num_bytes);
-    uint64_t value_nb = bvb_be64toh(ph->value_num_bytes);
-    uint64_t total = sizeof(BvbPropertyHeader) + 2 /* NUL bytes */
-        + key_nb + value_nb;
-    uint64_t remainder = total % 8;
-
-    if (remainder != 0)
-      total += 8 - remainder;
-
-    if (total + p < prop_start || total + p > prop_end) {
-      bvb_debug("Invalid data in properties array.\n");
-      goto out;
-    }
-    if (p[sizeof(BvbPropertyHeader) + key_nb] != 0) {
-      bvb_debug("No terminating NUL byte in key.\n");
-      goto out;
-    }
-    if (p[sizeof(BvbPropertyHeader) + key_nb + 1 + value_nb] != 0) {
-      bvb_debug("No terminating NUL byte in value.\n");
-      goto out;
-    }
-    if (key_size == key_nb) {
-      if (bvb_memcmp(p + sizeof(BvbPropertyHeader), key, key_size) == 0) {
-        ret = (const char *) (p + sizeof(BvbPropertyHeader) + key_nb + 1);
-        if (out_value_size != NULL)
-          *out_value_size = value_nb;
-        goto out;
-      }
-    }
-    p += total;
-  }
-
-out:
-  return ret;
-}
-
-int bvb_lookup_property_uint64(const uint8_t* image_data, size_t image_size,
-                               const char* key, size_t key_size,
-                               uint64_t* out_value) {
-  const char *value;
-  int ret = 0;
-  uint64_t parsed_val;
-  int base;
-  int n;
-
-  value = bvb_lookup_property(image_data, image_size, key, key_size, NULL);
-  if (value == NULL)
-    goto out;
-
-  base = 10;
-  if (bvb_memcmp(value, "0x", 2) == 0) {
-    base = 16;
-    value += 2;
-  }
-
-  parsed_val = 0;
-  for (n = 0; value[n] != '\0'; n++) {
-    int c = value[n];
-    int digit;
-
-    parsed_val *= base;
-
-    switch (base) {
-      case 10:
-        if (c >= '0' && c <= '9') {
-          digit = c - '0';
-        } else {
-          bvb_debug("Invalid digit.\n");
-          goto out;
-        }
-        break;
-
-      case 16:
-        if (c >= '0' && c <= '9') {
-          digit = c - '0';
-        } else if (c >= 'a' && c <= 'f') {
-          digit = c - 'a' + 10;
-        } else if (c >= 'A' && c <= 'F') {
-          digit = c - 'A' + 10;
-        } else {
-          bvb_debug("Invalid digit.\n");
-          goto out;
-        }
-        break;
-
-      default:
-        goto out;
-    }
-
-    parsed_val += digit;
-  }
-
-  ret = 1;
-  if (out_value != NULL)
-    *out_value = parsed_val;
-
-out:
-  return ret;
-}
diff --git a/refimpl/bvb_property.h b/refimpl/bvb_property.h
deleted file mode 100644
index d105e3e..0000000
--- a/refimpl/bvb_property.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#if !defined (BVB_INSIDE_BVB_REFIMPL_H) && !defined (BVB_REFIMPL_COMPILATION)
-#error "Never include this file directly, include bvb_refimpl.h instead."
-#endif
-
-#ifndef BVB_PROPERTY_H_
-#define BVB_PROPERTY_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "bvb_boot_image_header.h"
-
-/* Convenience function for looking up the value for a property with
- * name |key| in a Brillo boot image. If |key| is NUL-terminated,
- * |key_size| may be set to 0.
- *
- * The |image_data| parameter must be a pointer to a Brillo Boot Image
- * of size |image_size|.
- *
- * This function returns a pointer to the value inside the passed-in
- * image or NULL if not found. Note that the value is always
- * guaranteed to be followed by a NUL byte.
- *
- * If the value was found and |out_value_size| is not NULL, the size
- * of the value is returned there.
- *
- * This function is O(n) in number of properties so if you need to
- * look up a lot of values, you may want to build a more efficient
- * lookup-table by manually walking all properties yourself.
- *
- * Before using this function, you MUST verify |image_data| with
- * bvb_verify_boot_image() and reject it unless it's signed by a known
- * good public key.
- */
-const char* bvb_lookup_property(const uint8_t* image_data, size_t image_size,
-                                const char* key, size_t key_size,
-                                size_t* out_value_size);
-
-/* Like bvb_lookup_property() but parses the value as an unsigned
- * 64-bit integer. Both decimal and hexadecimal representations
- * (e.g. "0x2a") are supported. Returns 0 on failure and non-zero on
- * success. On success, the parsed value is returned in |out_value|.
- */
-int bvb_lookup_property_uint64(const uint8_t* image_data, size_t image_size,
-                               const char* key, size_t key_size,
-                               uint64_t* out_value);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* BVB_PROPERTY_H_ */
diff --git a/refimpl/bvb_refimpl.h b/refimpl/bvb_refimpl.h
deleted file mode 100644
index e65ad09..0000000
--- a/refimpl/bvb_refimpl.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef BVB_REFIMPL_H_
-#define BVB_REFIMPL_H_
-
-/* The BVB_INSIDE_BVB_REFIMPL_H preprocessor symbol is used to enforce
- * library users to include only this file. All public interfaces, and
- * only public interfaces, must be included here.
- */
-
-#define BVB_INSIDE_BVB_REFIMPL_H
-#include "bvb_boot_image_header.h"
-#include "bvb_property.h"
-#include "bvb_sysdeps.h"
-#include "bvb_util.h"
-#include "bvb_verify.h"
-#undef BVB_INSIDE_BVB_REFIMPL_H
-
-#endif  /* BVB_REFIMPL_H_ */
diff --git a/refimpl/bvb_rsa.c b/refimpl/bvb_rsa.c
deleted file mode 100644
index 50517b8..0000000
--- a/refimpl/bvb_rsa.c
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* Implementation of RSA signature verification which uses a pre-processed
- * key for computation. The code extends Android's RSA verification code to
- * support multiple RSA key lengths and hash digest algorithms.
- */
-
-#include "bvb_rsa.h"
-#include "bvb_sha.h"
-#include "bvb_util.h"
-
-typedef struct Key {
-  unsigned int len;  /* Length of n[] in number of uint32_t */
-  uint32_t n0inv;    /* -1 / n[0] mod 2^32 */
-  uint32_t* n;       /* modulus as little endian array */
-  uint32_t* rr;      /* R^2 as little endian array */
-} Key;
-
-Key* parse_key_data(const uint8_t* data, size_t length) {
-  BvbRSAPublicKeyHeader h;
-  Key* key = NULL;
-  size_t expected_length;
-  unsigned int i;
-  const uint8_t* n;
-  const uint8_t *rr;
-
-  bvb_rsa_public_key_header_to_host_byte_order(
-      (const BvbRSAPublicKeyHeader *) data, &h);
-
-  if (!(h.key_num_bits == 2048 ||
-        h.key_num_bits == 4096 ||
-        h.key_num_bits == 8192)) {
-    bvb_debug("Unexpected key length.\n");
-    goto fail;
-  }
-
-  expected_length = sizeof(BvbRSAPublicKeyHeader) + 2*h.key_num_bits/8;
-  if (length != expected_length) {
-    bvb_debug("Key does not match expected length.\n");
-    goto fail;
-  }
-
-  n = data + sizeof(BvbRSAPublicKeyHeader);
-  rr = data + sizeof(BvbRSAPublicKeyHeader) + h.key_num_bits/8;
-
-  // Store n and rr following the key header so we only have to do one
-  // allocation.
-  key = (Key *) (bvb_malloc(sizeof(Key) + 2*h.key_num_bits/8));
-  if (key == NULL)
-    goto fail;
-
-  key->len = h.key_num_bits/32;
-  key->n0inv = h.n0inv;
-  key->n =  (uint32_t *) (key + 1);  // Skip ahead sizeof(Key) bytes.
-  key->rr = key->n + key->len;
-
-  // Crypto-code below (modpowF4() and friends) expects the key in
-  // little-endian format (rather than the format we're storing the
-  // key in), so convert it.
-  for (i = 0; i < key->len; i++) {
-    key->n[i] = bvb_be32toh(((uint32_t *) n)[key->len - i - 1]);
-    key->rr[i] = bvb_be32toh(((uint32_t *) rr)[key->len - i - 1]);
-  }
-  return key;
-
-fail:
-  if (key != NULL)
-    bvb_free(key);
-  return NULL;
-}
-
-void free_parsed_key(Key* key) {
-  bvb_free(key);
-}
-
-/* a[] -= mod */
-static void subM(const Key* key, uint32_t* a) {
-  int64_t A = 0;
-  uint32_t i;
-  for (i = 0; i < key->len; ++i) {
-    A += (uint64_t)a[i] - key->n[i];
-    a[i] = (uint32_t)A;
-    A >>= 32;
-  }
-}
-
-/* return a[] >= mod */
-static int geM(const Key* key, uint32_t *a) {
-  uint32_t i;
-  for (i = key->len; i;) {
-    --i;
-    if (a[i] < key->n[i]) return 0;
-    if (a[i] > key->n[i]) return 1;
-  }
-  return 1;  /* equal */
- }
-
-/* montgomery c[] += a * b[] / R % mod */
-static void montMulAdd(const Key* key,
-                       uint32_t* c,
-                       const uint32_t a,
-                       const uint32_t* b) {
-  uint64_t A = (uint64_t)a * b[0] + c[0];
-  uint32_t d0 = (uint32_t)A * key->n0inv;
-  uint64_t B = (uint64_t)d0 * key->n[0] + (uint32_t)A;
-  uint32_t i;
-
-  for (i = 1; i < key->len; ++i) {
-    A = (A >> 32) + (uint64_t)a * b[i] + c[i];
-    B = (B >> 32) + (uint64_t)d0 * key->n[i] + (uint32_t)A;
-    c[i - 1] = (uint32_t)B;
-  }
-
-  A = (A >> 32) + (B >> 32);
-
-  c[i - 1] = (uint32_t)A;
-
-  if (A >> 32) {
-    subM(key, c);
-  }
-}
-
-/* montgomery c[] = a[] * b[] / R % mod */
-static void montMul(const Key* key,
-                    uint32_t* c,
-                    uint32_t* a,
-                    uint32_t* b) {
-  uint32_t i;
-  for (i = 0; i < key->len; ++i) {
-    c[i] = 0;
-  }
-  for (i = 0; i < key->len; ++i) {
-    montMulAdd(key, c, a[i], b);
-  }
-}
-
-/* In-place public exponentiation. (65537}
- * Input and output big-endian byte array in inout.
- */
-static void modpowF4(const Key *key,
-                     uint8_t* inout) {
-  uint32_t* a = (uint32_t*) bvb_malloc(key->len * sizeof(uint32_t));
-  uint32_t* aR = (uint32_t*) bvb_malloc(key->len * sizeof(uint32_t));
-  uint32_t* aaR = (uint32_t*) bvb_malloc(key->len * sizeof(uint32_t));
-  if (a == NULL || aR == NULL || aaR == NULL)
-    goto out;
-
-  uint32_t* aaa = aaR;  /* Re-use location. */
-  int i;
-
-  /* Convert from big endian byte array to little endian word array. */
-  for (i = 0; i < (int)key->len; ++i) {
-    uint32_t tmp =
-        (inout[((key->len - 1 - i) * 4) + 0] << 24) |
-        (inout[((key->len - 1 - i) * 4) + 1] << 16) |
-        (inout[((key->len - 1 - i) * 4) + 2] << 8) |
-        (inout[((key->len - 1 - i) * 4) + 3] << 0);
-    a[i] = tmp;
-  }
-
-  montMul(key, aR, a, key->rr);  /* aR = a * RR / R mod M   */
-  for (i = 0; i < 16; i+=2) {
-    montMul(key, aaR, aR, aR);  /* aaR = aR * aR / R mod M */
-    montMul(key, aR, aaR, aaR);  /* aR = aaR * aaR / R mod M */
-  }
-  montMul(key, aaa, aR, a);  /* aaa = aR * a / R mod M */
-
-
-  /* Make sure aaa < mod; aaa is at most 1x mod too large. */
-  if (geM(key, aaa)) {
-    subM(key, aaa);
-  }
-
-  /* Convert to bigendian byte array */
-  for (i = (int)key->len - 1; i >= 0; --i) {
-    uint32_t tmp = aaa[i];
-    *inout++ = (uint8_t)(tmp >> 24);
-    *inout++ = (uint8_t)(tmp >> 16);
-    *inout++ = (uint8_t)(tmp >>  8);
-    *inout++ = (uint8_t)(tmp >>  0);
-  }
-
-out:
-  if (a != NULL)
-    bvb_free(a);
-  if (aR != NULL)
-    bvb_free(aR);
-  if (aaR != NULL)
-    bvb_free(aaR);
-}
-
-/* Verify a RSA PKCS1.5 signature against an expected hash.
- * Returns 0 on failure, 1 on success.
- */
-int bvb_rsa_verify(const uint8_t* key, size_t key_num_bytes,
-                   const uint8_t* sig, size_t sig_num_bytes,
-                   const uint8_t* hash, size_t hash_num_bytes,
-                   const uint8_t* padding, size_t padding_num_bytes) {
-  uint8_t* buf = NULL;
-  Key* parsed_key = NULL;
-  int success = 0;
-
-  if (key == NULL || sig == NULL || hash == NULL || padding == NULL) {
-    bvb_debug("Invalid input.\n");
-    goto out;
-  }
-
-  parsed_key = parse_key_data(key, key_num_bytes);
-  if (parsed_key == NULL) {
-    bvb_debug("Error parsing key.\n");
-    goto out;
-  }
-
-  if (sig_num_bytes != (parsed_key->len * sizeof(uint32_t))) {
-    bvb_debug("Signature length does not match key length.\n");
-    goto out;
-  }
-
-  if (padding_num_bytes != sig_num_bytes - hash_num_bytes) {
-    bvb_debug("Padding length does not match hash and signature lengths.\n");
-    goto out;
-  }
-
-  buf = (uint8_t *) bvb_malloc(sig_num_bytes);
-  if (buf == NULL) {
-    bvb_debug("Error allocating %d bytes.\n", (int) sig_num_bytes);
-    goto out;
-  }
-  bvb_memcpy(buf, sig, sig_num_bytes);
-
-  modpowF4(parsed_key, buf);
-
-  /* Check padding bytes.
-   *
-   * Even though there are probably no timing issues here, we use
-   * bvb_safe_memcmp() just to be on the safe side.
-   */
-  if (bvb_safe_memcmp(buf, padding, padding_num_bytes)) {
-    bvb_debug("Padding check failed.\n");
-    goto out;
-  }
-
-  /* Check hash. */
-  if (bvb_safe_memcmp(buf + padding_num_bytes, hash, hash_num_bytes)) {
-    bvb_debug("Hash check failed.\n");
-    goto out;
-  }
-
-  success = 1;
-
-out:
-  if (parsed_key != NULL)
-    free_parsed_key(parsed_key);
-  if (buf != NULL)
-    bvb_free(buf);
-  return success;
-}
diff --git a/refimpl/bvb_rsa.h b/refimpl/bvb_rsa.h
deleted file mode 100644
index 417ee35..0000000
--- a/refimpl/bvb_rsa.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifdef BVB_INSIDE_BVB_REFIMPL_H
-#error "You can't include bvb_rsa.h in the public header bvb_refimpl.h."
-#endif
-
-#ifndef BVB_REFIMPL_COMPILATION
-#error "Never include this file, it may only be used from internal bvb code."
-#endif
-
-#ifndef BVB_RSA_H_
-#define BVB_RSA_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "bvb_sysdeps.h"
-
-/* Size of a RSA-2048 signature. */
-#define BVB_RSA2048_NUM_BYTES 256
-
-/* Size of a RSA-4096 signature. */
-#define BVB_RSA4096_NUM_BYTES 512
-
-/* Size of a RSA-8192 signature. */
-#define BVB_RSA8192_NUM_BYTES 1024
-
-/* Using the key given by |key_header|, verify a RSA signature |sig|
- * of length |sig_num_bytes| against an expected |hash| of length
- * |hash_num_bytes|. The padding to expect must be passed in using
- * |padding| of length |padding_num_bytes|.
- *
- * The data in |key| must match the format defined in
- * |BvbRSAPublicKeyHeader|, including the two large numbers
- * following. The |key_num_bytes| must be the size of the entire
- * serialized key.
- *
- * Returns zero if verification fails, non-zero otherwise.
- */
-int bvb_rsa_verify(const uint8_t* key, size_t key_num_bytes,
-                   const uint8_t* sig, size_t sig_num_bytes,
-                   const uint8_t* hash, size_t hash_num_bytes,
-                   const uint8_t* padding, size_t padding_num_bytes);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* BVB_RSA_H_ */
diff --git a/refimpl/bvb_sha.h b/refimpl/bvb_sha.h
deleted file mode 100644
index 8f8efd7..0000000
--- a/refimpl/bvb_sha.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#ifdef BVB_INSIDE_BVB_REFIMPL_H
-#error "You can't include bvb_sha.h in the public header bvb_refimpl.h."
-#endif
-
-#ifndef BVB_REFIMPL_COMPILATION
-#error "Never include this file, it may only be used from internal bvb code."
-#endif
-
-#ifndef BVB_SHA_H_
-#define BVB_SHA_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "bvb_sysdeps.h"
-
-/* Size in bytes of a SHA-256 digest. */
-#define BVB_SHA256_DIGEST_SIZE 32
-
-/* Block size in bytes of a SHA-256 digest. */
-#define BVB_SHA256_BLOCK_SIZE 64
-
-/* Size in bytes of a SHA-512 digest. */
-#define BVB_SHA512_DIGEST_SIZE 64
-
-/* Block size in bytes of a SHA-512 digest. */
-#define BVB_SHA512_BLOCK_SIZE 128
-
-/* Data structure used for SHA-256. */
-typedef struct {
-  uint32_t h[8];
-  uint32_t tot_len;
-  uint32_t len;
-  uint8_t block[2 * BVB_SHA256_BLOCK_SIZE];
-  uint8_t buf[BVB_SHA256_DIGEST_SIZE];  /* Used for storing the final digest. */
-} BvbSHA256Ctx;
-
-/* Data structure used for SHA-512. */
-typedef struct {
-  uint64_t h[8];
-  uint32_t tot_len;
-  uint32_t len;
-  uint8_t block[2 * BVB_SHA512_BLOCK_SIZE];
-  uint8_t buf[BVB_SHA512_DIGEST_SIZE];  /* Used for storing the final digest. */
-} BvbSHA512Ctx;
-
-/* Initializes the SHA-256 context. */
-void bvb_sha256_init(BvbSHA256Ctx* ctx);
-
-/* Updates the SHA-256 context with |len| bytes from |data|. */
-void bvb_sha256_update(BvbSHA256Ctx* ctx, const uint8_t* data, uint32_t len);
-
-/* Returns the SHA-256 digest. */
-uint8_t* bvb_sha256_final(BvbSHA256Ctx* ctx);
-
-/* Initializes the SHA-512 context. */
-void bvb_sha512_init(BvbSHA512Ctx* ctx);
-
-/* Updates the SHA-512 context with |len| bytes from |data|. */
-void bvb_sha512_update(BvbSHA512Ctx* ctx, const uint8_t* data, uint32_t len);
-
-/* Returns the SHA-512 digest. */
-uint8_t* bvb_sha512_final(BvbSHA512Ctx* ctx);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* BVB_SHA_H_ */
diff --git a/refimpl/bvb_sha256.c b/refimpl/bvb_sha256.c
deleted file mode 100644
index 53e5f6b..0000000
--- a/refimpl/bvb_sha256.c
+++ /dev/null
@@ -1,310 +0,0 @@
-/* SHA-256 and SHA-512 implementation based on code by Oliver Gay
- * <olivier.gay@a3.epfl.ch> under a BSD-style license. See below.
- */
-
-/*
- * FIPS 180-2 SHA-224/256/384/512 implementation
- * Last update: 02/02/2007
- * Issue date:  04/30/2005
- *
- * Copyright (C) 2005, 2007 Olivier Gay <olivier.gay@a3.epfl.ch>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "bvb_sha.h"
-
-#define SHFR(x, n)    (x >> n)
-#define ROTR(x, n)   ((x >> n) | (x << ((sizeof(x) << 3) - n)))
-#define ROTL(x, n)   ((x << n) | (x >> ((sizeof(x) << 3) - n)))
-#define CH(x, y, z)  ((x & y) ^ (~x & z))
-#define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
-
-#define SHA256_F1(x) (ROTR(x,  2) ^ ROTR(x, 13) ^ ROTR(x, 22))
-#define SHA256_F2(x) (ROTR(x,  6) ^ ROTR(x, 11) ^ ROTR(x, 25))
-#define SHA256_F3(x) (ROTR(x,  7) ^ ROTR(x, 18) ^ SHFR(x,  3))
-#define SHA256_F4(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHFR(x, 10))
-
-#define UNPACK32(x, str)                        \
-  {                                             \
-    *((str) + 3) = (uint8_t) ((x)      );       \
-    *((str) + 2) = (uint8_t) ((x) >>  8);       \
-    *((str) + 1) = (uint8_t) ((x) >> 16);       \
-    *((str) + 0) = (uint8_t) ((x) >> 24);       \
-  }
-
-#define PACK32(str, x)                          \
-  {                                             \
-    *(x) =   ((uint32_t) *((str) + 3)      )    \
-        | ((uint32_t) *((str) + 2) <<  8)       \
-        | ((uint32_t) *((str) + 1) << 16)       \
-        | ((uint32_t) *((str) + 0) << 24);      \
-  }
-
-/* Macros used for loops unrolling */
-
-#define SHA256_SCR(i)                         \
-  {                                           \
-    w[i] =  SHA256_F4(w[i -  2]) + w[i -  7]  \
-        + SHA256_F3(w[i - 15]) + w[i - 16];   \
-  }
-
-#define SHA256_EXP(a, b, c, d, e, f, g, h, j)               \
-  {                                                         \
-    t1 = wv[h] + SHA256_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \
-        + sha256_k[j] + w[j];                               \
-    t2 = SHA256_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]);       \
-    wv[d] += t1;                                            \
-    wv[h] = t1 + t2;                                        \
-  }
-
-static const uint32_t sha256_h0[8] = {
-  0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
-  0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19};
-
-static const uint32_t sha256_k[64] = {
-  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
-  0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
-  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
-  0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
-  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
-  0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
-  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
-  0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
-  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
-  0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
-  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
-  0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
-  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
-  0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
-  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
-  0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2};
-
-
-/* SHA-256 implementation */
-void bvb_sha256_init(BvbSHA256Ctx *ctx) {
-#ifndef UNROLL_LOOPS
-    int i;
-    for (i = 0; i < 8; i++) {
-        ctx->h[i] = sha256_h0[i];
-    }
-#else
-    ctx->h[0] = sha256_h0[0]; ctx->h[1] = sha256_h0[1];
-    ctx->h[2] = sha256_h0[2]; ctx->h[3] = sha256_h0[3];
-    ctx->h[4] = sha256_h0[4]; ctx->h[5] = sha256_h0[5];
-    ctx->h[6] = sha256_h0[6]; ctx->h[7] = sha256_h0[7];
-#endif /* !UNROLL_LOOPS */
-
-    ctx->len = 0;
-    ctx->tot_len = 0;
-}
-
-
-static void SHA256_transform(BvbSHA256Ctx* ctx, const uint8_t* message,
-                             unsigned int block_nb) {
-  uint32_t w[64];
-  uint32_t wv[8];
-  uint32_t t1, t2;
-  const unsigned char *sub_block;
-  int i;
-
-#ifndef UNROLL_LOOPS
-  int j;
-#endif
-
-  for (i = 0; i < (int) block_nb; i++) {
-    sub_block = message + (i << 6);
-
-#ifndef UNROLL_LOOPS
-    for (j = 0; j < 16; j++) {
-      PACK32(&sub_block[j << 2], &w[j]);
-    }
-
-    for (j = 16; j < 64; j++) {
-      SHA256_SCR(j);
-    }
-
-    for (j = 0; j < 8; j++) {
-      wv[j] = ctx->h[j];
-    }
-
-    for (j = 0; j < 64; j++) {
-      t1 = wv[7] + SHA256_F2(wv[4]) + CH(wv[4], wv[5], wv[6])
-          + sha256_k[j] + w[j];
-      t2 = SHA256_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]);
-      wv[7] = wv[6];
-      wv[6] = wv[5];
-      wv[5] = wv[4];
-      wv[4] = wv[3] + t1;
-      wv[3] = wv[2];
-      wv[2] = wv[1];
-      wv[1] = wv[0];
-      wv[0] = t1 + t2;
-    }
-
-    for (j = 0; j < 8; j++) {
-      ctx->h[j] += wv[j];
-    }
-#else
-    PACK32(&sub_block[ 0], &w[ 0]); PACK32(&sub_block[ 4], &w[ 1]);
-    PACK32(&sub_block[ 8], &w[ 2]); PACK32(&sub_block[12], &w[ 3]);
-    PACK32(&sub_block[16], &w[ 4]); PACK32(&sub_block[20], &w[ 5]);
-    PACK32(&sub_block[24], &w[ 6]); PACK32(&sub_block[28], &w[ 7]);
-    PACK32(&sub_block[32], &w[ 8]); PACK32(&sub_block[36], &w[ 9]);
-    PACK32(&sub_block[40], &w[10]); PACK32(&sub_block[44], &w[11]);
-    PACK32(&sub_block[48], &w[12]); PACK32(&sub_block[52], &w[13]);
-    PACK32(&sub_block[56], &w[14]); PACK32(&sub_block[60], &w[15]);
-
-    SHA256_SCR(16); SHA256_SCR(17); SHA256_SCR(18); SHA256_SCR(19);
-    SHA256_SCR(20); SHA256_SCR(21); SHA256_SCR(22); SHA256_SCR(23);
-    SHA256_SCR(24); SHA256_SCR(25); SHA256_SCR(26); SHA256_SCR(27);
-    SHA256_SCR(28); SHA256_SCR(29); SHA256_SCR(30); SHA256_SCR(31);
-    SHA256_SCR(32); SHA256_SCR(33); SHA256_SCR(34); SHA256_SCR(35);
-    SHA256_SCR(36); SHA256_SCR(37); SHA256_SCR(38); SHA256_SCR(39);
-    SHA256_SCR(40); SHA256_SCR(41); SHA256_SCR(42); SHA256_SCR(43);
-    SHA256_SCR(44); SHA256_SCR(45); SHA256_SCR(46); SHA256_SCR(47);
-    SHA256_SCR(48); SHA256_SCR(49); SHA256_SCR(50); SHA256_SCR(51);
-    SHA256_SCR(52); SHA256_SCR(53); SHA256_SCR(54); SHA256_SCR(55);
-    SHA256_SCR(56); SHA256_SCR(57); SHA256_SCR(58); SHA256_SCR(59);
-    SHA256_SCR(60); SHA256_SCR(61); SHA256_SCR(62); SHA256_SCR(63);
-
-    wv[0] = ctx->h[0]; wv[1] = ctx->h[1];
-    wv[2] = ctx->h[2]; wv[3] = ctx->h[3];
-    wv[4] = ctx->h[4]; wv[5] = ctx->h[5];
-    wv[6] = ctx->h[6]; wv[7] = ctx->h[7];
-
-    SHA256_EXP(0,1,2,3,4,5,6,7, 0); SHA256_EXP(7,0,1,2,3,4,5,6, 1);
-    SHA256_EXP(6,7,0,1,2,3,4,5, 2); SHA256_EXP(5,6,7,0,1,2,3,4, 3);
-    SHA256_EXP(4,5,6,7,0,1,2,3, 4); SHA256_EXP(3,4,5,6,7,0,1,2, 5);
-    SHA256_EXP(2,3,4,5,6,7,0,1, 6); SHA256_EXP(1,2,3,4,5,6,7,0, 7);
-    SHA256_EXP(0,1,2,3,4,5,6,7, 8); SHA256_EXP(7,0,1,2,3,4,5,6, 9);
-    SHA256_EXP(6,7,0,1,2,3,4,5,10); SHA256_EXP(5,6,7,0,1,2,3,4,11);
-    SHA256_EXP(4,5,6,7,0,1,2,3,12); SHA256_EXP(3,4,5,6,7,0,1,2,13);
-    SHA256_EXP(2,3,4,5,6,7,0,1,14); SHA256_EXP(1,2,3,4,5,6,7,0,15);
-    SHA256_EXP(0,1,2,3,4,5,6,7,16); SHA256_EXP(7,0,1,2,3,4,5,6,17);
-    SHA256_EXP(6,7,0,1,2,3,4,5,18); SHA256_EXP(5,6,7,0,1,2,3,4,19);
-    SHA256_EXP(4,5,6,7,0,1,2,3,20); SHA256_EXP(3,4,5,6,7,0,1,2,21);
-    SHA256_EXP(2,3,4,5,6,7,0,1,22); SHA256_EXP(1,2,3,4,5,6,7,0,23);
-    SHA256_EXP(0,1,2,3,4,5,6,7,24); SHA256_EXP(7,0,1,2,3,4,5,6,25);
-    SHA256_EXP(6,7,0,1,2,3,4,5,26); SHA256_EXP(5,6,7,0,1,2,3,4,27);
-    SHA256_EXP(4,5,6,7,0,1,2,3,28); SHA256_EXP(3,4,5,6,7,0,1,2,29);
-    SHA256_EXP(2,3,4,5,6,7,0,1,30); SHA256_EXP(1,2,3,4,5,6,7,0,31);
-    SHA256_EXP(0,1,2,3,4,5,6,7,32); SHA256_EXP(7,0,1,2,3,4,5,6,33);
-    SHA256_EXP(6,7,0,1,2,3,4,5,34); SHA256_EXP(5,6,7,0,1,2,3,4,35);
-    SHA256_EXP(4,5,6,7,0,1,2,3,36); SHA256_EXP(3,4,5,6,7,0,1,2,37);
-    SHA256_EXP(2,3,4,5,6,7,0,1,38); SHA256_EXP(1,2,3,4,5,6,7,0,39);
-    SHA256_EXP(0,1,2,3,4,5,6,7,40); SHA256_EXP(7,0,1,2,3,4,5,6,41);
-    SHA256_EXP(6,7,0,1,2,3,4,5,42); SHA256_EXP(5,6,7,0,1,2,3,4,43);
-    SHA256_EXP(4,5,6,7,0,1,2,3,44); SHA256_EXP(3,4,5,6,7,0,1,2,45);
-    SHA256_EXP(2,3,4,5,6,7,0,1,46); SHA256_EXP(1,2,3,4,5,6,7,0,47);
-    SHA256_EXP(0,1,2,3,4,5,6,7,48); SHA256_EXP(7,0,1,2,3,4,5,6,49);
-    SHA256_EXP(6,7,0,1,2,3,4,5,50); SHA256_EXP(5,6,7,0,1,2,3,4,51);
-    SHA256_EXP(4,5,6,7,0,1,2,3,52); SHA256_EXP(3,4,5,6,7,0,1,2,53);
-    SHA256_EXP(2,3,4,5,6,7,0,1,54); SHA256_EXP(1,2,3,4,5,6,7,0,55);
-    SHA256_EXP(0,1,2,3,4,5,6,7,56); SHA256_EXP(7,0,1,2,3,4,5,6,57);
-    SHA256_EXP(6,7,0,1,2,3,4,5,58); SHA256_EXP(5,6,7,0,1,2,3,4,59);
-    SHA256_EXP(4,5,6,7,0,1,2,3,60); SHA256_EXP(3,4,5,6,7,0,1,2,61);
-    SHA256_EXP(2,3,4,5,6,7,0,1,62); SHA256_EXP(1,2,3,4,5,6,7,0,63);
-
-    ctx->h[0] += wv[0]; ctx->h[1] += wv[1];
-    ctx->h[2] += wv[2]; ctx->h[3] += wv[3];
-    ctx->h[4] += wv[4]; ctx->h[5] += wv[5];
-    ctx->h[6] += wv[6]; ctx->h[7] += wv[7];
-#endif /* !UNROLL_LOOPS */
-  }
-}
-
-
-
-void bvb_sha256_update(BvbSHA256Ctx* ctx, const uint8_t* data, uint32_t len) {
-    unsigned int block_nb;
-    unsigned int new_len, rem_len, tmp_len;
-    const uint8_t *shifted_data;
-
-    tmp_len = BVB_SHA256_BLOCK_SIZE - ctx->len;
-    rem_len = len < tmp_len ? len : tmp_len;
-
-    bvb_memcpy(&ctx->block[ctx->len], data, rem_len);
-
-    if (ctx->len + len < BVB_SHA256_BLOCK_SIZE) {
-        ctx->len += len;
-        return;
-    }
-
-    new_len = len - rem_len;
-    block_nb = new_len / BVB_SHA256_BLOCK_SIZE;
-
-    shifted_data = data + rem_len;
-
-    SHA256_transform(ctx, ctx->block, 1);
-    SHA256_transform(ctx, shifted_data, block_nb);
-
-    rem_len = new_len % BVB_SHA256_BLOCK_SIZE;
-
-    bvb_memcpy(ctx->block, &shifted_data[block_nb << 6],
-               rem_len);
-
-    ctx->len = rem_len;
-    ctx->tot_len += (block_nb + 1) << 6;
-}
-
-uint8_t* bvb_sha256_final(BvbSHA256Ctx* ctx) {
-    unsigned int block_nb;
-    unsigned int pm_len;
-    unsigned int len_b;
-#ifndef UNROLL_LOOPS
-    int i;
-#endif
-
-    block_nb = (1 + ((BVB_SHA256_BLOCK_SIZE - 9)
-                     < (ctx->len % BVB_SHA256_BLOCK_SIZE)));
-
-    len_b = (ctx->tot_len + ctx->len) << 3;
-    pm_len = block_nb << 6;
-
-    bvb_memset(ctx->block + ctx->len, 0, pm_len - ctx->len);
-    ctx->block[ctx->len] = 0x80;
-    UNPACK32(len_b, ctx->block + pm_len - 4);
-
-    SHA256_transform(ctx, ctx->block, block_nb);
-
-#ifndef UNROLL_LOOPS
-    for (i = 0 ; i < 8; i++) {
-        UNPACK32(ctx->h[i], &ctx->buf[i << 2]);
-    }
-#else
-   UNPACK32(ctx->h[0], &ctx->buf[ 0]);
-   UNPACK32(ctx->h[1], &ctx->buf[ 4]);
-   UNPACK32(ctx->h[2], &ctx->buf[ 8]);
-   UNPACK32(ctx->h[3], &ctx->buf[12]);
-   UNPACK32(ctx->h[4], &ctx->buf[16]);
-   UNPACK32(ctx->h[5], &ctx->buf[20]);
-   UNPACK32(ctx->h[6], &ctx->buf[24]);
-   UNPACK32(ctx->h[7], &ctx->buf[28]);
-#endif /* !UNROLL_LOOPS */
-
-   return ctx->buf;
-}
diff --git a/refimpl/bvb_sha512.c b/refimpl/bvb_sha512.c
deleted file mode 100644
index 0f1b385..0000000
--- a/refimpl/bvb_sha512.c
+++ /dev/null
@@ -1,333 +0,0 @@
-/* SHA-256 and SHA-512 implementation based on code by Oliver Gay
- * <olivier.gay@a3.epfl.ch> under a BSD-style license. See below.
- */
-
-/*
- * FIPS 180-2 SHA-224/256/384/512 implementation
- * Last update: 02/02/2007
- * Issue date:  04/30/2005
- *
- * Copyright (C) 2005, 2007 Olivier Gay <olivier.gay@a3.epfl.ch>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "bvb_sha.h"
-
-#define SHFR(x, n)    (x >> n)
-#define ROTR(x, n)   ((x >> n) | (x << ((sizeof(x) << 3) - n)))
-#define ROTL(x, n)   ((x << n) | (x >> ((sizeof(x) << 3) - n)))
-#define CH(x, y, z)  ((x & y) ^ (~x & z))
-#define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
-
-#define SHA512_F1(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
-#define SHA512_F2(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
-#define SHA512_F3(x) (ROTR(x,  1) ^ ROTR(x,  8) ^ SHFR(x,  7))
-#define SHA512_F4(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHFR(x,  6))
-
-#define UNPACK32(x, str)                        \
-  {                                             \
-    *((str) + 3) = (uint8_t) ((x)      );       \
-    *((str) + 2) = (uint8_t) ((x) >>  8);       \
-    *((str) + 1) = (uint8_t) ((x) >> 16);       \
-    *((str) + 0) = (uint8_t) ((x) >> 24);       \
-  }
-
-#define UNPACK64(x, str)                          \
-  {                                               \
-    *((str) + 7) = (uint8_t) x;                   \
-    *((str) + 6) = (uint8_t) ((uint64_t)x >> 8);  \
-    *((str) + 5) = (uint8_t) ((uint64_t)x >> 16); \
-    *((str) + 4) = (uint8_t) ((uint64_t)x >> 24); \
-    *((str) + 3) = (uint8_t) ((uint64_t)x >> 32); \
-    *((str) + 2) = (uint8_t) ((uint64_t)x >> 40); \
-    *((str) + 1) = (uint8_t) ((uint64_t)x >> 48); \
-    *((str) + 0) = (uint8_t) ((uint64_t)x >> 56); \
-  }
-
-#define PACK64(str, x)                          \
-  {                                             \
-    *(x) =   ((uint64_t) *((str) + 7)      )    \
-        | ((uint64_t) *((str) + 6) <<  8)       \
-        | ((uint64_t) *((str) + 5) << 16)       \
-        | ((uint64_t) *((str) + 4) << 24)       \
-        | ((uint64_t) *((str) + 3) << 32)       \
-        | ((uint64_t) *((str) + 2) << 40)       \
-        | ((uint64_t) *((str) + 1) << 48)       \
-        | ((uint64_t) *((str) + 0) << 56);      \
-  }
-
-/* Macros used for loops unrolling */
-
-#define SHA512_SCR(i)                         \
-  {                                           \
-    w[i] =  SHA512_F4(w[i -  2]) + w[i -  7]  \
-        + SHA512_F3(w[i - 15]) + w[i - 16];   \
-  }
-
-#define SHA512_EXP(a, b, c, d, e, f, g ,h, j)               \
-  {                                                         \
-    t1 = wv[h] + SHA512_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \
-        + sha512_k[j] + w[j];                               \
-    t2 = SHA512_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]);       \
-    wv[d] += t1;                                            \
-    wv[h] = t1 + t2;                                        \
-  }
-
-static const uint64_t sha512_h0[8] = {
-  0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
-  0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
-  0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
-  0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL};
-
-static const uint64_t sha512_k[80] = {
-  0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
-  0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
-  0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
-  0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
-  0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
-  0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
-  0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
-  0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
-  0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
-  0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
-  0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
-  0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
-  0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
-  0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
-  0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
-  0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
-  0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
-  0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
-  0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
-  0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
-  0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
-  0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
-  0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
-  0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
-  0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
-  0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
-  0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
-  0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
-  0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
-  0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
-  0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
-  0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
-  0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
-  0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
-  0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
-  0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
-  0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
-  0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
-  0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
-  0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL};
-
-
-/* SHA-512 implementation */
-
-void bvb_sha512_init(BvbSHA512Ctx *ctx) {
-#ifdef UNROLL_LOOPS_SHA512
-    ctx->h[0] = sha512_h0[0]; ctx->h[1] = sha512_h0[1];
-    ctx->h[2] = sha512_h0[2]; ctx->h[3] = sha512_h0[3];
-    ctx->h[4] = sha512_h0[4]; ctx->h[5] = sha512_h0[5];
-    ctx->h[6] = sha512_h0[6]; ctx->h[7] = sha512_h0[7];
-#else
-    int i;
-
-    for (i = 0; i < 8; i++)
-        ctx->h[i] = sha512_h0[i];
-#endif /* UNROLL_LOOPS_SHA512 */
-
-    ctx->len = 0;
-    ctx->tot_len = 0;
-}
-
-
-static void SHA512_transform(BvbSHA512Ctx* ctx, const uint8_t* message,
-                             unsigned int block_nb) {
-  uint64_t w[80];
-  uint64_t wv[8];
-  uint64_t t1, t2;
-  const uint8_t *sub_block;
-  int i, j;
-
-  for (i = 0; i < (int) block_nb; i++) {
-    sub_block = message + (i << 7);
-
-#ifdef UNROLL_LOOPS_SHA512
-    PACK64(&sub_block[  0], &w[ 0]); PACK64(&sub_block[  8], &w[ 1]);
-    PACK64(&sub_block[ 16], &w[ 2]); PACK64(&sub_block[ 24], &w[ 3]);
-    PACK64(&sub_block[ 32], &w[ 4]); PACK64(&sub_block[ 40], &w[ 5]);
-    PACK64(&sub_block[ 48], &w[ 6]); PACK64(&sub_block[ 56], &w[ 7]);
-    PACK64(&sub_block[ 64], &w[ 8]); PACK64(&sub_block[ 72], &w[ 9]);
-    PACK64(&sub_block[ 80], &w[10]); PACK64(&sub_block[ 88], &w[11]);
-    PACK64(&sub_block[ 96], &w[12]); PACK64(&sub_block[104], &w[13]);
-    PACK64(&sub_block[112], &w[14]); PACK64(&sub_block[120], &w[15]);
-
-    SHA512_SCR(16); SHA512_SCR(17); SHA512_SCR(18); SHA512_SCR(19);
-    SHA512_SCR(20); SHA512_SCR(21); SHA512_SCR(22); SHA512_SCR(23);
-    SHA512_SCR(24); SHA512_SCR(25); SHA512_SCR(26); SHA512_SCR(27);
-    SHA512_SCR(28); SHA512_SCR(29); SHA512_SCR(30); SHA512_SCR(31);
-    SHA512_SCR(32); SHA512_SCR(33); SHA512_SCR(34); SHA512_SCR(35);
-    SHA512_SCR(36); SHA512_SCR(37); SHA512_SCR(38); SHA512_SCR(39);
-    SHA512_SCR(40); SHA512_SCR(41); SHA512_SCR(42); SHA512_SCR(43);
-    SHA512_SCR(44); SHA512_SCR(45); SHA512_SCR(46); SHA512_SCR(47);
-    SHA512_SCR(48); SHA512_SCR(49); SHA512_SCR(50); SHA512_SCR(51);
-    SHA512_SCR(52); SHA512_SCR(53); SHA512_SCR(54); SHA512_SCR(55);
-    SHA512_SCR(56); SHA512_SCR(57); SHA512_SCR(58); SHA512_SCR(59);
-    SHA512_SCR(60); SHA512_SCR(61); SHA512_SCR(62); SHA512_SCR(63);
-    SHA512_SCR(64); SHA512_SCR(65); SHA512_SCR(66); SHA512_SCR(67);
-    SHA512_SCR(68); SHA512_SCR(69); SHA512_SCR(70); SHA512_SCR(71);
-    SHA512_SCR(72); SHA512_SCR(73); SHA512_SCR(74); SHA512_SCR(75);
-    SHA512_SCR(76); SHA512_SCR(77); SHA512_SCR(78); SHA512_SCR(79);
-
-    wv[0] = ctx->h[0]; wv[1] = ctx->h[1];
-    wv[2] = ctx->h[2]; wv[3] = ctx->h[3];
-    wv[4] = ctx->h[4]; wv[5] = ctx->h[5];
-    wv[6] = ctx->h[6]; wv[7] = ctx->h[7];
-
-    j = 0;
-
-    do {
-      SHA512_EXP(0,1,2,3,4,5,6,7,j); j++;
-      SHA512_EXP(7,0,1,2,3,4,5,6,j); j++;
-      SHA512_EXP(6,7,0,1,2,3,4,5,j); j++;
-      SHA512_EXP(5,6,7,0,1,2,3,4,j); j++;
-      SHA512_EXP(4,5,6,7,0,1,2,3,j); j++;
-      SHA512_EXP(3,4,5,6,7,0,1,2,j); j++;
-      SHA512_EXP(2,3,4,5,6,7,0,1,j); j++;
-      SHA512_EXP(1,2,3,4,5,6,7,0,j); j++;
-    } while (j < 80);
-
-    ctx->h[0] += wv[0]; ctx->h[1] += wv[1];
-    ctx->h[2] += wv[2]; ctx->h[3] += wv[3];
-    ctx->h[4] += wv[4]; ctx->h[5] += wv[5];
-    ctx->h[6] += wv[6]; ctx->h[7] += wv[7];
-#else
-    for (j = 0; j < 16; j++) {
-      PACK64(&sub_block[j << 3], &w[j]);
-    }
-
-    for (j = 16; j < 80; j++) {
-      SHA512_SCR(j);
-    }
-
-    for (j = 0; j < 8; j++) {
-      wv[j] = ctx->h[j];
-    }
-
-    for (j = 0; j < 80; j++) {
-      t1 = wv[7] + SHA512_F2(wv[4]) + CH(wv[4], wv[5], wv[6])
-          + sha512_k[j] + w[j];
-      t2 = SHA512_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]);
-      wv[7] = wv[6];
-      wv[6] = wv[5];
-      wv[5] = wv[4];
-      wv[4] = wv[3] + t1;
-      wv[3] = wv[2];
-      wv[2] = wv[1];
-      wv[1] = wv[0];
-      wv[0] = t1 + t2;
-    }
-
-    for (j = 0; j < 8; j++)
-      ctx->h[j] += wv[j];
-#endif /* UNROLL_LOOPS_SHA512 */
-  }
-}
-
-
-void bvb_sha512_update(BvbSHA512Ctx* ctx, const uint8_t* data,
-                       uint32_t len) {
-    unsigned int block_nb;
-    unsigned int new_len, rem_len, tmp_len;
-    const uint8_t* shifted_data;
-
-    tmp_len = BVB_SHA512_BLOCK_SIZE - ctx->len;
-    rem_len = len < tmp_len ? len : tmp_len;
-
-    bvb_memcpy(&ctx->block[ctx->len], data, rem_len);
-
-    if (ctx->len + len < BVB_SHA512_BLOCK_SIZE) {
-        ctx->len += len;
-        return;
-    }
-
-    new_len = len - rem_len;
-    block_nb = new_len / BVB_SHA512_BLOCK_SIZE;
-
-    shifted_data = data + rem_len;
-
-    SHA512_transform(ctx, ctx->block, 1);
-    SHA512_transform(ctx, shifted_data, block_nb);
-
-    rem_len = new_len % BVB_SHA512_BLOCK_SIZE;
-
-    bvb_memcpy(ctx->block, &shifted_data[block_nb << 7],
-               rem_len);
-
-    ctx->len = rem_len;
-    ctx->tot_len += (block_nb + 1) << 7;
-}
-
-uint8_t* bvb_sha512_final(BvbSHA512Ctx* ctx)
-{
-    unsigned int block_nb;
-    unsigned int pm_len;
-    unsigned int len_b;
-
-#ifndef UNROLL_LOOPS_SHA512
-    int i;
-#endif
-
-    block_nb = 1 + ((BVB_SHA512_BLOCK_SIZE - 17)
-                     < (ctx->len % BVB_SHA512_BLOCK_SIZE));
-
-    len_b = (ctx->tot_len + ctx->len) << 3;
-    pm_len = block_nb << 7;
-
-    bvb_memset(ctx->block + ctx->len, 0, pm_len - ctx->len);
-    ctx->block[ctx->len] = 0x80;
-    UNPACK32(len_b, ctx->block + pm_len - 4);
-
-    SHA512_transform(ctx, ctx->block, block_nb);
-
-#ifdef UNROLL_LOOPS_SHA512
-    UNPACK64(ctx->h[0], &ctx->buf[ 0]);
-    UNPACK64(ctx->h[1], &ctx->buf[ 8]);
-    UNPACK64(ctx->h[2], &ctx->buf[16]);
-    UNPACK64(ctx->h[3], &ctx->buf[24]);
-    UNPACK64(ctx->h[4], &ctx->buf[32]);
-    UNPACK64(ctx->h[5], &ctx->buf[40]);
-    UNPACK64(ctx->h[6], &ctx->buf[48]);
-    UNPACK64(ctx->h[7], &ctx->buf[56]);
-#else
-    for (i = 0 ; i < 8; i++)
-        UNPACK64(ctx->h[i], &ctx->buf[i << 3]);
-#endif /* UNROLL_LOOPS_SHA512 */
-
-    return ctx->buf;
-}
diff --git a/refimpl/bvb_sysdeps.h b/refimpl/bvb_sysdeps.h
deleted file mode 100644
index a1f924e..0000000
--- a/refimpl/bvb_sysdeps.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#if !defined (BVB_INSIDE_BVB_REFIMPL_H) && !defined (BVB_REFIMPL_COMPILATION)
-#error "Never include this file directly, include bvb_refimpl.h instead."
-#endif
-
-#ifndef BVB_SYSDEPS_H_
-#define BVB_SYSDEPS_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Change these includes to match your platform to bring in the
- * equivalent types available in a normal C runtime, as well as
- * printf()-format specifiers such as PRIx64.
- */
-#include <stddef.h>
-#include <stdint.h>
-#include <inttypes.h>
-
-#ifdef BVB_ENABLE_DEBUG
-/* Aborts the program if |expr| is false.
- *
- * This has no effect unless BVB_ENABLE_DEBUG is defined.
- */
-#define bvb_assert(expr) do { if (!(expr)) { \
-    bvb_error("assert fail: %s at %s:%d\n", \
-              #expr, __FILE__, __LINE__); }} while(0)
-#else
-#define bvb_assert(expr)
-#endif
-
-/* Size in bytes used for word-alignment.
- *
- * Change this to match your architecture - must be a power of two.
- */
-#define BVB_WORD_ALIGNMENT_SIZE 8
-
-/* Aborts the program if |addr| is not word-aligned.
- *
- * This has no effect unless BVB_ENABLE_DEBUG is defined.
- */
-#define bvb_assert_word_aligned(addr) \
-    bvb_assert((((uintptr_t) addr) & (BVB_WORD_ALIGNMENT_SIZE-1)) == 0)
-
-/* Compare |n| bytes in |src1| and |src2|.
- *
- * Returns an integer less than, equal to, or greater than zero if the
- * first |n| bytes of |src1| is found, respectively, to be less than,
- * to match, or be greater than the first |n| bytes of |src2|. */
-int bvb_memcmp(const void* src1, const void* src2, size_t n);
-
-/* Copy |n| bytes from |src| to |dest|. */
-void* bvb_memcpy(void* dest, const void* src, size_t n);
-
-/* Set |n| bytes starting at |s| to |c|.  Returns |dest|. */
-void* bvb_memset(void* dest, const int c, size_t n);
-
-/* Compare |n| bytes starting at |s1| with |s2| and return 0 if they
- * match, 1 if they don't.  Returns 0 if |n|==0, since no bytes
- * mismatched.
- *
- * Time taken to perform the comparison is only dependent on |n| and
- * not on the relationship of the match between |s1| and |s2|.
- *
- * Note that unlike bvb_memcmp(), this only indicates inequality, not
- * whether |s1| is less than or greater than |s2|.
- */
-int bvb_safe_memcmp(const void* s1, const void* s2, size_t n);
-
-#ifdef BVB_ENABLE_DEBUG
-/* printf()-style function, used for diagnostics.
- *
- * This has no effect unless BVB_ENABLE_DEBUG is defined.
- */
-void bvb_debug(const char* format, ...) __attribute__((format(printf, 1, 2)));
-#else
-static inline void bvb_debug(const char* format, ...)
-    __attribute__((format(printf, 1, 2)));
-static inline void bvb_debug(const char* format, ...) {}
-#endif
-
-/* Prints out a message (defined by |format|, printf()-style) and
- * aborts the program or reboots the device.
- *
- * Unlike bvb_debug(), this function does not depend on BVB_ENABLE_DEBUG.
- */
-void bvb_error(const char* format, ...) __attribute__((format(printf, 1, 2)));
-
-/* Allocates |size| bytes. Returns NULL if no memory is available,
- * otherwise a pointer to the allocated memory.
- *
- * The memory is not initialized.
- *
- * The pointer returned is guaranteed to be word-aligned.
- *
- * The memory should be freed with bvb_free() when you are done with it.
- */
-void* bvb_malloc(size_t size);
-
-/* Frees memory previously allocated with bvb_malloc(). */
-void bvb_free(void* ptr);
-
-/* Returns the lenght of |str|, excluding the terminating NUL-byte. */
-size_t bvb_strlen(const char* str);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* BVB_SYSDEPS_H_ */
diff --git a/refimpl/bvb_sysdeps_stub.c b/refimpl/bvb_sysdeps_stub.c
deleted file mode 100644
index c7cd076..0000000
--- a/refimpl/bvb_sysdeps_stub.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <endian.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "bvb_sysdeps.h"
-
-int bvb_memcmp(const void* src1, const void* src2, size_t n) {
-  return memcmp(src1, src2, n);
-}
-
-void* bvb_memcpy(void* dest, const void* src, size_t n) {
-  return memcpy(dest, src, (size_t)n);
-}
-
-void* bvb_memset(void* dest, const int c, size_t n) {
-  return memset(dest, c, n);
-}
-
-size_t bvb_strlen(const char* str) {
-  return strlen(str);
-}
-
-int bvb_safe_memcmp(const void* s1, const void* s2, size_t n) {
-  const unsigned char* us1 = s1;
-  const unsigned char* us2 = s2;
-  int result = 0;
-
-  if (0 == n)
-    return 0;
-
-  /*
-   * Code snippet without data-dependent branch due to Nate Lawson
-   * (nate@root.org) of Root Labs.
-   */
-  while (n--)
-    result |= *us1++ ^ *us2++;
-
-  return result != 0;
-}
-
-void bvb_error(const char* format, ...) {
-  va_list ap;
-  va_start(ap, format);
-  fprintf(stderr, "ERROR: ");
-  vfprintf(stderr, format, ap);
-  va_end(ap);
-  exit(1);
-}
-
-#ifdef BVB_ENABLE_DEBUG
-void bvb_debug(const char* format, ...) {
-  va_list ap;
-  va_start(ap, format);
-  fprintf(stderr, "DEBUG: ");
-  vfprintf(stderr, format, ap);
-  va_end(ap);
-}
-#endif
-
-void* bvb_malloc(size_t size) {
-  return malloc(size);
-}
-
-void bvb_free(void* ptr) {
-  free(ptr);
-}
diff --git a/refimpl/bvb_util.c b/refimpl/bvb_util.c
deleted file mode 100644
index fff8e96..0000000
--- a/refimpl/bvb_util.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include "bvb_util.h"
-
-uint32_t bvb_be32toh(uint32_t in) {
-  uint8_t* d = (uint8_t*) &in;
-  uint32_t ret;
-  ret  = ((uint32_t) d[0]) << 24;
-  ret |= ((uint32_t) d[1]) << 16;
-  ret |= ((uint32_t) d[2]) << 8;
-  ret |= ((uint32_t) d[3]);
-  return ret;
-}
-
-uint64_t bvb_be64toh(uint64_t in) {
-  uint8_t* d = (uint8_t*) &in;
-  uint64_t ret;
-  ret  = ((uint64_t) d[0]) << 56;
-  ret |= ((uint64_t) d[1]) << 48;
-  ret |= ((uint64_t) d[2]) << 40;
-  ret |= ((uint64_t) d[3]) << 32;
-  ret |= ((uint64_t) d[4]) << 24;
-  ret |= ((uint64_t) d[5]) << 16;
-  ret |= ((uint64_t) d[6]) << 8;
-  ret |= ((uint64_t) d[7]);
-  return ret;
-}
-
-void bvb_boot_image_header_to_host_byte_order(const BvbBootImageHeader* src,
-                                              BvbBootImageHeader* dest) {
-  bvb_memcpy(dest, src, sizeof(BvbBootImageHeader));
-
-  dest->header_version_major = bvb_be32toh(dest->header_version_major);
-  dest->header_version_minor = bvb_be32toh(dest->header_version_minor);
-
-  dest->authentication_data_block_size =
-      bvb_be64toh(dest->authentication_data_block_size);
-  dest->auxilary_data_block_size = bvb_be64toh(dest->auxilary_data_block_size);
-  dest->payload_data_block_size = bvb_be64toh(dest->payload_data_block_size);
-
-  dest->algorithm_type = bvb_be32toh(dest->algorithm_type);
-
-  dest->hash_offset = bvb_be64toh(dest->hash_offset);
-  dest->hash_size = bvb_be64toh(dest->hash_size);
-
-  dest->signature_offset = bvb_be64toh(dest->signature_offset);
-  dest->signature_size = bvb_be64toh(dest->signature_size);
-
-  dest->public_key_offset = bvb_be64toh(dest->public_key_offset);
-  dest->public_key_size = bvb_be64toh(dest->public_key_size);
-
-  dest->properties_offset = bvb_be64toh(dest->properties_offset);
-  dest->properties_size = bvb_be64toh(dest->properties_size);
-
-  dest->rollback_index = bvb_be64toh(dest->rollback_index);
-
-  dest->kernel_offset = bvb_be64toh(dest->kernel_offset);
-  dest->kernel_size = bvb_be64toh(dest->kernel_size);
-
-  dest->initrd_offset = bvb_be64toh(dest->initrd_offset);
-  dest->initrd_size = bvb_be64toh(dest->initrd_size);
-
-  dest->kernel_addr = bvb_be64toh(dest->kernel_addr);
-  dest->initrd_addr = bvb_be64toh(dest->initrd_addr);
-}
-
-void bvb_rsa_public_key_header_to_host_byte_order(
-    const BvbRSAPublicKeyHeader* src,
-    BvbRSAPublicKeyHeader* dest) {
-  bvb_memcpy(dest, src, sizeof(BvbRSAPublicKeyHeader));
-
-  dest->key_num_bits = bvb_be32toh(dest->key_num_bits);
-  dest->n0inv = bvb_be32toh(dest->n0inv);
-}
-
-int bvb_safe_add_to(uint64_t *value, uint64_t value_to_add) {
-  uint64_t original_value;
-
-  bvb_assert(value != NULL);
-
-  original_value = *value;
-
-  *value += value_to_add;
-  if (*value < original_value) {
-    bvb_debug("%s: overflow: 0x%016" PRIx64 " + 0x%016" PRIx64 "\n",
-              __FUNCTION__, original_value, value_to_add);
-    return 0;
-  }
-
-  return 1;
-}
-
-int bvb_safe_add(uint64_t* out_result, uint64_t a, uint64_t b) {
-  uint64_t dummy;
-  if (out_result == NULL)
-    out_result = &dummy;
-  *out_result = a;
-  return bvb_safe_add_to(out_result, b);
-}
diff --git a/refimpl/bvb_util.h b/refimpl/bvb_util.h
deleted file mode 100644
index 951ce83..0000000
--- a/refimpl/bvb_util.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#if !defined (BVB_INSIDE_BVB_REFIMPL_H) && !defined (BVB_REFIMPL_COMPILATION)
-#error "Never include this file directly, include bvb_refimpl.h instead."
-#endif
-
-#ifndef BVB_UTIL_H_
-#define BVB_UTIL_H_
-
-#include "bvb_boot_image_header.h"
-#include "bvb_sysdeps.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Converts a 32-bit unsigned integer from big-endian to host byte order. */
-uint32_t bvb_be32toh(uint32_t in);
-
-/* Converts a 64-bit unsigned integer from big-endian to host byte order. */
-uint64_t bvb_be64toh(uint64_t in);
-
-/* Adds |value_to_add| to |value| with overflow protection.
- *
- * Returns zero if the addition overflows, non-zero otherwise. In
- * either case, |value| is always modified.
- */
-int bvb_safe_add_to(uint64_t *value, uint64_t value_to_add);
-
-/* Adds |a| and |b| with overflow protection, returning the value in
- * |out_result|.
- *
- * It's permissible to pass NULL for |out_result| if you just want to
- * check that the addition would not overflow.
- *
- * Returns zero if the addition overflows, non-zero otherwise.
- */
-int bvb_safe_add(uint64_t *out_result, uint64_t a, uint64_t b);
-
-/* Copies |src| to |dest|, byte-swapping fields in the process. */
-void bvb_boot_image_header_to_host_byte_order(
-    const BvbBootImageHeader* src,
-    BvbBootImageHeader* dest);
-
-/* Copies |header| to |dest|, byte-swapping fields in the process. */
-void bvb_rsa_public_key_header_to_host_byte_order(
-    const BvbRSAPublicKeyHeader* src,
-    BvbRSAPublicKeyHeader* dest);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* BVB_UTIL_H_ */
diff --git a/refimpl/bvb_verify.c b/refimpl/bvb_verify.c
deleted file mode 100644
index dc05580..0000000
--- a/refimpl/bvb_verify.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "bvb_rsa.h"
-#include "bvb_sha.h"
-#include "bvb_util.h"
-#include "bvb_verify.h"
-
-static const uint8_t padding_RSA2048_SHA256[BVB_RSA2048_NUM_BYTES - BVB_SHA256_DIGEST_SIZE] = {
-0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20
-};
-
-static const uint8_t padding_RSA4096_SHA256[BVB_RSA4096_NUM_BYTES - BVB_SHA256_DIGEST_SIZE] = {
-0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20
-};
-
-static const uint8_t padding_RSA8192_SHA256[BVB_RSA8192_NUM_BYTES - BVB_SHA256_DIGEST_SIZE] = {
-0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20
-};
-
-static const uint8_t padding_RSA2048_SHA512[BVB_RSA2048_NUM_BYTES - BVB_SHA512_DIGEST_SIZE] = {
-0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x30,0x51,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03,0x05,0x00,0x04,0x40
-};
-
-static const uint8_t padding_RSA4096_SHA512[BVB_RSA4096_NUM_BYTES - BVB_SHA512_DIGEST_SIZE] = {
-0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x30,0x51,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03,0x05,0x00,0x04,0x40
-};
-
-static const uint8_t padding_RSA8192_SHA512[BVB_RSA8192_NUM_BYTES - BVB_SHA512_DIGEST_SIZE] = {
-0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x30,0x51,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03,0x05,0x00,0x04,0x40
-};
-
-typedef struct {
-  const uint8_t *padding;
-  size_t padding_len;
-  size_t hash_len;
-} BvbAlgorithmData;
-
-static BvbAlgorithmData algorithm_data[_BVB_ALGORITHM_NUM_TYPES] = {
-  /* BVB_ALGORITHM_TYPE_NONE */
-  {
-    .padding      = NULL,
-    .padding_len  = 0,
-    .hash_len     = 0
-  },
-  /* BVB_ALGORITHM_TYPE_SHA256_RSA2048 */
-  {
-    .padding      = padding_RSA2048_SHA256,
-    .padding_len  = sizeof(padding_RSA2048_SHA256),
-    .hash_len     = BVB_SHA256_DIGEST_SIZE
-  },
-  /* BVB_ALGORITHM_TYPE_SHA256_RSA4096 */
-  {
-    .padding      = padding_RSA4096_SHA256,
-    .padding_len  = sizeof(padding_RSA4096_SHA256),
-    .hash_len     = BVB_SHA256_DIGEST_SIZE
-  },
-  /* BVB_ALGORITHM_TYPE_SHA256_RSA8192 */
-  {
-    .padding      = padding_RSA8192_SHA256,
-    .padding_len  = sizeof(padding_RSA8192_SHA256),
-    .hash_len     = BVB_SHA256_DIGEST_SIZE
-  },
-  /* BVB_ALGORITHM_TYPE_SHA512_RSA2048 */
-  {
-    .padding      = padding_RSA2048_SHA512,
-    .padding_len  = sizeof(padding_RSA2048_SHA512),
-    .hash_len     = BVB_SHA512_DIGEST_SIZE
-  },
-  /* BVB_ALGORITHM_TYPE_SHA512_RSA4096 */
-  {
-    .padding      = padding_RSA4096_SHA512,
-    .padding_len  = sizeof(padding_RSA4096_SHA512),
-    .hash_len     = BVB_SHA512_DIGEST_SIZE
-  },
-  /* BVB_ALGORITHM_TYPE_SHA512_RSA8192 */
-  {
-    .padding      = padding_RSA8192_SHA512,
-    .padding_len  = sizeof(padding_RSA8192_SHA512),
-    .hash_len     = BVB_SHA512_DIGEST_SIZE
-  },
-};
-
-BvbVerifyResult bvb_verify_boot_image(const uint8_t* data,
-                                      size_t length,
-                                      const uint8_t** out_public_key_data,
-                                      size_t* out_public_key_length) {
-  BvbVerifyResult ret;
-  BvbBootImageHeader *h = NULL;
-  uint8_t* computed_hash;
-  BvbAlgorithmData* algorithm;
-  BvbSHA256Ctx sha256_ctx;
-  BvbSHA512Ctx sha512_ctx;
-  const uint8_t* header_block;
-  const uint8_t* authentication_block;
-  const uint8_t* auxilary_block;
-  const uint8_t* payload_block;
-  int verification_result;
-
-  ret = BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER;
-
-  if (out_public_key_data != NULL)
-    *out_public_key_data = NULL;
-  if (out_public_key_length != NULL)
-    *out_public_key_length = 0;
-
-  /* Ensure magic is correct. */
-  if (bvb_safe_memcmp(data, BVB_MAGIC, BVB_MAGIC_LEN) != 0) {
-    bvb_debug("Magic is incorrect.\n");
-    goto out;
-  }
-
-  /* Before we byteswap, ensure length is long enough. */
-  if (length < sizeof(BvbBootImageHeader)) {
-    bvb_debug("Length is smaller than header.\n");
-    goto out;
-  }
-  h = bvb_malloc(sizeof(BvbBootImageHeader));
-  if (h == NULL) {
-    bvb_debug("Error allocating byteswapped header.\n");
-    goto out;
-  }
-  bvb_boot_image_header_to_host_byte_order(
-      (const BvbBootImageHeader *) data, h);
-
-  /* Ensure we don't attempt to access any fields if the major version
-   * is not supported.
-   */
-  if (h->header_version_major > BVB_MAJOR_VERSION) {
-    bvb_debug("No support for version %d.\n", h->header_version_major);
-    goto out;
-  }
-
-  /* Ensure inner block sizes are multiple of 64. */
-  if ((h->authentication_data_block_size & 0x3f) != 0 ||
-      (h->auxilary_data_block_size & 0x3f) != 0) {
-    bvb_debug("Block size is not a multiple of 64.\n");
-    goto out;
-  }
-
-  /* Ensure block sizes all add up to at least |length|. */
-  uint64_t block_total = sizeof(BvbBootImageHeader);
-  if (!bvb_safe_add_to(&block_total, h->authentication_data_block_size) ||
-      !bvb_safe_add_to(&block_total, h->auxilary_data_block_size) ||
-      !bvb_safe_add_to(&block_total, h->payload_data_block_size)) {
-    bvb_debug("Overflow while computing size of boot image.\n");
-    goto out;
-  }
-  if (block_total > length) {
-    bvb_debug("Block sizes add up to more than given length.\n");
-    goto out;
-  }
-
-  uintptr_t data_ptr = (uintptr_t) data;
-  /* Ensure passed in memory doesn't wrap. */
-  if (!bvb_safe_add(NULL, (uint64_t) data_ptr, length)) {
-    bvb_debug("Boot image location and length mismatch.\n");
-    goto out;
-  }
-
-  /* Ensure hash and signature are entirely in the Authentication data block. */
-  uint64_t hash_end;
-  if (!bvb_safe_add(&hash_end, h->hash_offset, h->hash_size) ||
-      hash_end > h->authentication_data_block_size) {
-    bvb_debug("Hash is not entirely in its block.\n");
-    goto out;
-  }
-  uint64_t signature_end;
-  if (!bvb_safe_add(&signature_end, h->signature_offset, h->signature_size) ||
-      signature_end > h->authentication_data_block_size) {
-    bvb_debug("Signature is not entirely in its block.\n");
-    goto out;
-  }
-
-  /* Ensure public key is entirely in the Auxilary data block. */
-  uint64_t pubkey_end;
-  if (!bvb_safe_add(&pubkey_end, h->public_key_offset, h->public_key_size) ||
-      pubkey_end > h->auxilary_data_block_size) {
-    bvb_debug("Public key is not entirely in its block.\n");
-    goto out;
-  }
-
-  /* Ensure kernel and initramfs are entirely in the Payload data
-   * block.
-   */
-  uint64_t kernel_end;
-  if (!bvb_safe_add(&kernel_end, h->kernel_offset, h->kernel_size) ||
-      kernel_end > h->payload_data_block_size) {
-    bvb_debug("Kernel is not entirely in its block.\n");
-    goto out;
-  }
-  if (h->initrd_size > 0) {
-    uint64_t initrd_end;
-    if (!bvb_safe_add(&initrd_end, h->initrd_offset, h->initrd_size) ||
-        initrd_end > h->payload_data_block_size) {
-      bvb_debug("Initrd is not entirely in its block.\n");
-      goto out;
-    }
-  }
-
-  /* Ensure algorithm field is supported. */
-  if (h->algorithm_type >= _BVB_ALGORITHM_NUM_TYPES) {
-    bvb_debug("Invalid or unknown algorithm.\n");
-    goto out;
-  }
-  algorithm = &algorithm_data[h->algorithm_type];
-
-  /* Bail early if there's no hash or signature. */
-  if (h->algorithm_type == BVB_ALGORITHM_TYPE_NONE) {
-    ret = BVB_VERIFY_RESULT_OK_NOT_SIGNED;
-    goto out;
-  }
-
-  /* Bail if the embedded hash size doesn't match the chosen algorithm. */
-  if (h->hash_size != algorithm->hash_len) {
-    bvb_debug("Embedded hash has wrong size.\n");
-    goto out;
-  }
-
-  /* No overflow checks needed from here-on after since all block
-   * sizes and offsets have been verified above.
-   */
-
-  header_block = data;
-  authentication_block = header_block + sizeof(BvbBootImageHeader);
-  auxilary_block = authentication_block + h->authentication_data_block_size;
-  payload_block = auxilary_block + h->auxilary_data_block_size;
-
-  switch (h->algorithm_type) {
-    /* Explicit fall-through: */
-    case BVB_ALGORITHM_TYPE_SHA256_RSA2048:
-    case BVB_ALGORITHM_TYPE_SHA256_RSA4096:
-    case BVB_ALGORITHM_TYPE_SHA256_RSA8192:
-      bvb_sha256_init(&sha256_ctx);
-      bvb_sha256_update(&sha256_ctx, header_block,
-                        sizeof(BvbBootImageHeader));
-      bvb_sha256_update(&sha256_ctx, auxilary_block,
-                        h->auxilary_data_block_size);
-      bvb_sha256_update(&sha256_ctx, payload_block,
-                        h->payload_data_block_size);
-      computed_hash = bvb_sha256_final(&sha256_ctx);
-      break;
-    /* Explicit fall-through: */
-    case BVB_ALGORITHM_TYPE_SHA512_RSA2048:
-    case BVB_ALGORITHM_TYPE_SHA512_RSA4096:
-    case BVB_ALGORITHM_TYPE_SHA512_RSA8192:
-      bvb_sha512_init(&sha512_ctx);
-      bvb_sha512_update(&sha512_ctx, header_block,
-                        sizeof(BvbBootImageHeader));
-      bvb_sha512_update(&sha512_ctx, auxilary_block,
-                        h->auxilary_data_block_size);
-      bvb_sha512_update(&sha512_ctx, payload_block,
-                        h->payload_data_block_size);
-      computed_hash = bvb_sha512_final(&sha512_ctx);
-      break;
-    default:
-      bvb_debug("Unknown algorithm %d.\n", h->algorithm_type);
-      goto out;
-  }
-
-  if (bvb_safe_memcmp(authentication_block + h->hash_offset,
-                      computed_hash, h->hash_size) != 0) {
-    bvb_debug("Hash does not match!\n");
-    ret = BVB_VERIFY_RESULT_HASH_MISMATCH;
-    goto out;
-  }
-
-  verification_result = bvb_rsa_verify(
-      auxilary_block + h->public_key_offset, h->public_key_size,
-      authentication_block + h->signature_offset, h->signature_size,
-      authentication_block + h->hash_offset, h->hash_size,
-      algorithm->padding, algorithm->padding_len);
-
-  if (verification_result == 0) {
-    ret = BVB_VERIFY_RESULT_SIGNATURE_MISMATCH;
-    goto out;
-  }
-
-  if (out_public_key_data != NULL)
-    *out_public_key_data = auxilary_block + h->public_key_offset;
-  if (out_public_key_length != NULL)
-    *out_public_key_length = h->public_key_size;
-
-  ret = BVB_VERIFY_RESULT_OK;
-
-out:
-  if (h != NULL)
-    bvb_free(h);
-  return ret;
-}
diff --git a/refimpl/bvb_verify.h b/refimpl/bvb_verify.h
deleted file mode 100644
index 0cfd7ba..0000000
--- a/refimpl/bvb_verify.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#if !defined (BVB_INSIDE_BVB_REFIMPL_H) && !defined (BVB_REFIMPL_COMPILATION)
-#error "Never include this file directly, include bvb_refimpl.h instead."
-#endif
-
-#ifndef BVB_VERIFY_H_
-#define BVB_VERIFY_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "bvb_boot_image_header.h"
-
-/* Return codes used in bvb_verify_boot_image().
- *
- * BVB_VERIFY_RESULT_OK is returned if the boot image header is valid,
- * the hash is correct and the signature is correct. Keep in mind that
- * you still need to check that you know the public key used to sign
- * the image, see bvb_verify_boot_image() for details.
- *
- * BVB_VERIFY_RESULT_OK_NOT_SIGNED is returned if the boot image
- * header is valid but there is no signature or hash.
- *
- * BVB_VERIFY_INVALID_BOOT_IMAGE_HEADER is returned if the header of
- * the boot image is invalid, for example, invalid magic or
- * inconsistent data.
- *
- * BVB_VERIFY_HASH_MISMATCH is returned if the hash stored in the
- * "Authentication data" block does not match the calculated hash.
- *
- * BVB_VERIFY_SIGNATURE_MISMATCH is returned if the signature stored
- * in the "Authentication data" block is invalid or doesn't match the
- * public key stored in the boot image.
- */
-typedef enum {
-  BVB_VERIFY_RESULT_OK,
-  BVB_VERIFY_RESULT_OK_NOT_SIGNED,
-  BVB_VERIFY_RESULT_INVALID_BOOT_IMAGE_HEADER,
-  BVB_VERIFY_RESULT_HASH_MISMATCH,
-  BVB_VERIFY_RESULT_SIGNATURE_MISMATCH,
-} BvbVerifyResult;
-
-/*
- * Checks that raw boot image at |data| of size |length| is a valid
- * Brillo boot image. The complete contents of the boot image must be
- * passed in. It's fine if |length| is bigger than the actual image,
- * typically callers of this function will load the entire contents of
- * the 'boot_a' or 'boot_b' partition and pass in its length (for
- * example, 32 MiB).
- *
- * See the |BvbBootImageHeader| struct for information about the four
- * blocks (header, authentication, auxilary, payload) that make up a
- * boot image.
- *
- * If the function returns |BVB_VERIFY_RESULT_OK| and
- * |out_public_key_data| is non-NULL, it will be set to point inside
- * |data| for where the serialized public key data is stored and
- * |out_public_key_length|, if non-NULL, will be set to the length of
- * the public key data.
- *
- * See the |BvbVerifyResult| enum for possible return values.
- *
- * VERY IMPORTANT:
- *
- *   1. Even if |BVB_VERIFY_RESULT_OK| is returned, you still need to
- *      check that the public key embedded in the image matches a
- *      known key! You can use 'bvbtool extract_public_key' to extract
- *      the key at build time and compare it to what is returned in
- *      |out_public_key_data|.
- *
- *   2. You need to check the |rollback_index| field against a stored
- *      value in NVRAM and reject the boot image if the value in NVRAM
- *      is bigger than |rollback_index|. You must also update the
- *      value stored in NVRAM to the smallest value of
- *      |rollback_index| field from boot images in all bootable and
- *      authentic slots marked as GOOD.
- */
-BvbVerifyResult bvb_verify_boot_image(
-    const uint8_t* data, size_t length,
-    const uint8_t** out_public_key_data, size_t* out_public_key_length);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* BVB_VERIFY_H_ */
diff --git a/test/dummy_initrd.bin b/test/dummy_initrd.bin
deleted file mode 100644
index 6d13e99..0000000
--- a/test/dummy_initrd.bin
+++ /dev/null
Binary files differ
diff --git a/test/dummy_kernel.bin b/test/dummy_kernel.bin
deleted file mode 100644
index 3666773..0000000
--- a/test/dummy_kernel.bin
+++ /dev/null
Binary files differ
diff --git a/test/dummy_rootfs.bin b/test/dummy_rootfs.bin
deleted file mode 100644
index e2a36c2..0000000
--- a/test/dummy_rootfs.bin
+++ /dev/null
Binary files differ
diff --git a/test/small_blob.bin b/test/small_blob.bin
deleted file mode 100644
index d712de6..0000000
--- a/test/small_blob.bin
+++ /dev/null
Binary files differ
diff --git a/test/testkey_rsa2048.pem b/test/testkey_rsa2048.pem
deleted file mode 100644
index 867dcff..0000000
--- a/test/testkey_rsa2048.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEowIBAAKCAQEAxlVR3TIkouAOvH79vaJTgFhpfvVKQIeVkFRZPVXK/zY0Gvrh
-4JAqGjJoW/PfrQv5sdD36qtHH3a+G5hLZ6Ni+t/mtfjucxZfuLGC3kmJ1T3XqEKZ
-gXXI2IR7vVSoImREvDQGEDyJwtHzLANlkbGg0cghVhWZSCAndO8BenalC2v94/rt
-DfkPekH6dgU3Sf40T0sBSeSY94mOzTaqOR2pfV1rWlLRdWmo33zeHBv52Rlbt0dM
-uXAureXWiHztkm5GCBC1dgM+CaxNtizNEgC91KcD0xuRCCM2WxH+r1lpszyIJDct
-YbrFmVEYl/kjQpafhy7Nsk1fqSTyRdriZSYmTQIDAQABAoIBAQC+kJgaCuX8wYAn
-SXWQ0fmdZlXnMNRpcF0a0pD0SAzGb1RdYBXMaXiqtyhiwc53PPxsCDdNecjayIMd
-jJVXPTwLhTruOgMS/bp3gcgWwV34UHV4LJXGOGAE+jbS0hbDBMiudOYmj6RmVshp
-z9G1zZCSQNMXHaWsEYkX59XpzzoB384nRul2QgEtwzUNR9XlpzgtJBLk3SACkvsN
-mQ/DW8IWHXLg8vLn1LzVJ2e3B16H4MoE2TCHxqfMgr03IDRRJogkenQuQsFhevYT
-o/mJyHSWavVgzMHG9I5m+eepF4Wyhj1Y4WyKAuMI+9dHAX/h7Lt8XFCQCh5DbkVG
-zGr34sWBAoGBAOs7n7YZqNaaguovfIdRRsxxZr1yJAyDsr6w3yGImDZYju4c4WY9
-5esO2kP3FA4p0c7FhQF5oOb1rBuHEPp36cpL4aGeK87caqTfq63WZAujoTZpr9Lp
-BRbkL7w/xG7jpQ/clpA8sHzHGQs/nelxoOtC7E118FiRgvD/jdhlMyL9AoGBANfX
-vyoN1pplfT2xR8QOjSZ+Q35S/+SAtMuBnHx3l0qH2bbBjcvM1MNDWjnRDyaYhiRu
-i+KA7tqfib09+XpB3g5D6Ov7ls/Ldx0S/VcmVWtia2HK8y8iLGtokoBZKQ5AaFX2
-iQU8+tC4h69GnJYQKqNwgCUzh8+gHX5Y46oDiTmRAoGAYpOx8lX+czB8/Da6MNrW
-mIZNT8atZLEsDs2ANEVRxDSIcTCZJId7+m1W+nRoaycLTWNowZ1+2ErLvR10+AGY
-b7Ys79Wg9idYaY9yGn9lnZsMzAiuLeyIvXcSqgjvAKlVWrhOQFOughvNWvFl85Yy
-oWSCMlPiTLtt7CCsCKsgKuECgYBgdIp6GZsIfkgclKe0hqgvRoeU4TR3gcjJlM9A
-lBTo+pKhaBectplx9RxR8AnsPobbqwcaHnIfAuKDzjk5mEvKZjClnFXF4HAHbyAF
-nRzZEy9XkWFhc80T5rRpZO7C7qdxmu2aiKixM3V3L3/0U58qULEDbubHMw9bEhAT
-PudI8QKBgHEEiMm/hr9T41hbQi/LYanWnlFw1ue+osKuF8bXQuxnnHNuFT/c+9/A
-vWhgqG6bOEHu+p/IPrYm4tBMYlwsyh4nXCyGgDJLbLIfzKwKAWCtH9LwnyDVhOow
-GH9shdR+sW3Ew97xef02KAH4VlNANEmBV4sQNqWWvsYrcFm2rOdL
------END RSA PRIVATE KEY-----
diff --git a/test/testkey_rsa4096.pem b/test/testkey_rsa4096.pem
deleted file mode 100644
index 26db5c3..0000000
--- a/test/testkey_rsa4096.pem
+++ /dev/null
@@ -1,51 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-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
------END RSA PRIVATE KEY-----
diff --git a/test/testkey_rsa8192.pem b/test/testkey_rsa8192.pem
deleted file mode 100644
index a383428..0000000
--- a/test/testkey_rsa8192.pem
+++ /dev/null
@@ -1,99 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-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
------END RSA PRIVATE KEY-----
