| /* | 
 |  * QEMU Crypto RSA key parser | 
 |  * | 
 |  * Copyright (c) 2022 Bytedance | 
 |  * Author: lei he <helei.sig11@bytedance.com> | 
 |  * | 
 |  * This library is free software; you can redistribute it and/or | 
 |  * modify it under the terms of the GNU Lesser General Public | 
 |  * License as published by the Free Software Foundation; either | 
 |  * version 2.1 of the License, or (at your option) any later version. | 
 |  * | 
 |  * This library is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 |  * Lesser General Public License for more details. | 
 |  * | 
 |  * You should have received a copy of the GNU Lesser General Public | 
 |  * License along with this library; if not, see <http://www.gnu.org/licenses/>. | 
 |  * | 
 |  */ | 
 |  | 
 | #include "qemu/osdep.h" | 
 | #include "der.h" | 
 | #include "rsakey.h" | 
 |  | 
 | void qcrypto_akcipher_rsakey_free(QCryptoAkCipherRSAKey *rsa_key) | 
 | { | 
 |     if (!rsa_key) { | 
 |         return; | 
 |     } | 
 |     g_free(rsa_key->n.data); | 
 |     g_free(rsa_key->e.data); | 
 |     g_free(rsa_key->d.data); | 
 |     g_free(rsa_key->p.data); | 
 |     g_free(rsa_key->q.data); | 
 |     g_free(rsa_key->dp.data); | 
 |     g_free(rsa_key->dq.data); | 
 |     g_free(rsa_key->u.data); | 
 |     g_free(rsa_key); | 
 | } | 
 |  | 
 | /** | 
 |  * PKCS#8 private key info for RSA | 
 |  * | 
 |  * PrivateKeyInfo ::= SEQUENCE { | 
 |  * version         INTEGER, | 
 |  * privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, | 
 |  * privateKey      OCTET STRING, | 
 |  * attributes      [0] IMPLICIT Attributes OPTIONAL | 
 |  * } | 
 |  */ | 
 | void qcrypto_akcipher_rsakey_export_p8info(const uint8_t *key, | 
 |                                            size_t keylen, | 
 |                                            uint8_t **dst, | 
 |                                            size_t *dlen) | 
 | { | 
 |     QCryptoEncodeContext *ctx = qcrypto_der_encode_ctx_new(); | 
 |     uint8_t version = 0; | 
 |  | 
 |     qcrypto_der_encode_seq_begin(ctx); | 
 |  | 
 |     /* version */ | 
 |     qcrypto_der_encode_int(ctx, &version, sizeof(version)); | 
 |  | 
 |     /* algorithm identifier */ | 
 |     qcrypto_der_encode_seq_begin(ctx); | 
 |     qcrypto_der_encode_oid(ctx, (uint8_t *)QCRYPTO_OID_rsaEncryption, | 
 |                            sizeof(QCRYPTO_OID_rsaEncryption) - 1); | 
 |     qcrypto_der_encode_null(ctx); | 
 |     qcrypto_der_encode_seq_end(ctx); | 
 |  | 
 |     /* RSA private key */ | 
 |     qcrypto_der_encode_octet_str(ctx, key, keylen); | 
 |  | 
 |     qcrypto_der_encode_seq_end(ctx); | 
 |  | 
 |     *dlen = qcrypto_der_encode_ctx_buffer_len(ctx); | 
 |     *dst = g_malloc(*dlen); | 
 |     qcrypto_der_encode_ctx_flush_and_free(ctx, *dst); | 
 | } | 
 |  | 
 | #if defined(CONFIG_NETTLE) && defined(CONFIG_HOGWEED) | 
 | #include "rsakey-nettle.c.inc" | 
 | #else | 
 | #include "rsakey-builtin.c.inc" | 
 | #endif |