1 /*
2 * Copyright (c) 2025-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "fs_verity_descriptor.h"
16
17 namespace OHOS {
18 namespace SignatureTools {
FsVerityDescriptor()19 FsVerityDescriptor::FsVerityDescriptor()
20 {}
21
ToByteArray(std::vector<int8_t> & ret)22 void FsVerityDescriptor::ToByteArray(std::vector<int8_t> &ret)
23 {
24 std::unique_ptr<ByteBuffer> buffer = std::make_unique<ByteBuffer>(ByteBuffer(DESCRIPTOR_SIZE));
25 buffer->PutByte(VERSION);
26 buffer->PutByte(hashAlgorithm);
27 buffer->PutByte(log2BlockSize);
28 if (saltSize > SALT_SIZE) {
29 PrintErrorNumberMsg("SIGN_ERROR", SIGN_ERROR, "Salt is too long");
30 ret = std::vector<int8_t>();
31 return;
32 }
33 buffer->PutByte(saltSize);
34 buffer->PutInt32(signSize);
35 buffer->PutInt64(fileSize);
36 WriteBytesWithSize(buffer.get(), rawRootHash, ROOT_HASH_FILED_SIZE);
37 WriteBytesWithSize(buffer.get(), salt, SALT_SIZE);
38 buffer->PutInt32(flags);
39 std::vector<int8_t> emptyVector;
40 WriteBytesWithSize(buffer.get(), emptyVector, RESERVED_SIZE_AFTER_FLAGS);
41 buffer->PutInt64(merkleTreeOffset);
42 WriteBytesWithSize(buffer.get(), emptyVector, RESERVED_SIZE_AFTER_TREE_OFFSET);
43 buffer->PutByte(csVersion);
44 buffer->Flip();
45 char dataArr[DESCRIPTOR_SIZE] = { 0 };
46 buffer->GetData(dataArr, DESCRIPTOR_SIZE);
47 ret = std::vector<int8_t>(dataArr, dataArr + DESCRIPTOR_SIZE);
48 return;
49 }
50
GetByteForGenerateDigest(std::vector<int8_t> & ret)51 void FsVerityDescriptor::GetByteForGenerateDigest(std::vector<int8_t> &ret)
52 {
53 std::unique_ptr<ByteBuffer> buffer = std::make_unique<ByteBuffer>(ByteBuffer(DESCRIPTOR_SIZE));
54 buffer->PutByte(VERSION);
55 buffer->PutByte(hashAlgorithm);
56 buffer->PutByte(log2BlockSize);
57 if (saltSize > SALT_SIZE) {
58 PrintErrorNumberMsg("SIGN_ERROR", SIGN_ERROR, "Salt is too long");
59 ret = std::vector<int8_t>();
60 return;
61 }
62 buffer->PutByte(saltSize);
63 buffer->PutInt32(0);
64 buffer->PutInt64(fileSize);
65 WriteBytesWithSize(buffer.get(), rawRootHash, ROOT_HASH_FILED_SIZE);
66 WriteBytesWithSize(buffer.get(), salt, SALT_SIZE);
67 buffer->PutInt32(flags);
68 std::vector<int8_t> emptyVector;
69 WriteBytesWithSize(buffer.get(), emptyVector, RESERVED_SIZE_AFTER_FLAGS);
70 buffer->PutInt64(merkleTreeOffset);
71 WriteBytesWithSize(buffer.get(), emptyVector, RESERVED_SIZE_AFTER_TREE_OFFSET);
72 buffer->PutByte(csVersion);
73 buffer->Flip();
74 char dataArr[DESCRIPTOR_SIZE] = { 0 };
75 buffer->GetData(dataArr, DESCRIPTOR_SIZE);
76 ret = std::vector<int8_t>(dataArr, dataArr + DESCRIPTOR_SIZE);
77 return;
78 }
79
WriteBytesWithSize(ByteBuffer * buffer,std::vector<int8_t> & src,int size)80 void FsVerityDescriptor::WriteBytesWithSize(ByteBuffer* buffer, std::vector<int8_t>& src, int size)
81 {
82 int pos = buffer->GetPosition();
83 if (!src.empty()) {
84 if (src.size() > size) {
85 buffer->PutData(0, src.data(), src.size());
86 } else {
87 buffer->PutData(src.data(), src.size());
88 }
89 }
90 buffer->SetPosition(pos + size);
91 }
92 } // namespace SignatureTools
93 } // namespace OHOS