tz-backend: Add serialization wrapper
[platform/core/security/key-manager.git] / src / manager / crypto / tz-backend / tz-serializer.h
1 /*
2  *  Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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
15  */
16 /*
17  * @file       tz-serializer.h
18  * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
19  * @version    1.0
20  * @brief
21  */
22
23 #pragma once
24
25 #include <cstdint>
26 #include <list>
27 #include <memory>
28
29 #include <tee_client_api.h>
30 #include <km_serialization.h>
31
32 #include <tz-backend/tz-memory.h>
33 #include <generic-backend/exception.h>
34 #include <dpl/raw-buffer.h>
35
36 namespace CKM {
37 namespace Crypto {
38 namespace TZ {
39 namespace Internals {
40
41 class TZSerializable {
42 public:
43         TZSerializable() {}
44         virtual ~TZSerializable() {}
45         TZSerializable(const TZSerializable&) = delete;
46         TZSerializable& operator=(const TZSerializable&) = delete;
47
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;
53 };
54
55
56 class TZSerializableBinary : public TZSerializable {
57 public:
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;
64 private:
65         KM_BinaryData m_data;
66 };
67
68
69 class TZSerializablePwdData : public TZSerializable {
70 public:
71         TZSerializablePwdData(const RawBuffer &pwd,
72                               const RawBuffer &iv,
73                               uint32_t tagSizeBits,
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;
78 private:
79         KM_PwdData m_data;
80 };
81
82
83 class TZSerializableFlag : public TZSerializable {
84 public:
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;
91 private:
92         uint32_t m_flag;
93 };
94
95
96 class TZSerializer {
97 public:
98         TZSerializer() : m_memorySize(0) {}
99         ~TZSerializer() {}
100         TZSerializer(const TZSerializer&) = delete;
101         TZSerializer& operator=(const TZSerializer&) = delete;
102
103         void Push(TZSerializable *serializable);
104
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);
110
111 private:
112         std::list<std::unique_ptr<TZSerializable>> m_serializables;
113         uint32_t m_memorySize;
114 };
115
116 template <typename T>
117 void TZSerializer::Pull(T &data)
118 {
119         if (m_serializables.empty()) {
120                 ThrowErr(Exc::Crypto::InternalError, "No more serializables to extract");
121         }
122
123         m_serializables.front()->Pull(data);
124         m_serializables.pop_front();
125 }
126
127 } // namespace Internals
128 } // namespace TZ
129 } // namespace Crypto
130 } // namespace CKM