Python3 bindings for YACA
[platform/core/security/yaca.git] / python / yaca / library.py
1 # Copyright (c) 2017-2018 Samsung Electronics Co., Ltd All Rights Reserved
2
3 # Contact: Lukasz Pawelczyk <l.pawelczyk@samsung.com>
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 #     http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License
16
17
18 import ctypes as _ctypes
19 import enum as _enum
20 import yaca.error as _err
21
22
23 @_enum.unique
24 class _Error(_enum.Enum):
25     __TIZEN_YACA_BASE = -0x01E30000
26     NONE = 0
27     INVALID_PARAMETER = -22
28     OUT_OF_MEMORY = -12
29     INTERNAL = __TIZEN_YACA_BASE | 0x01
30     DATA_MISMATCH = __TIZEN_YACA_BASE | 0x02
31     INVALID_PASSWORD = __TIZEN_YACA_BASE | 0x03
32
33
34 def _errcheck(ret, func, arguments):
35     if ret == _Error.NONE.value:
36         return True
37     elif ret == _Error.DATA_MISMATCH.value:
38         return False
39     elif ret == _Error.INVALID_PARAMETER.value:
40         raise _err.InvalidParameterError(
41             'Invalid Parameter error returned from YACA')
42     elif ret == _Error.OUT_OF_MEMORY.value:
43         raise _err.OutOfMemoryError('Out Of Memory error returned from YACA')
44     elif ret == _Error.INTERNAL.value:
45         raise _err.InternalError('Internal error returned from YACA')
46     elif ret == _Error.INVALID_PASSWORD.value:
47         raise _err.InvalidPasswordError(
48             'Invalid Password error returned from YACA')
49     else:
50         raise RuntimeError('Unknown error returned from YACA')
51
52
53 def get_yaca():
54     """Get C library and set argtypes"""
55
56     lib = _ctypes.CDLL("libyaca.so.0")
57
58     # crypto
59     lib.yaca_initialize.argtypes = []
60     lib.yaca_initialize.errcheck = _errcheck
61     lib.yaca_cleanup.argtypes = []
62     lib.yaca_cleanup.restype = None
63     lib.yaca_malloc.argtypes = \
64         [_ctypes.c_size_t, _ctypes.POINTER(_ctypes.c_void_p)]
65     lib.yaca_malloc.errcheck = _errcheck
66     lib.yaca_zalloc.argtypes = \
67         [_ctypes.c_size_t, _ctypes.POINTER(_ctypes.c_void_p)]
68     lib.yaca_zalloc.errcheck = _errcheck
69     lib.yaca_realloc.argtypes = \
70         [_ctypes.c_size_t, _ctypes.POINTER(_ctypes.c_void_p)]
71     lib.yaca_realloc.errcheck = _errcheck
72     lib.yaca_free.argtypes = [_ctypes.c_void_p]
73     lib.yaca_free.restype = None
74     lib.yaca_memcmp.argtypes = \
75         [_ctypes.POINTER(_ctypes.c_char), _ctypes.POINTER(_ctypes.c_char),
76          _ctypes.c_size_t]
77     lib.yaca_memcmp.errcheck = _errcheck
78     lib.yaca_randomize_bytes.argtypes = \
79         [_ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t]
80     lib.yaca_randomize_bytes.errcheck = _errcheck
81     lib.yaca_context_set_property.argtypes = \
82         [_ctypes.c_void_p, _ctypes.c_int, _ctypes.c_void_p, _ctypes.c_size_t]
83     lib.yaca_context_set_property.errcheck = _errcheck
84     lib.yaca_context_get_property.argtypes = \
85         [_ctypes.c_void_p, _ctypes.c_int, _ctypes.POINTER(_ctypes.c_void_p),
86          _ctypes.POINTER(_ctypes.c_size_t)]
87     lib.yaca_context_get_property.errcheck = _errcheck
88     lib.yaca_context_get_output_length.argtypes = \
89         [_ctypes.c_void_p, _ctypes.c_size_t, _ctypes.POINTER(_ctypes.c_size_t)]
90     lib.yaca_context_get_output_length.errcheck = _errcheck
91     lib.yaca_context_destroy.argtypes = [_ctypes.c_void_p]
92     lib.yaca_context_destroy.restype = None
93
94     # simple
95     lib.yaca_simple_encrypt.argtypes = \
96         [_ctypes.c_int, _ctypes.c_int, _ctypes.c_void_p, _ctypes.c_void_p,
97          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
98          _ctypes.POINTER(_ctypes.POINTER(_ctypes.c_char)),
99          _ctypes.POINTER(_ctypes.c_size_t)]
100     lib.yaca_simple_encrypt.errcheck = _errcheck
101     lib.yaca_simple_decrypt.argtypes = \
102         [_ctypes.c_int, _ctypes.c_int, _ctypes.c_void_p, _ctypes.c_void_p,
103          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
104          _ctypes.POINTER(_ctypes.POINTER(_ctypes.c_char)),
105          _ctypes.POINTER(_ctypes.c_size_t)]
106     lib.yaca_simple_decrypt.errcheck = _errcheck
107     lib.yaca_simple_calculate_digest.argtypes = \
108         [_ctypes.c_int, _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
109          _ctypes.POINTER(_ctypes.POINTER(_ctypes.c_char)),
110          _ctypes.POINTER(_ctypes.c_size_t)]
111     lib.yaca_simple_calculate_digest.errcheck = _errcheck
112     lib.yaca_simple_calculate_signature.argtypes = \
113         [_ctypes.c_int, _ctypes.c_void_p,
114          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
115          _ctypes.POINTER(_ctypes.POINTER(_ctypes.c_char)),
116          _ctypes.POINTER(_ctypes.c_size_t)]
117     lib.yaca_simple_calculate_signature.errcheck = _errcheck
118     lib.yaca_simple_verify_signature.argtypes = \
119         [_ctypes.c_int, _ctypes.c_void_p,
120          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
121          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t]
122     lib.yaca_simple_verify_signature.errcheck = _errcheck
123     lib.yaca_simple_calculate_hmac.argtypes = \
124         [_ctypes.c_int, _ctypes.c_void_p,
125          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
126          _ctypes.POINTER(_ctypes.POINTER(_ctypes.c_char)),
127          _ctypes.POINTER(_ctypes.c_size_t)]
128     lib.yaca_simple_calculate_hmac.errcheck = _errcheck
129     lib.yaca_simple_calculate_cmac.argtypes = \
130         [_ctypes.c_int, _ctypes.c_void_p,
131          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
132          _ctypes.POINTER(_ctypes.POINTER(_ctypes.c_char)),
133          _ctypes.POINTER(_ctypes.c_size_t)]
134     lib.yaca_simple_calculate_cmac.errcheck = _errcheck
135
136     # key
137     lib.yaca_key_get_type.argtypes = \
138         [_ctypes.c_void_p, _ctypes.POINTER(_ctypes.c_int)]
139     lib.yaca_key_get_type.errcheck = _errcheck
140     lib.yaca_key_get_bit_length.argtypes = \
141         [_ctypes.c_void_p, _ctypes.POINTER(_ctypes.c_size_t)]
142     lib.yaca_key_get_bit_length.errcheck = _errcheck
143     lib.yaca_key_import.argtypes = \
144         [_ctypes.c_int, _ctypes.c_char_p,
145          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
146          _ctypes.POINTER(_ctypes.c_void_p)]
147     lib.yaca_key_import.errcheck = _errcheck
148     lib.yaca_key_export.argtypes = \
149         [_ctypes.c_void_p, _ctypes.c_int, _ctypes.c_int, _ctypes.c_char_p,
150          _ctypes.POINTER(_ctypes.POINTER(_ctypes.c_char)),
151          _ctypes.POINTER(_ctypes.c_size_t)]
152     lib.yaca_key_export.errcheck = _errcheck
153     lib.yaca_key_generate.argtypes = \
154         [_ctypes.c_void_p, _ctypes.c_size_t, _ctypes.POINTER(_ctypes.c_void_p)]
155     lib.yaca_key_generate.errcheck = _errcheck
156     lib.yaca_key_generate_from_parameters.argtypes = \
157         [_ctypes.c_void_p, _ctypes.POINTER(_ctypes.c_void_p)]
158     lib.yaca_key_generate_from_parameters.errcheck = _errcheck
159     lib.yaca_key_extract_public.argtypes = \
160         [_ctypes.c_void_p, _ctypes.POINTER(_ctypes.c_void_p)]
161     lib.yaca_key_extract_public.errcheck = _errcheck
162     lib.yaca_key_extract_parameters.argtypes = \
163         [_ctypes.c_void_p, _ctypes.POINTER(_ctypes.c_void_p)]
164     lib.yaca_key_extract_parameters.errcheck = _errcheck
165     lib.yaca_key_derive_dh.argtypes = \
166         [_ctypes.c_void_p, _ctypes.c_void_p,
167          _ctypes.POINTER(_ctypes.POINTER(_ctypes.c_char)),
168          _ctypes.POINTER(_ctypes.c_size_t)]
169     lib.yaca_key_derive_dh.errcheck = _errcheck
170     lib.yaca_key_derive_kdf.argtypes = \
171         [_ctypes.c_int, _ctypes.c_int,
172          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
173          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
174          _ctypes.c_size_t, _ctypes.POINTER(_ctypes.POINTER(_ctypes.c_char))]
175     lib.yaca_key_derive_kdf.errcheck = _errcheck
176     lib.yaca_key_derive_pbkdf2.argtypes = \
177         [_ctypes.c_char_p, _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
178          _ctypes.c_size_t, _ctypes.c_int,
179          _ctypes.c_size_t, _ctypes.POINTER(_ctypes.c_void_p)]
180     lib.yaca_key_derive_pbkdf2.errcheck = _errcheck
181     lib.yaca_key_destroy.argtypes = [_ctypes.c_void_p]
182     lib.yaca_key_destroy.restype = None
183
184     # digest
185     lib.yaca_digest_initialize.argtypes = \
186         [_ctypes.POINTER(_ctypes.c_void_p), _ctypes.c_int]
187     lib.yaca_digest_initialize.errcheck = _errcheck
188     lib.yaca_digest_update.argtypes = \
189         [_ctypes.c_void_p, _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t]
190     lib.yaca_digest_update.errcheck = _errcheck
191     lib.yaca_digest_finalize.argtypes = \
192         [_ctypes.c_void_p,
193          _ctypes.POINTER(_ctypes.c_char), _ctypes.POINTER(_ctypes.c_size_t)]
194     lib.yaca_digest_finalize.errcheck = _errcheck
195
196     # encrypt
197     lib.yaca_encrypt_get_iv_bit_length.argtypes = \
198         [_ctypes.c_int, _ctypes.c_int, _ctypes.c_size_t,
199          _ctypes.POINTER(_ctypes.c_size_t)]
200     lib.yaca_encrypt_get_iv_bit_length.errcheck = _errcheck
201     lib.yaca_encrypt_initialize.argtypes = \
202         [_ctypes.POINTER(_ctypes.c_void_p), _ctypes.c_int, _ctypes.c_int,
203          _ctypes.c_void_p, _ctypes.c_void_p]
204     lib.yaca_encrypt_initialize.errcheck = _errcheck
205     lib.yaca_encrypt_update.argtypes = \
206         [_ctypes.c_void_p,
207          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
208          _ctypes.POINTER(_ctypes.c_char), _ctypes.POINTER(_ctypes.c_size_t)]
209     lib.yaca_encrypt_update.errcheck = _errcheck
210     lib.yaca_encrypt_finalize.argtypes = \
211         [_ctypes.c_void_p,
212          _ctypes.POINTER(_ctypes.c_char), _ctypes.POINTER(_ctypes.c_size_t)]
213     lib.yaca_encrypt_finalize.errcheck = _errcheck
214     lib.yaca_decrypt_initialize.argtypes = \
215         [_ctypes.POINTER(_ctypes.c_void_p), _ctypes.c_int, _ctypes.c_int,
216          _ctypes.c_void_p, _ctypes.c_void_p]
217     lib.yaca_decrypt_initialize.errcheck = _errcheck
218     lib.yaca_decrypt_update.argtypes = \
219         [_ctypes.c_void_p,
220          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
221          _ctypes.POINTER(_ctypes.c_char), _ctypes.POINTER(_ctypes.c_size_t)]
222     lib.yaca_decrypt_update.errcheck = _errcheck
223     lib.yaca_decrypt_finalize.argtypes = \
224         [_ctypes.c_void_p,
225          _ctypes.POINTER(_ctypes.c_char), _ctypes.POINTER(_ctypes.c_size_t)]
226     lib.yaca_decrypt_finalize.errcheck = _errcheck
227
228     # sign
229     lib.yaca_sign_initialize.argtypes = \
230         [_ctypes.POINTER(_ctypes.c_void_p), _ctypes.c_int, _ctypes.c_void_p]
231     lib.yaca_sign_initialize.errcheck = _errcheck
232     lib.yaca_sign_initialize_hmac.argtypes = \
233         [_ctypes.POINTER(_ctypes.c_void_p), _ctypes.c_int, _ctypes.c_void_p]
234     lib.yaca_sign_initialize_hmac.errcheck = _errcheck
235     lib.yaca_sign_initialize_cmac.argtypes = \
236         [_ctypes.POINTER(_ctypes.c_void_p), _ctypes.c_int, _ctypes.c_void_p]
237     lib.yaca_sign_initialize_cmac.errcheck = _errcheck
238     lib.yaca_sign_update.argtypes = \
239         [_ctypes.c_void_p, _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t]
240     lib.yaca_sign_update.errcheck = _errcheck
241     lib.yaca_sign_finalize.argtypes = \
242         [_ctypes.c_void_p,
243          _ctypes.POINTER(_ctypes.c_char), _ctypes.POINTER(_ctypes.c_size_t)]
244     lib.yaca_sign_finalize.errcheck = _errcheck
245     lib.yaca_verify_initialize.argtypes = \
246         [_ctypes.POINTER(_ctypes.c_void_p), _ctypes.c_int, _ctypes.c_void_p]
247     lib.yaca_verify_initialize.errcheck = _errcheck
248     lib.yaca_verify_update.argtypes = \
249         [_ctypes.c_void_p, _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t]
250     lib.yaca_verify_update.errcheck = _errcheck
251     lib.yaca_verify_finalize.argtypes = \
252         [_ctypes.c_void_p, _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t]
253     lib.yaca_verify_finalize.errcheck = _errcheck
254
255     # seal
256     lib.yaca_seal_initialize.argtypes = \
257         [_ctypes.POINTER(_ctypes.c_void_p), _ctypes.c_void_p, _ctypes.c_int,
258          _ctypes.c_int, _ctypes.c_size_t, _ctypes.POINTER(_ctypes.c_void_p),
259          _ctypes.POINTER(_ctypes.c_void_p)]
260     lib.yaca_seal_initialize.errcheck = _errcheck
261     lib.yaca_seal_update.argtypes = \
262         [_ctypes.c_void_p, _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
263          _ctypes.POINTER(_ctypes.c_char), _ctypes.POINTER(_ctypes.c_size_t)]
264     lib.yaca_seal_update.errcheck = _errcheck
265     lib.yaca_seal_finalize.argtypes = \
266         [_ctypes.c_void_p,
267          _ctypes.POINTER(_ctypes.c_char), _ctypes.POINTER(_ctypes.c_size_t)]
268     lib.yaca_seal_finalize.errcheck = _errcheck
269     lib.yaca_open_initialize.argtypes = \
270         [_ctypes.POINTER(_ctypes.c_void_p), _ctypes.c_void_p, _ctypes.c_int,
271          _ctypes.c_int, _ctypes.c_size_t, _ctypes.c_void_p, _ctypes.c_void_p]
272     lib.yaca_open_initialize.errcheck = _errcheck
273     lib.yaca_open_update.argtypes = \
274         [_ctypes.c_void_p,
275          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
276          _ctypes.POINTER(_ctypes.c_char), _ctypes.POINTER(_ctypes.c_size_t)]
277     lib.yaca_open_update.errcheck = _errcheck
278     lib.yaca_open_finalize.argtypes = \
279         [_ctypes.c_void_p,
280          _ctypes.POINTER(_ctypes.c_char), _ctypes.POINTER(_ctypes.c_size_t)]
281     lib.yaca_open_finalize.errcheck = _errcheck
282
283     # rsa
284     rsa_argtypes = \
285         [_ctypes.c_int, _ctypes.c_void_p,
286          _ctypes.POINTER(_ctypes.c_char), _ctypes.c_size_t,
287          _ctypes.POINTER(_ctypes.POINTER(_ctypes.c_char)),
288          _ctypes.POINTER(_ctypes.c_size_t)]
289     lib.yaca_rsa_public_encrypt.argtypes = rsa_argtypes
290     lib.yaca_rsa_public_encrypt.errcheck = _errcheck
291     lib.yaca_rsa_private_decrypt.argtypes = rsa_argtypes
292     lib.yaca_rsa_private_decrypt.errcheck = _errcheck
293     lib.yaca_rsa_private_encrypt.argtypes = rsa_argtypes
294     lib.yaca_rsa_private_encrypt.errcheck = _errcheck
295     lib.yaca_rsa_public_decrypt.argtypes = rsa_argtypes
296     lib.yaca_rsa_public_decrypt.errcheck = _errcheck
297
298     return lib