qemu/crypto/rsakey.h
<<
>>
Prefs
   1/*
   2 * QEMU Crypto RSA key parser
   3 *
   4 * Copyright (c) 2022 Bytedance
   5 * Author: lei he <helei.sig11@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_RSAKEY_H
  23#define QCRYPTO_RSAKEY_H
  24
  25#include "qemu/host-utils.h"
  26#include "crypto/akcipher.h"
  27
  28typedef struct QCryptoAkCipherRSAKey QCryptoAkCipherRSAKey;
  29typedef struct QCryptoAkCipherMPI QCryptoAkCipherMPI;
  30
  31/**
  32 * Multiple precious integer, encoded as two' complement,
  33 * copied directly from DER encoded ASN.1 structures.
  34 */
  35struct QCryptoAkCipherMPI {
  36    uint8_t *data;
  37    size_t len;
  38};
  39
  40/* See rfc2437: https://datatracker.ietf.org/doc/html/rfc2437 */
  41struct QCryptoAkCipherRSAKey {
  42    /* The modulus */
  43    QCryptoAkCipherMPI n;
  44    /* The public exponent */
  45    QCryptoAkCipherMPI e;
  46    /* The private exponent */
  47    QCryptoAkCipherMPI d;
  48    /* The first factor */
  49    QCryptoAkCipherMPI p;
  50    /* The second factor */
  51    QCryptoAkCipherMPI q;
  52    /* The first factor's exponent */
  53    QCryptoAkCipherMPI dp;
  54    /* The second factor's exponent */
  55    QCryptoAkCipherMPI dq;
  56    /* The CRT coefficient */
  57    QCryptoAkCipherMPI u;
  58};
  59
  60/**
  61 * Parse DER encoded ASN.1 RSA keys, expected ASN.1 schemas:
  62 *        RsaPrivKey ::= SEQUENCE {
  63 *             version     INTEGER
  64 *             n           INTEGER
  65 *             e           INTEGER
  66 *             d           INTEGER
  67 *             p           INTEGER
  68 *             q           INTEGER
  69 *             dp          INTEGER
  70 *             dq          INTEGER
  71 *             u           INTEGER
  72 *       otherPrimeInfos   OtherPrimeInfos OPTIONAL
  73 *         }
  74 *
  75 *        RsaPubKey ::= SEQUENCE {
  76 *             n           INTEGER
  77 *             e           INTEGER
  78 *         }
  79 *
  80 * Returns: On success QCryptoAkCipherRSAKey is returned, otherwise returns NULL
  81 */
  82QCryptoAkCipherRSAKey *qcrypto_akcipher_rsakey_parse(
  83    QCryptoAkCipherKeyType type,
  84    const uint8_t *key, size_t keylen, Error **errp);
  85
  86/**
  87 * qcrypto_akcipher_rsakey_export_as_p8info:
  88 *
  89 * Export RSA private key to PKCS#8 private key info.
  90 */
  91void qcrypto_akcipher_rsakey_export_p8info(const uint8_t *key,
  92                                           size_t keylen,
  93                                           uint8_t **dst,
  94                                           size_t *dlen);
  95
  96void qcrypto_akcipher_rsakey_free(QCryptoAkCipherRSAKey *key);
  97
  98G_DEFINE_AUTOPTR_CLEANUP_FUNC(QCryptoAkCipherRSAKey,
  99                              qcrypto_akcipher_rsakey_free);
 100
 101#endif
 102