xref: /qemu/crypto/rsakey.c (revision 58660863)
14c5e512eSLei He /*
24c5e512eSLei He  * QEMU Crypto RSA key parser
34c5e512eSLei He  *
44c5e512eSLei He  * Copyright (c) 2022 Bytedance
54c5e512eSLei He  * Author: lei he <helei.sig11@bytedance.com>
64c5e512eSLei He  *
74c5e512eSLei He  * This library is free software; you can redistribute it and/or
84c5e512eSLei He  * modify it under the terms of the GNU Lesser General Public
94c5e512eSLei He  * License as published by the Free Software Foundation; either
104c5e512eSLei He  * version 2.1 of the License, or (at your option) any later version.
114c5e512eSLei He  *
124c5e512eSLei He  * This library is distributed in the hope that it will be useful,
134c5e512eSLei He  * but WITHOUT ANY WARRANTY; without even the implied warranty of
144c5e512eSLei He  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
154c5e512eSLei He  * Lesser General Public License for more details.
164c5e512eSLei He  *
174c5e512eSLei He  * You should have received a copy of the GNU Lesser General Public
184c5e512eSLei He  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
194c5e512eSLei He  *
204c5e512eSLei He  */
214c5e512eSLei He 
22*58660863SLei He #include "qemu/osdep.h"
23*58660863SLei He #include "der.h"
244c5e512eSLei He #include "rsakey.h"
254c5e512eSLei He 
qcrypto_akcipher_rsakey_free(QCryptoAkCipherRSAKey * rsa_key)264c5e512eSLei He void qcrypto_akcipher_rsakey_free(QCryptoAkCipherRSAKey *rsa_key)
274c5e512eSLei He {
284c5e512eSLei He     if (!rsa_key) {
294c5e512eSLei He         return;
304c5e512eSLei He     }
314c5e512eSLei He     g_free(rsa_key->n.data);
324c5e512eSLei He     g_free(rsa_key->e.data);
334c5e512eSLei He     g_free(rsa_key->d.data);
344c5e512eSLei He     g_free(rsa_key->p.data);
354c5e512eSLei He     g_free(rsa_key->q.data);
364c5e512eSLei He     g_free(rsa_key->dp.data);
374c5e512eSLei He     g_free(rsa_key->dq.data);
384c5e512eSLei He     g_free(rsa_key->u.data);
394c5e512eSLei He     g_free(rsa_key);
404c5e512eSLei He }
414c5e512eSLei He 
42*58660863SLei He /**
43*58660863SLei He  * PKCS#8 private key info for RSA
44*58660863SLei He  *
45*58660863SLei He  * PrivateKeyInfo ::= SEQUENCE {
46*58660863SLei He  * version         INTEGER,
47*58660863SLei He  * privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
48*58660863SLei He  * privateKey      OCTET STRING,
49*58660863SLei He  * attributes      [0] IMPLICIT Attributes OPTIONAL
50*58660863SLei He  * }
51*58660863SLei He  */
qcrypto_akcipher_rsakey_export_p8info(const uint8_t * key,size_t keylen,uint8_t ** dst,size_t * dlen)52*58660863SLei He void qcrypto_akcipher_rsakey_export_p8info(const uint8_t *key,
53*58660863SLei He                                            size_t keylen,
54*58660863SLei He                                            uint8_t **dst,
55*58660863SLei He                                            size_t *dlen)
56*58660863SLei He {
57*58660863SLei He     QCryptoEncodeContext *ctx = qcrypto_der_encode_ctx_new();
58*58660863SLei He     uint8_t version = 0;
59*58660863SLei He 
60*58660863SLei He     qcrypto_der_encode_seq_begin(ctx);
61*58660863SLei He 
62*58660863SLei He     /* version */
63*58660863SLei He     qcrypto_der_encode_int(ctx, &version, sizeof(version));
64*58660863SLei He 
65*58660863SLei He     /* algorithm identifier */
66*58660863SLei He     qcrypto_der_encode_seq_begin(ctx);
67*58660863SLei He     qcrypto_der_encode_oid(ctx, (uint8_t *)QCRYPTO_OID_rsaEncryption,
68*58660863SLei He                            sizeof(QCRYPTO_OID_rsaEncryption) - 1);
69*58660863SLei He     qcrypto_der_encode_null(ctx);
70*58660863SLei He     qcrypto_der_encode_seq_end(ctx);
71*58660863SLei He 
72*58660863SLei He     /* RSA private key */
73*58660863SLei He     qcrypto_der_encode_octet_str(ctx, key, keylen);
74*58660863SLei He 
75*58660863SLei He     qcrypto_der_encode_seq_end(ctx);
76*58660863SLei He 
77*58660863SLei He     *dlen = qcrypto_der_encode_ctx_buffer_len(ctx);
78*58660863SLei He     *dst = g_malloc(*dlen);
79*58660863SLei He     qcrypto_der_encode_ctx_flush_and_free(ctx, *dst);
80*58660863SLei He }
81*58660863SLei He 
824c5e512eSLei He #if defined(CONFIG_NETTLE) && defined(CONFIG_HOGWEED)
834c5e512eSLei He #include "rsakey-nettle.c.inc"
844c5e512eSLei He #else
854c5e512eSLei He #include "rsakey-builtin.c.inc"
864c5e512eSLei He #endif
87