|  | /* | 
|  | * 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/>. | 
|  | * | 
|  | */ | 
|  |  | 
|  | #ifndef QCRYPTO_RSAKEY_H | 
|  | #define QCRYPTO_RSAKEY_H | 
|  |  | 
|  | #include "qemu/host-utils.h" | 
|  | #include "crypto/akcipher.h" | 
|  |  | 
|  | typedef struct QCryptoAkCipherRSAKey QCryptoAkCipherRSAKey; | 
|  | typedef struct QCryptoAkCipherMPI QCryptoAkCipherMPI; | 
|  |  | 
|  | /** | 
|  | * Multiple precious integer, encoded as two' complement, | 
|  | * copied directly from DER encoded ASN.1 structures. | 
|  | */ | 
|  | struct QCryptoAkCipherMPI { | 
|  | uint8_t *data; | 
|  | size_t len; | 
|  | }; | 
|  |  | 
|  | /* See rfc2437: https://datatracker.ietf.org/doc/html/rfc2437 */ | 
|  | struct QCryptoAkCipherRSAKey { | 
|  | /* The modulus */ | 
|  | QCryptoAkCipherMPI n; | 
|  | /* The public exponent */ | 
|  | QCryptoAkCipherMPI e; | 
|  | /* The private exponent */ | 
|  | QCryptoAkCipherMPI d; | 
|  | /* The first factor */ | 
|  | QCryptoAkCipherMPI p; | 
|  | /* The second factor */ | 
|  | QCryptoAkCipherMPI q; | 
|  | /* The first factor's exponent */ | 
|  | QCryptoAkCipherMPI dp; | 
|  | /* The second factor's exponent */ | 
|  | QCryptoAkCipherMPI dq; | 
|  | /* The CRT coefficient */ | 
|  | QCryptoAkCipherMPI u; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Parse DER encoded ASN.1 RSA keys, expected ASN.1 schemas: | 
|  | *        RsaPrivKey ::= SEQUENCE { | 
|  | *             version     INTEGER | 
|  | *             n           INTEGER | 
|  | *             e           INTEGER | 
|  | *             d           INTEGER | 
|  | *             p           INTEGER | 
|  | *             q           INTEGER | 
|  | *             dp          INTEGER | 
|  | *             dq          INTEGER | 
|  | *             u           INTEGER | 
|  | *       otherPrimeInfos   OtherPrimeInfos OPTIONAL | 
|  | *         } | 
|  | * | 
|  | *        RsaPubKey ::= SEQUENCE { | 
|  | *             n           INTEGER | 
|  | *             e           INTEGER | 
|  | *         } | 
|  | * | 
|  | * Returns: On success QCryptoAkCipherRSAKey is returned, otherwise returns NULL | 
|  | */ | 
|  | QCryptoAkCipherRSAKey *qcrypto_akcipher_rsakey_parse( | 
|  | QCryptoAkCipherKeyType type, | 
|  | const uint8_t *key, size_t keylen, Error **errp); | 
|  |  | 
|  | /** | 
|  | * qcrypto_akcipher_rsakey_export_as_p8info: | 
|  | * | 
|  | * Export RSA private key to PKCS#8 private key info. | 
|  | */ | 
|  | void qcrypto_akcipher_rsakey_export_p8info(const uint8_t *key, | 
|  | size_t keylen, | 
|  | uint8_t **dst, | 
|  | size_t *dlen); | 
|  |  | 
|  | void qcrypto_akcipher_rsakey_free(QCryptoAkCipherRSAKey *key); | 
|  |  | 
|  | G_DEFINE_AUTOPTR_CLEANUP_FUNC(QCryptoAkCipherRSAKey, | 
|  | qcrypto_akcipher_rsakey_free); | 
|  |  | 
|  | #endif |