| /* |
| * 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 |