]>
Commit | Line | Data |
---|---|---|
4c5e512e LH |
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 | ||
58660863 LH |
22 | #include "qemu/osdep.h" |
23 | #include "der.h" | |
4c5e512e LH |
24 | #include "rsakey.h" |
25 | ||
26 | void qcrypto_akcipher_rsakey_free(QCryptoAkCipherRSAKey *rsa_key) | |
27 | { | |
28 | if (!rsa_key) { | |
29 | return; | |
30 | } | |
31 | g_free(rsa_key->n.data); | |
32 | g_free(rsa_key->e.data); | |
33 | g_free(rsa_key->d.data); | |
34 | g_free(rsa_key->p.data); | |
35 | g_free(rsa_key->q.data); | |
36 | g_free(rsa_key->dp.data); | |
37 | g_free(rsa_key->dq.data); | |
38 | g_free(rsa_key->u.data); | |
39 | g_free(rsa_key); | |
40 | } | |
41 | ||
58660863 LH |
42 | /** |
43 | * PKCS#8 private key info for RSA | |
44 | * | |
45 | * PrivateKeyInfo ::= SEQUENCE { | |
46 | * version INTEGER, | |
47 | * privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, | |
48 | * privateKey OCTET STRING, | |
49 | * attributes [0] IMPLICIT Attributes OPTIONAL | |
50 | * } | |
51 | */ | |
52 | void qcrypto_akcipher_rsakey_export_p8info(const uint8_t *key, | |
53 | size_t keylen, | |
54 | uint8_t **dst, | |
55 | size_t *dlen) | |
56 | { | |
57 | QCryptoEncodeContext *ctx = qcrypto_der_encode_ctx_new(); | |
58 | uint8_t version = 0; | |
59 | ||
60 | qcrypto_der_encode_seq_begin(ctx); | |
61 | ||
62 | /* version */ | |
63 | qcrypto_der_encode_int(ctx, &version, sizeof(version)); | |
64 | ||
65 | /* algorithm identifier */ | |
66 | qcrypto_der_encode_seq_begin(ctx); | |
67 | qcrypto_der_encode_oid(ctx, (uint8_t *)QCRYPTO_OID_rsaEncryption, | |
68 | sizeof(QCRYPTO_OID_rsaEncryption) - 1); | |
69 | qcrypto_der_encode_null(ctx); | |
70 | qcrypto_der_encode_seq_end(ctx); | |
71 | ||
72 | /* RSA private key */ | |
73 | qcrypto_der_encode_octet_str(ctx, key, keylen); | |
74 | ||
75 | qcrypto_der_encode_seq_end(ctx); | |
76 | ||
77 | *dlen = qcrypto_der_encode_ctx_buffer_len(ctx); | |
78 | *dst = g_malloc(*dlen); | |
79 | qcrypto_der_encode_ctx_flush_and_free(ctx, *dst); | |
80 | } | |
81 | ||
4c5e512e LH |
82 | #if defined(CONFIG_NETTLE) && defined(CONFIG_HOGWEED) |
83 | #include "rsakey-nettle.c.inc" | |
84 | #else | |
85 | #include "rsakey-builtin.c.inc" | |
86 | #endif |