xref: /openbmc/qemu/include/crypto/akcipher.h (revision 782ee711)
1 /*
2  * QEMU Crypto asymmetric algorithms
3  *
4  * Copyright (c) 2022 Bytedance
5  * Author: zhenwei pi <pizhenwei@bytedance.com>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef QCRYPTO_AKCIPHER_H
23 #define QCRYPTO_AKCIPHER_H
24 
25 #include "qapi/qapi-types-crypto.h"
26 
27 typedef struct QCryptoAkCipher QCryptoAkCipher;
28 
29 /**
30  * qcrypto_akcipher_supports:
31  * @opts: the asymmetric key algorithm and related options
32  *
33  * Determine if asymmetric key cipher described with @opts is
34  * supported by the current configured build
35  *
36  * Returns: true if it is supported, false otherwise.
37  */
38 bool qcrypto_akcipher_supports(QCryptoAkCipherOptions *opts);
39 
40 /**
41  * qcrypto_akcipher_new:
42  * @opts: specify the algorithm and the related arguments
43  * @type: private or public key type
44  * @key: buffer to store the key
45  * @key_len: the length of key buffer
46  * @errp: error pointer
47  *
48  * Create akcipher context
49  *
50  * Returns: On success, a new QCryptoAkCipher initialized with @opt
51  * is created and returned, otherwise NULL is returned.
52  */
53 
54 QCryptoAkCipher *qcrypto_akcipher_new(const QCryptoAkCipherOptions *opts,
55                                       QCryptoAkCipherKeyType type,
56                                       const uint8_t *key, size_t key_len,
57                                       Error **errp);
58 
59 /**
60  * qcrypto_akcipher_encrypt:
61  * @akcipher: akcipher context
62  * @in: plaintext pending to be encrypted
63  * @in_len: length of plaintext, less or equal to the size reported
64  *          by a call to qcrypto_akcipher_max_plaintext_len()
65  * @out: buffer to store the ciphertext
66  * @out_len: length of ciphertext, less or equal to the size reported
67  *           by a call to qcrypto_akcipher_max_ciphertext_len()
68  * @errp: error pointer
69  *
70  * Encrypt @in and write ciphertext into @out
71  *
72  * Returns: length of ciphertext if encrypt succeed,
73  *          otherwise -1 is returned
74  */
75 int qcrypto_akcipher_encrypt(QCryptoAkCipher *akcipher,
76                              const void *in, size_t in_len,
77                              void *out, size_t out_len, Error **errp);
78 
79 /**
80  * qcrypto_akcipher_decrypt:
81  * @akcipher: akcipher context
82  * @in: ciphertext to be decrypted
83  * @in_len: the length of ciphertext, less or equal to the size reported
84  *          by a call to qcrypto_akcipher_max_ciphertext_len()
85  * @out: buffer to store the plaintext
86  * @out_len: length of the plaintext buffer, less or equal to the size
87  *           reported by a call to qcrypto_akcipher_max_plaintext_len()
88  * @errp: error pointer
89  *
90  * Decrypt @in and write plaintext into @out
91  *
92  * Returns: length of plaintext if decrypt succeed,
93  *          otherwise -1 is returned
94  */
95 int qcrypto_akcipher_decrypt(QCryptoAkCipher *akcipher,
96                              const void *in, size_t in_len,
97                              void *out, size_t out_len, Error **errp);
98 
99 /**
100  * qcrypto_akcipher_sign:
101  * @akcipher: akcipher context
102  * @in: data to be signed
103  * @in_len: the length of data, less or equal to the size reported
104  *          by a call to qcrypto_akcipher_max_dgst_len()
105  * @out: buffer to store the signature
106  * @out_len: length of the signature buffer, less or equal to the size
107  *           by a call to qcrypto_akcipher_max_signature_len()
108  * @errp: error pointer
109  *
110  * Generate signature for @in, write into @out
111  *
112  * Returns: length of signature if succeed,
113  *          otherwise -1 is returned
114  */
115 int qcrypto_akcipher_sign(QCryptoAkCipher *akcipher,
116                           const void *in, size_t in_len,
117                           void *out, size_t out_len, Error **errp);
118 
119 /**
120  * qcrypto_akcipher_verify:
121  * @akcipher: akcipher context
122  * @in: pointer to the signature
123  * @in_len: length of signature, ess or equal to the size reported
124  *          by a call to qcrypto_akcipher_max_signature_len()
125  * @in2: pointer to original data
126  * @in2_len: the length of original data, less or equal to the size
127  *           by a call to qcrypto_akcipher_max_dgst_len()
128  * @errp: error pointer
129  *
130  * Verify @in and @in2 match or not
131  *
132  * Returns: 0 for succeed,
133  *          otherwise -1 is returned
134  */
135 int qcrypto_akcipher_verify(QCryptoAkCipher *akcipher,
136                             const void *in, size_t in_len,
137                             const void *in2, size_t in2_len, Error **errp);
138 
139 int qcrypto_akcipher_max_plaintext_len(QCryptoAkCipher *akcipher);
140 
141 int qcrypto_akcipher_max_ciphertext_len(QCryptoAkCipher *akcipher);
142 
143 int qcrypto_akcipher_max_signature_len(QCryptoAkCipher *akcipher);
144 
145 int qcrypto_akcipher_max_dgst_len(QCryptoAkCipher *akcipher);
146 
147 /**
148  * qcrypto_akcipher_free:
149  * @akcipher: akcipher context
150  *
151  * Free the akcipher context
152  *
153  */
154 void qcrypto_akcipher_free(QCryptoAkCipher *akcipher);
155 
156 /**
157  * qcrypto_akcipher_export_p8info:
158  * @opts: the options of the akcipher to be exported.
159  * @key: the original key of the akcipher to be exported.
160  * @keylen: length of the 'key'
161  * @dst: output parameter, if export succeed, *dst is set to the
162  * PKCS#8 encoded private key, caller MUST free this key with
163  * g_free after use.
164  * @dst_len: output parameter, indicates the length of PKCS#8 encoded
165  * key.
166  *
167  * Export the akcipher into DER encoded pkcs#8 private key info, expects
168  * |key| stores a valid asymmetric PRIVATE key.
169  *
170  * Returns: 0 for succeed, otherwise -1 is returned.
171  */
172 int qcrypto_akcipher_export_p8info(const QCryptoAkCipherOptions *opts,
173                                    uint8_t *key, size_t keylen,
174                                    uint8_t **dst, size_t *dst_len,
175                                    Error **errp);
176 
177 G_DEFINE_AUTOPTR_CLEANUP_FUNC(QCryptoAkCipher, qcrypto_akcipher_free)
178 
179 #endif /* QCRYPTO_AKCIPHER_H */
180