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.h
18 * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
29 #include <tee_client_api.h>
30 #include <km_serialization.h>
32 #include <tz-backend/tz-memory.h>
33 #include <generic-backend/exception.h>
34 #include <dpl/raw-buffer.h>
41 class TZSerializable {
44 virtual ~TZSerializable() {}
45 TZSerializable(const TZSerializable&) = delete;
46 TZSerializable& operator=(const TZSerializable&) = delete;
48 virtual uint32_t GetSize() const = 0;
49 virtual int Serialize(void **buffer, uint32_t *size_guard) const = 0;
50 virtual int Deserialize(void **buffer, uint32_t *size_guard) = 0;
51 virtual void Pull(RawBuffer &buffer) const;
52 virtual void Pull(uint32_t &flag) const;
56 class TZSerializableBinary : public TZSerializable {
58 explicit TZSerializableBinary(uint32_t data_size);
59 explicit TZSerializableBinary(const RawBuffer &data);
60 uint32_t GetSize() const override;
61 int Serialize(void **buffer, uint32_t *size_guard) const override;
62 int Deserialize(void **buffer, uint32_t *size_guard) override;
63 void Pull(RawBuffer &buffer) const override;
69 class TZSerializablePwdData : public TZSerializable {
71 TZSerializablePwdData(const RawBuffer &pwd,
74 const RawBuffer &tag = RawBuffer());
75 uint32_t GetSize() const override;
76 int Serialize(void **buffer, uint32_t *size_guard) const override;
77 int Deserialize(void **buffer, uint32_t *size_guard) override;
83 class TZSerializableFlag : public TZSerializable {
85 TZSerializableFlag() : m_flag(0) {}
86 explicit TZSerializableFlag(uint32_t flag) : m_flag(flag) {}
87 uint32_t GetSize() const override;
88 int Serialize(void **buffer, uint32_t *size_guard) const override;
89 int Deserialize(void **buffer, uint32_t *size_guard) override;
90 void Pull(uint32_t &flag) const override;
98 TZSerializer() : m_memorySize(0) {}
100 TZSerializer(const TZSerializer&) = delete;
101 TZSerializer& operator=(const TZSerializer&) = delete;
103 void Push(TZSerializable *serializable);
105 template <typename T>
106 void Pull(T &buffer);
107 uint32_t GetSize() const { return m_memorySize; }
108 void Serialize(TrustZoneMemory &memory) const;
109 void Deserialize(const TrustZoneMemory &memory);
112 std::list<std::unique_ptr<TZSerializable>> m_serializables;
113 uint32_t m_memorySize;
116 template <typename T>
117 void TZSerializer::Pull(T &data)
119 if (m_serializables.empty()) {
120 ThrowErr(Exc::Crypto::InternalError, "No more serializables to extract");
123 m_serializables.front()->Pull(data);
124 m_serializables.pop_front();
127 } // namespace Internals
129 } // namespace Crypto