2 * Copyright (c) 2019 Samsung Electronics Co., Ltd. All rights reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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
17 * @file tz-serializer.cpp
18 * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
22 #include "tz-serializer.h"
26 #include <generic-backend/crypto-params.h>
34 void TZSerializable::Pull(RawBuffer &) const
36 ThrowErr(Exc::Crypto::InternalError,
37 "This serializable does not support conversion to RawBuffer");
40 void TZSerializable::Pull(uint32_t &) const
42 ThrowErr(Exc::Crypto::InternalError,
43 "This serializable does not support conversion to uint32_t");
47 // TZSerializableBinary
48 TZSerializableBinary::TZSerializableBinary(uint32_t data_size)
50 m_data.data = nullptr;
51 m_data.data_size = data_size;
54 TZSerializableBinary::TZSerializableBinary(const RawBuffer &data)
56 m_data.data = data.empty() ? nullptr : const_cast<unsigned char *>(data.data());
57 m_data.data_size = data.size();
60 uint32_t TZSerializableBinary::GetSize() const
62 return KM_SizeOfBinaryData(const_cast<KM_BinaryData*>(&m_data));
65 int TZSerializableBinary::Serialize(void **buffer, uint32_t *size_guard) const
67 return KM_SerializeBinaryData(buffer, size_guard, const_cast<KM_BinaryData*>(&m_data));
70 int TZSerializableBinary::Deserialize(void **buffer, uint32_t *size_guard)
72 return KM_DeserializeBinaryData(buffer, size_guard, &m_data);
75 void TZSerializableBinary::Pull(RawBuffer &buffer) const
77 buffer.resize(m_data.data_size);
78 memcpy(buffer.data(), m_data.data, m_data.data_size);
82 // TZSerializablePwdData
83 TZSerializablePwdData::TZSerializablePwdData(const RawBuffer &pwd,
88 memset(&m_data, 0, sizeof(KM_PwdData));
89 m_data.pwd = pwd.empty() ? nullptr : const_cast<unsigned char *>(pwd.data());
90 m_data.pwd_size = pwd.size();
91 m_data.iv = iv.empty() ? nullptr : const_cast<unsigned char *>(iv.data());
92 m_data.iv_size = iv.size();
93 m_data.tag = tag.empty() ? nullptr : const_cast<unsigned char *>(tag.data());
94 m_data.tag_size = tag.size();
95 m_data.derive_len_bits = Params::DERIVED_KEY_LENGTH_BITS;
96 m_data.it_count = Params::DERIVED_KEY_ITERATIONS;
97 m_data.tag_len_bits = tagSizeBits;
100 uint32_t TZSerializablePwdData::GetSize() const
102 return KM_SizeOfPwdData(const_cast<KM_PwdData*>(&m_data));
105 int TZSerializablePwdData::Serialize(void **buffer, uint32_t *size_guard) const
107 return KM_SerializePwdData(buffer, size_guard, const_cast<KM_PwdData*>(&m_data));
110 int TZSerializablePwdData::Deserialize(void **buffer, uint32_t *size_guard)
112 return KM_DeserializePwdData(buffer, size_guard, &m_data);
115 // TZSerializableFlag
116 uint32_t TZSerializableFlag::GetSize() const
118 return KM_SizeOfFlag();
121 int TZSerializableFlag::Serialize(void **buffer, uint32_t *size_guard) const
123 return KM_SerializeFlag(buffer, size_guard, m_flag);
126 int TZSerializableFlag::Deserialize(void **buffer, uint32_t *size_guard)
128 return KM_DeserializeFlag(buffer, size_guard, &m_flag);
131 void TZSerializableFlag::Pull(uint32_t &flag) const
138 void TZSerializer::Push(TZSerializable *serializable)
140 m_serializables.emplace_back(serializable);
141 m_memorySize += serializable->GetSize();
144 void TZSerializer::Serialize(TrustZoneMemory &memory) const
146 void *inBuffer = memory.Get()->buffer;
147 uint32_t inBufferGuard = m_memorySize;
149 for (const auto& s : m_serializables) {
150 int ret = s->Serialize(&inBuffer, &inBufferGuard);
152 ThrowErr(Exc::Crypto::InternalError, "Failed to serialize data, ret: ", ret);
157 void TZSerializer::Deserialize(const TrustZoneMemory &memory)
159 void *outBuffer = memory.Get()->buffer;
160 uint32_t outBufferGuard = m_memorySize;
162 for (const auto& s : m_serializables) {
163 int ret = s->Deserialize(&outBuffer, &outBufferGuard);
165 ThrowErr(Exc::Crypto::InternalError, "Failed to deserialize data, ret: ", ret);
170 } // namespace Internals
172 } // namespace Crypto