• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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