• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024-2024 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 "sign_info.h"
16 
17 namespace OHOS {
18 namespace SignatureTools {
19 
SignInfo()20 SignInfo::SignInfo()
21 {
22     saltSize = 0;
23     sigSize = 0;
24     flags = 0;
25     dataSize = 0;
26     salt = std::vector<int8_t>();
27     extensionNum = 0;
28     extensionOffset = 0;
29     signature = std::vector<int8_t>();
30     zeroPadding = std::vector<int8_t>();
31 }
32 
SignInfo(int32_t saltSize,int32_t flags,int64_t dataSize,const std::vector<int8_t> & salt,const std::vector<int8_t> & sig)33 SignInfo::SignInfo(int32_t saltSize,
34                    int32_t flags,
35                    int64_t dataSize,
36                    const std::vector<int8_t>& salt,
37                    const std::vector<int8_t>& sig)
38 {
39     this->saltSize = saltSize;
40     this->flags = flags;
41     this->dataSize = dataSize;
42     if (salt.empty()) {
43         this->salt = std::vector<int8_t>(SALT_BUFFER_LENGTH, 0);
44     } else {
45         this->salt = salt;
46     }
47     signature = sig;
48     sigSize = sig.empty() ? 0 : sig.size();
49     // align for extension after signature
50     zeroPadding = std::vector<int8_t>((SignInfo::SIGNATURE_ALIGNMENT
51                                             - (sigSize % SignInfo::SIGNATURE_ALIGNMENT))
52                                             % SignInfo::SIGNATURE_ALIGNMENT, 0);
53     extensionNum = 0;
54     extensionOffset = 0;
55 }
56 
SignInfo(int32_t saltSize,int32_t sigSize,int32_t flags,int64_t dataSize,const std::vector<int8_t> & salt,int32_t extensionNum,int32_t extensionOffset,const std::vector<int8_t> & signature,const std::vector<int8_t> & zeroPadding,const std::vector<MerkleTreeExtension * > & extensionList)57 SignInfo::SignInfo(int32_t saltSize,
58                    int32_t sigSize,
59                    int32_t flags,
60                    int64_t dataSize,
61                    const std::vector<int8_t>& salt,
62                    int32_t extensionNum,
63                    int32_t extensionOffset,
64                    const std::vector<int8_t>& signature,
65                    const std::vector<int8_t>& zeroPadding,
66                    const std::vector<MerkleTreeExtension*>& extensionList)
67 {
68     this->saltSize = saltSize;
69     this->sigSize = sigSize;
70     this->flags = flags;
71     this->dataSize = dataSize;
72     this->salt = salt;
73     this->extensionNum = extensionNum;
74     this->extensionOffset = extensionOffset;
75     this->signature = signature;
76     this->zeroPadding = zeroPadding;
77     this->extensionList = extensionList;
78 }
79 
SignInfo(const SignInfo & other)80 SignInfo::SignInfo(const SignInfo& other)
81 {
82     this->saltSize = other.saltSize;
83     this->sigSize = other.sigSize;
84     this->flags = other.flags;
85     this->dataSize = other.dataSize;
86     this->salt = other.salt;
87     this->extensionNum = other.extensionNum;
88     this->extensionOffset = other.extensionOffset;
89     this->signature = other.signature;
90     this->zeroPadding = other.zeroPadding;
91     for (MerkleTreeExtension* ext : other.extensionList) {
92         MerkleTreeExtension* extTmp = new MerkleTreeExtension(*ext);
93         this->extensionList.push_back(extTmp);
94     }
95 }
96 
operator =(const SignInfo & other)97 SignInfo& SignInfo::operator=(const SignInfo& other)
98 {
99     if (this == &other) {
100         return *this;
101     }
102     this->saltSize = other.saltSize;
103     this->sigSize = other.sigSize;
104     this->flags = other.flags;
105     this->dataSize = other.dataSize;
106     this->salt = other.salt;
107     this->extensionNum = other.extensionNum;
108     this->extensionOffset = other.extensionOffset;
109     this->signature = other.signature;
110     this->zeroPadding = other.zeroPadding;
111     for (MerkleTreeExtension* ext : other.extensionList) {
112         MerkleTreeExtension* extTmp = new MerkleTreeExtension(*ext);
113         this->extensionList.push_back(extTmp);
114     }
115     return *this;
116 }
117 
~SignInfo()118 SignInfo::~SignInfo()
119 {
120     for (Extension* ext : extensionList) {
121         if (ext) {
122             delete ext;
123             ext = nullptr;
124         }
125     }
126 }
127 
GetSize()128 int32_t SignInfo::GetSize()
129 {
130     int blockSize = SignInfo::SIGN_INFO_SIZE_WITHOUT_SIGNATURE + signature.size() + zeroPadding.size();
131     for (Extension* ext : extensionList) {
132         blockSize += ext->GetSize();
133     }
134     return blockSize;
135 }
136 
AddExtension(MerkleTreeExtension * extension)137 void SignInfo::AddExtension(MerkleTreeExtension* extension)
138 {
139     extensionOffset = GetSize();
140     extensionList.push_back(extension);
141     extensionNum = extensionList.size();
142 }
143 
GetExtensionByType(int32_t type)144 Extension* SignInfo::GetExtensionByType(int32_t type)
145 {
146     for (Extension* ext : extensionList) {
147         if (ext->IsType(type)) {
148             return ext;
149         }
150     }
151     return nullptr;
152 }
153 
GetExtensionNum()154 int32_t SignInfo::GetExtensionNum()
155 {
156     return extensionNum;
157 }
158 
GetSignature()159 std::vector<int8_t> SignInfo::GetSignature()
160 {
161     return signature;
162 }
163 
GetDataSize()164 int64_t SignInfo::GetDataSize()
165 {
166     return dataSize;
167 }
168 
ToByteArray(std::vector<int8_t> & ret)169 void SignInfo::ToByteArray(std::vector<int8_t> &ret)
170 {
171     std::unique_ptr<ByteBuffer> bf = std::make_unique<ByteBuffer>(ByteBuffer(GetSize()));
172     std::vector<int8_t> empt(GetSize());
173     bf->PutData(empt.data(), empt.size());
174     bf->Clear();
175     bf->PutInt32(saltSize);
176     bf->PutInt32(sigSize);
177     bf->PutInt32(flags);
178     bf->PutInt64(dataSize);
179     bf->PutData(salt.data(), salt.size());
180     bf->PutInt32(extensionNum);
181     bf->PutInt32(extensionOffset);
182     bf->PutData(signature.data(), signature.size());
183     bf->PutData(zeroPadding.data(), zeroPadding.size());
184     // put extension
185     for (Extension* ext : extensionList) {
186         std::vector<int8_t> ret;
187         ext->ToByteArray(ret);
188         bf->PutData(ret.data(), ret.size());
189     }
190     bf->Flip();
191     ret = std::vector<int8_t>(bf->GetBufferPtr(), bf->GetBufferPtr() + bf.get()->GetCapacity());
192     return;
193 }
194 
ParseMerkleTreeExtension(ByteBuffer * bf,int32_t inExtensionNum)195 std::vector<MerkleTreeExtension*> SignInfo::ParseMerkleTreeExtension(ByteBuffer* bf, int32_t inExtensionNum)
196 {
197     std::vector<MerkleTreeExtension*> inExtensionList;
198     if (inExtensionNum == 1) {
199         // parse merkle tree extension
200         int32_t extensionType = 0;
201         bf->GetInt32(extensionType);
202         if (extensionType != MerkleTreeExtension::MERKLE_TREE_INLINED) {
203             PrintErrorNumberMsg("VERIFY_ERROR", VERIFY_ERROR,
204                                 "The extension type of SignInfo is incorrect.");
205             return inExtensionList;
206         }
207         int32_t extensionSize = 0;
208         bf->GetInt32(extensionSize);
209         if (extensionSize != MerkleTreeExtension::MERKLE_TREE_EXTENSION_DATA_SIZE) {
210             PrintErrorNumberMsg("VERIFY_ERROR", VERIFY_ERROR,
211                                 "The extension size of SignInfo is incorrect.");
212             return inExtensionList;
213         }
214         std::vector<int8_t> merkleTreeExtension(MerkleTreeExtension::MERKLE_TREE_EXTENSION_DATA_SIZE, 0);
215         bf->GetByte(merkleTreeExtension.data(), merkleTreeExtension.size());
216         MerkleTreeExtension* pMerkleTreeExtension = MerkleTreeExtension::FromByteArray(merkleTreeExtension);
217         if (pMerkleTreeExtension) {
218             inExtensionList.push_back(pMerkleTreeExtension);
219         }
220     }
221     return inExtensionList;
222 }
223 
FromByteArray(std::vector<int8_t> bytes)224 SignInfo SignInfo::FromByteArray(std::vector<int8_t> bytes)
225 {
226     std::unique_ptr<ByteBuffer> bf = std::make_unique<ByteBuffer>(ByteBuffer(bytes.size()));
227     bf->PutData(bytes.data(), bytes.size());
228     bf->Flip();
229     int32_t inSaltSize = 0;
230     bool flag = bf->GetInt32(inSaltSize);
231     int32_t inSigSize = 0;
232     bool ret = bf->GetInt32(inSigSize);
233     if (!flag || !ret || inSaltSize < 0 || inSigSize < 0) {
234         SIGNATURE_TOOLS_LOGE("Invalid saltSize or sigSize of SignInfo, saltSize: %d, sigSize: %d",
235             inSaltSize, inSigSize);
236         return SignInfo();
237     }
238     int32_t inFlags = 0;
239     flag = bf->GetInt32(inFlags);
240     if (!flag || (inFlags != 0 && inFlags != SignInfo::FLAG_MERKLE_TREE_INCLUDED)) {
241         SIGNATURE_TOOLS_LOGE("Invalid flags of SignInfo: %d", inFlags);
242         return SignInfo();
243     }
244     int64_t inDataSize = 0;
245     flag = bf->GetInt64(inDataSize);
246     if (!flag || (inDataSize < 0)) {
247         SIGNATURE_TOOLS_LOGE("Invalid dataSize of SignInfo");
248         return SignInfo();
249     }
250     std::vector<int8_t> inSalt(SignInfo::SALT_BUFFER_LENGTH, 0);
251     bf->GetByte(inSalt.data(), SignInfo::SALT_BUFFER_LENGTH);
252     int32_t inExtensionNum = 0;
253     flag = bf->GetInt32(inExtensionNum);
254     if (!flag || inExtensionNum < 0 || inExtensionNum > SignInfo::MAX_EXTENSION_NUM) {
255         SIGNATURE_TOOLS_LOGE("Invalid extensionNum of SignInfo: %d", inExtensionNum);
256         return SignInfo();
257     }
258     int32_t inExtensionOffset = 0;
259     flag = bf->GetInt32(inExtensionOffset);
260     if (!flag || inExtensionOffset < 0 || inExtensionOffset % SignInfo::SIGNATURE_ALIGNMENT != 0) {
261         SIGNATURE_TOOLS_LOGE("Invalid extensionOffset of SignInfo: %d", inExtensionOffset);
262         return SignInfo();
263     }
264     std::vector<int8_t> inSignature(inSigSize, 0);
265     bf->GetByte(inSignature.data(), inSigSize);
266     std::vector<int8_t> inZeroPadding((SignInfo::SIGNATURE_ALIGNMENT - (inSigSize % SignInfo::SIGNATURE_ALIGNMENT))
267                                       % SignInfo::SIGNATURE_ALIGNMENT, 0);
268     bf->GetByte(inZeroPadding.data(), inZeroPadding.size());
269     std::vector<MerkleTreeExtension*> inExtensionList = ParseMerkleTreeExtension(bf.get(), inExtensionNum);
270     return SignInfo(inSaltSize, inSigSize, inFlags, inDataSize, inSalt, inExtensionNum, inExtensionOffset,
271                     inSignature, inZeroPadding, inExtensionList);
272 }
273 
274 }
275 }