Line data Source code
1 : /*
2 : * GPAC - Multimedia Framework C SDK
3 : *
4 : * Authors: Jean Le Feuvre
5 : * Copyright (c) Telecom ParisTech 2000-2018
6 : * All rights reserved
7 : *
8 : * This file is part of GPAC / crypto lib sub-project
9 : *
10 : * GPAC is free software; you can redistribute it and/or modify
11 : * it under the terms of the GNU Lesser General Public License as published by
12 : * the Free Software Foundation; either version 2, or (at your option)
13 : * any later version.
14 : *
15 : * GPAC is distributed in the hope that it will be useful,
16 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 : * GNU Lesser General Public License for more details.
19 : *
20 : * You should have received a copy of the GNU Lesser General Public
21 : * License along with this library; see the file COPYING. If not, write to
22 : * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
23 : *
24 : */
25 :
26 : #include <gpac/internal/crypt_dev.h>
27 :
28 : GF_EXPORT
29 521 : GF_Crypt *gf_crypt_open(GF_CRYPTO_ALGO algorithm, GF_CRYPTO_MODE mode)
30 : {
31 : GF_Crypt *td;
32 : GF_Err e;
33 :
34 521 : GF_SAFEALLOC(td, GF_Crypt);
35 521 : if (td == NULL) return NULL;
36 :
37 : #ifdef GPAC_HAS_SSL
38 521 : e = gf_crypt_open_open_openssl(td, mode);
39 : #else
40 : e = gf_crypt_open_open_tinyaes(td, mode);
41 : #endif
42 :
43 521 : if (e != GF_OK) {
44 0 : gf_free(td);
45 0 : return NULL;
46 : }
47 : return td;
48 : }
49 :
50 : GF_EXPORT
51 521 : void gf_crypt_close(GF_Crypt *td)
52 : {
53 521 : if (!td) return;
54 521 : td->_deinit_crypt(td);
55 521 : gf_free(td->context);
56 521 : gf_free(td);
57 : }
58 :
59 : GF_EXPORT
60 172 : GF_Err gf_crypt_set_key(GF_Crypt *td, void *key)
61 : {
62 172 : td->_set_key(td, key);
63 172 : return GF_OK;
64 : }
65 :
66 : GF_EXPORT
67 48314 : GF_Err gf_crypt_set_IV(GF_Crypt *td, const void *iv, u32 size)
68 : {
69 48314 : if (!td) return GF_BAD_PARAM;
70 48314 : return td->_set_state(td, (void *)iv, size);
71 : }
72 :
73 23717 : GF_Err gf_crypt_get_IV(GF_Crypt *td, void *iv, u32 *size)
74 : {
75 23717 : if (!td) return GF_BAD_PARAM;
76 23717 : return td->_get_state(td, iv, size);
77 : }
78 :
79 :
80 : GF_EXPORT
81 682 : GF_Err gf_crypt_init(GF_Crypt *td, void *key, const void *IV)
82 : {
83 : GF_Err e;
84 :
85 682 : e = td->_init_crypt(td, key, IV);
86 682 : if (e != GF_OK) gf_crypt_close(td);
87 : //need for openssl we have 2 passes init
88 682 : td->_set_key(td, key);
89 682 : return e;
90 : }
91 :
92 : GF_EXPORT
93 87044 : GF_Err gf_crypt_encrypt(GF_Crypt *td, void *plaintext, u32 len)
94 : {
95 87044 : if (!td) return GF_BAD_PARAM;
96 87044 : return td->_crypt(td, plaintext, len);
97 : }
98 :
99 : GF_EXPORT
100 75346 : GF_Err gf_crypt_decrypt(GF_Crypt *td, void *ciphertext, u32 len)
101 : {
102 75346 : if (!td) return GF_BAD_PARAM;
103 75346 : if (!len) return GF_OK;
104 69822 : return td->_decrypt(td, ciphertext, len);
105 : }
|