1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <cstring> 20 #include <memory> 21 #include <ostream> 22 23 #include <libavb/libavb.h> 24 25 namespace android { 26 namespace fs_mgr { 27 28 enum class VBMetaVerifyResult { 29 kSuccess = 0, 30 kError = 1, 31 kErrorVerification = 2, 32 }; 33 34 std::ostream& operator<<(std::ostream& os, VBMetaVerifyResult); 35 36 enum class AvbHashtreeResult { 37 kSuccess = 0, 38 kFail, 39 kDisabled, 40 }; 41 42 enum class HashAlgorithm { 43 kInvalid = 0, 44 kSHA256 = 1, 45 kSHA512 = 2, 46 }; 47 48 enum class AvbHandleStatus { 49 kSuccess = 0, 50 kUninitialized = 1, 51 kHashtreeDisabled = 2, 52 kVerificationDisabled = 3, 53 kVerificationError = 4, 54 }; 55 56 std::ostream& operator<<(std::ostream& os, AvbHandleStatus status); 57 58 struct FsAvbHashDescriptor : AvbHashDescriptor { 59 std::string partition_name; 60 std::string salt; 61 std::string digest; 62 }; 63 64 struct FsAvbHashtreeDescriptor : AvbHashtreeDescriptor { 65 std::string partition_name; 66 std::string salt; 67 std::string root_digest; 68 }; 69 70 class VBMetaData { 71 public: 72 // Constructors VBMetaData()73 VBMetaData() : vbmeta_ptr_(nullptr), vbmeta_size_(0){}; 74 VBMetaData(const uint8_t * data,size_t size,const std::string & partition_name)75 VBMetaData(const uint8_t* data, size_t size, const std::string& partition_name) 76 : vbmeta_ptr_(new (std::nothrow) uint8_t[size]), 77 vbmeta_size_(size), 78 partition_name_(partition_name) { 79 // The ownership of data is NOT transferred, i.e., the caller still 80 // needs to release the memory as we make a copy here. 81 std::memcpy(vbmeta_ptr_.get(), data, size * sizeof(uint8_t)); 82 } 83 VBMetaData(size_t size,const std::string & partition_name)84 explicit VBMetaData(size_t size, const std::string& partition_name) 85 : vbmeta_ptr_(new (std::nothrow) uint8_t[size]), 86 vbmeta_size_(size), 87 partition_name_(partition_name) {} 88 89 // Extracts vbmeta header from the vbmeta buffer, set update_vbmeta_size to 90 // true to update vbmeta_size_ to the actual size with valid content. 91 std::unique_ptr<AvbVBMetaImageHeader> GetVBMetaHeader(bool update_vbmeta_size = false); 92 93 // Sets the vbmeta_path where we load the vbmeta data. Could be a partition or a file. 94 // e.g., 95 // - /dev/block/by-name/system_a 96 // - /path/to/system_other.img. set_vbmeta_path(std::string vbmeta_path)97 void set_vbmeta_path(std::string vbmeta_path) { vbmeta_path_ = std::move(vbmeta_path); } 98 99 // Get methods for each data member. partition()100 const std::string& partition() const { return partition_name_; } vbmeta_path()101 const std::string& vbmeta_path() const { return vbmeta_path_; } data()102 uint8_t* data() const { return vbmeta_ptr_.get(); } size()103 const size_t& size() const { return vbmeta_size_; } 104 105 // Maximum size of a vbmeta data - 64 KiB. 106 static const size_t kMaxVBMetaSize = 64 * 1024; 107 108 private: 109 std::unique_ptr<uint8_t[]> vbmeta_ptr_; 110 size_t vbmeta_size_; 111 std::string partition_name_; 112 std::string vbmeta_path_; 113 }; 114 115 } // namespace fs_mgr 116 } // namespace android 117