Improve ckm deserialization errors detection
[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, bool is_size_fixed = true);
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         bool m_isSizeFixed;
67         uint32_t m_expectedSize;
68 };
69
70
71 class TZSerializablePwdData : public TZSerializable {
72 public:
73         TZSerializablePwdData(const RawBuffer &pwd,
74                               const RawBuffer &iv,
75                               uint32_t tagSizeBits,
76                               const RawBuffer &tag = RawBuffer());
77         uint32_t GetSize() const override;
78         int Serialize(void **buffer, uint32_t *size_guard) const override;
79         int Deserialize(void **buffer, uint32_t *size_guard) override;
80 private:
81         KM_PwdData m_data;
82 };
83
84
85 class TZSerializableFlag : public TZSerializable {
86 public:
87         TZSerializableFlag() : m_flag(0) {}
88         explicit TZSerializableFlag(uint32_t flag) : m_flag(flag) {}
89         uint32_t GetSize() const override;
90         int Serialize(void **buffer, uint32_t *size_guard) const override;
91         int Deserialize(void **buffer, uint32_t *size_guard) override;
92         void Pull(uint32_t &flag) const override;
93 private:
94         uint32_t m_flag;
95 };
96
97
98 class TZSerializer {
99 public:
100         TZSerializer() : m_memorySize(0) {}
101         ~TZSerializer() {}
102         TZSerializer(const TZSerializer&) = delete;
103         TZSerializer& operator=(const TZSerializer&) = delete;
104
105         void Push(TZSerializable *serializable);
106
107         template <typename T>
108         void Pull(T &buffer);
109         uint32_t GetSize() const { return m_memorySize; }
110         void Serialize(TrustZoneMemory &memory) const;
111         void Deserialize(const TrustZoneMemory &memory);
112
113 private:
114         std::list<std::unique_ptr<TZSerializable>> m_serializables;
115         uint32_t m_memorySize;
116 };
117
118 template <typename T>
119 void TZSerializer::Pull(T &data)
120 {
121         if (m_serializables.empty()) {
122                 ThrowErr(Exc::Crypto::InternalError, "No more serializables to extract");
123         }
124
125         m_serializables.front()->Pull(data);
126         m_serializables.pop_front();
127 }
128
129 } // namespace Internals
130 } // namespace TZ
131 } // namespace Crypto
132 } // namespace CKM