0ccfbc5d922bfb6ae1f1b6cb25c36c818767e9dc
[platform/core/security/key-manager.git] / src / manager / crypto / tz-backend / tz-context.h
1 /*
2  *  Copyright (c) 2017 - 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-context.h
18  * @author     Lukasz Kostyra (l.kostyra@samsung.com)
19  * @version    1.0
20  */
21 #pragma once
22
23 #include <tee_client_api.h>
24 #include <ckm/ckm-raw-buffer.h>
25 #include <data-type.h>
26 #include <km_ta_defines.h>
27 #include <memory>
28 #include <tz-backend/obj.h>
29 #include <generic-backend/encryption-params.h>
30 #include <tz-backend/tz-serializer.h>
31
32 namespace CKM {
33 namespace Crypto {
34 namespace TZ {
35 namespace Internals {
36
37 class TrustZoneContext final
38 {
39 public:
40         static TrustZoneContext& Instance();
41
42         void generateIV(RawBuffer &iv);
43         void generateSKey(tz_algo_type algo,
44                                         uint32_t keySizeBits,
45                                         const RawBuffer &hash);
46         void generateSKeyPwd(tz_algo_type algo,
47                                                 const RawBuffer &pwd,
48                                                 const RawBuffer &iv,
49                                                 const uint32_t pwdKeySizeBits,
50                                                 RawBuffer &pwdTag,
51                                                 const RawBuffer &hash);
52         void generateRSAKey(uint32_t keySizeBits,
53                                         const RawBuffer &pubPwd,
54                                         const RawBuffer &pubPwdIv,
55                                         const RawBuffer &privPwd,
56                                         const RawBuffer &privPwdIv,
57                                         RawBuffer &pubKeyTag,
58                                         RawBuffer &privKeyTag,
59                                         const RawBuffer &hashPriv,
60                                         const RawBuffer &hashPub);
61         void generateDSAKey(uint32_t keySizeBits,
62                                                 const RawBuffer &prime,
63                                                 const RawBuffer &subprime,
64                                                 const RawBuffer &base,
65                                                 const RawBuffer &pubPwd,
66                                                 const RawBuffer &pubPwdIv,
67                                                 const RawBuffer &privPwd,
68                                                 const RawBuffer &privPwdIv,
69                                                 RawBuffer &pubKeyTag,
70                                                 RawBuffer &privKeyTag,
71                                                 const RawBuffer &hashPriv,
72                                                 const RawBuffer &hashPub);
73
74         void importData(uint32_t dataType,
75                                         const RawBuffer &data,
76                                         const Crypto::EncryptionParams &encData,
77                                         const RawBuffer &pwd,
78                                         const RawBuffer &pwdIV,
79                                         const uint32_t keySizeBits,
80                                         const uint32_t powTagSizeBits,
81                                         RawBuffer &pwdTag,
82                                         const RawBuffer &hash);
83
84         void executeCrypt(tz_command cmd,
85                                         tz_algo_type algo,
86                                         const RawBuffer &keyId,
87                                         const Pwd &pwd,
88                                         const RawBuffer &iv,
89                                         const RawBuffer &data,
90                                         RawBuffer &out);
91
92         void executeEncryptAE(const RawBuffer &keyId,
93                                                 const Pwd &pwd,
94                                                 const RawBuffer &iv,
95                                                 int tagSizeBits,
96                                                 const RawBuffer &aad,
97                                                 const RawBuffer &data,
98                                                 RawBuffer &out,
99                                                 RawBuffer &tag);
100         void executeDecryptAE(const RawBuffer &keyId,
101                                                 const Pwd &pwd,
102                                                 const RawBuffer &iv,
103                                                 int tagSizeBits,
104                                                 const RawBuffer &tag,
105                                                 const RawBuffer &aad,
106                                                 const RawBuffer &data,
107                                                 RawBuffer &out);
108
109         void executeSign(tz_algo_type algo,
110                                         tz_hash_type hash,
111                                         const RawBuffer &keyId,
112                                         const Pwd &pwd,
113                                         const RawBuffer &message,
114                                         RawBuffer &signature);
115         int executeVerify(tz_algo_type algo,
116                                         tz_hash_type hash,
117                                         const RawBuffer &keyId,
118                                         const Pwd &pwd,
119                                         const RawBuffer &message,
120                                         const RawBuffer &signature);
121
122         void executeDestroy(const RawBuffer &keyId);
123
124         void getData(const RawBuffer &dataId,
125                                  const Pwd &pwd,
126                                  RawBuffer &data);
127
128         void destroyData(const RawBuffer &dataId);
129
130 private:
131         TrustZoneContext();
132         ~TrustZoneContext();
133         TrustZoneContext(const TrustZoneContext &other) = delete;
134         TrustZoneContext(TrustZoneContext &&other) = delete;
135
136         void Initialize();
137         void Destroy();
138         void Reload();
139
140         void GetDataSize(const RawBuffer &dataId, uint32_t &dataSize);
141
142         void Execute(tz_command commandID, TEEC_Operation* op);
143
144         void GenerateAKey(tz_command commandID,
145                           TZSerializer &sIn,
146                           uint32_t keySizeBits,
147                           const RawBuffer &pubPwd,
148                           const RawBuffer &pubPwdIv,
149                           const RawBuffer &privPwd,
150                           const RawBuffer &privPwdIv,
151                           RawBuffer &pubKeyTag,
152                           RawBuffer &privKeyTag,
153                           const RawBuffer &hashPriv,
154                                           const RawBuffer &hashPub);
155
156         TEEC_Context m_Context;
157         TEEC_Session m_Session;
158
159         bool m_ContextInitialized;
160         bool m_SessionInitialized;
161 };
162
163 } // namespace Internals
164 } // namespace TZ
165 } // namespace Crypto
166 } // namespace CKM