1 | /* |
2 | * Copyright 2000-2017 The OpenSSL Project Authors. All Rights Reserved. |
3 | * |
4 | * Licensed under the Apache License 2.0 (the "License"). You may not use |
5 | * this file except in compliance with the License. You can obtain a copy |
6 | * in the file LICENSE in the source distribution or at |
7 | * https://www.openssl.org/source/license.html |
8 | */ |
9 | |
10 | #include <stdio.h> |
11 | #include "internal/cryptlib.h" |
12 | #include <openssl/bn.h> |
13 | #include <openssl/x509.h> |
14 | #include <openssl/asn1t.h> |
15 | #include "rsa_local.h" |
16 | |
17 | /* |
18 | * Override the default free and new methods, |
19 | * and calculate helper products for multi-prime |
20 | * RSA keys. |
21 | */ |
22 | static int rsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
23 | void *exarg) |
24 | { |
25 | if (operation == ASN1_OP_NEW_PRE) { |
26 | *pval = (ASN1_VALUE *)RSA_new(); |
27 | if (*pval != NULL) |
28 | return 2; |
29 | return 0; |
30 | } else if (operation == ASN1_OP_FREE_PRE) { |
31 | RSA_free((RSA *)*pval); |
32 | *pval = NULL; |
33 | return 2; |
34 | } else if (operation == ASN1_OP_D2I_POST) { |
35 | if (((RSA *)*pval)->version != RSA_ASN1_VERSION_MULTI) { |
36 | /* not a multi-prime key, skip */ |
37 | return 1; |
38 | } |
39 | return (rsa_multip_calc_product((RSA *)*pval) == 1) ? 2 : 0; |
40 | } |
41 | return 1; |
42 | } |
43 | |
44 | /* Based on definitions in RFC 8017 appendix A.1.2 */ |
45 | ASN1_SEQUENCE(RSA_PRIME_INFO) = { |
46 | ASN1_SIMPLE(RSA_PRIME_INFO, r, CBIGNUM), |
47 | ASN1_SIMPLE(RSA_PRIME_INFO, d, CBIGNUM), |
48 | ASN1_SIMPLE(RSA_PRIME_INFO, t, CBIGNUM), |
49 | } ASN1_SEQUENCE_END(RSA_PRIME_INFO) |
50 | |
51 | ASN1_SEQUENCE_cb(RSAPrivateKey, rsa_cb) = { |
52 | ASN1_EMBED(RSA, version, INT32), |
53 | ASN1_SIMPLE(RSA, n, BIGNUM), |
54 | ASN1_SIMPLE(RSA, e, BIGNUM), |
55 | ASN1_SIMPLE(RSA, d, CBIGNUM), |
56 | ASN1_SIMPLE(RSA, p, CBIGNUM), |
57 | ASN1_SIMPLE(RSA, q, CBIGNUM), |
58 | ASN1_SIMPLE(RSA, dmp1, CBIGNUM), |
59 | ASN1_SIMPLE(RSA, dmq1, CBIGNUM), |
60 | ASN1_SIMPLE(RSA, iqmp, CBIGNUM), |
61 | ASN1_SEQUENCE_OF_OPT(RSA, prime_infos, RSA_PRIME_INFO) |
62 | } ASN1_SEQUENCE_END_cb(RSA, RSAPrivateKey) |
63 | |
64 | |
65 | ASN1_SEQUENCE_cb(RSAPublicKey, rsa_cb) = { |
66 | ASN1_SIMPLE(RSA, n, BIGNUM), |
67 | ASN1_SIMPLE(RSA, e, BIGNUM), |
68 | } ASN1_SEQUENCE_END_cb(RSA, RSAPublicKey) |
69 | |
70 | /* Free up maskHash */ |
71 | static int rsa_pss_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
72 | void *exarg) |
73 | { |
74 | if (operation == ASN1_OP_FREE_PRE) { |
75 | RSA_PSS_PARAMS *pss = (RSA_PSS_PARAMS *)*pval; |
76 | X509_ALGOR_free(pss->maskHash); |
77 | } |
78 | return 1; |
79 | } |
80 | |
81 | ASN1_SEQUENCE_cb(RSA_PSS_PARAMS, rsa_pss_cb) = { |
82 | ASN1_EXP_OPT(RSA_PSS_PARAMS, hashAlgorithm, X509_ALGOR,0), |
83 | ASN1_EXP_OPT(RSA_PSS_PARAMS, maskGenAlgorithm, X509_ALGOR,1), |
84 | ASN1_EXP_OPT(RSA_PSS_PARAMS, saltLength, ASN1_INTEGER,2), |
85 | ASN1_EXP_OPT(RSA_PSS_PARAMS, trailerField, ASN1_INTEGER,3) |
86 | } ASN1_SEQUENCE_END_cb(RSA_PSS_PARAMS, RSA_PSS_PARAMS) |
87 | |
88 | IMPLEMENT_ASN1_FUNCTIONS(RSA_PSS_PARAMS) |
89 | |
90 | /* Free up maskHash */ |
91 | static int rsa_oaep_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
92 | void *exarg) |
93 | { |
94 | if (operation == ASN1_OP_FREE_PRE) { |
95 | RSA_OAEP_PARAMS *oaep = (RSA_OAEP_PARAMS *)*pval; |
96 | X509_ALGOR_free(oaep->maskHash); |
97 | } |
98 | return 1; |
99 | } |
100 | |
101 | ASN1_SEQUENCE_cb(RSA_OAEP_PARAMS, rsa_oaep_cb) = { |
102 | ASN1_EXP_OPT(RSA_OAEP_PARAMS, hashFunc, X509_ALGOR, 0), |
103 | ASN1_EXP_OPT(RSA_OAEP_PARAMS, maskGenFunc, X509_ALGOR, 1), |
104 | ASN1_EXP_OPT(RSA_OAEP_PARAMS, pSourceFunc, X509_ALGOR, 2), |
105 | } ASN1_SEQUENCE_END_cb(RSA_OAEP_PARAMS, RSA_OAEP_PARAMS) |
106 | |
107 | IMPLEMENT_ASN1_FUNCTIONS(RSA_OAEP_PARAMS) |
108 | |
109 | IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(RSA, RSAPrivateKey, RSAPrivateKey) |
110 | |
111 | IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(RSA, RSAPublicKey, RSAPublicKey) |
112 | |
113 | RSA *RSAPublicKey_dup(const RSA *rsa) |
114 | { |
115 | return ASN1_item_dup(ASN1_ITEM_rptr(RSAPublicKey), rsa); |
116 | } |
117 | |
118 | RSA *RSAPrivateKey_dup(const RSA *rsa) |
119 | { |
120 | return ASN1_item_dup(ASN1_ITEM_rptr(RSAPrivateKey), rsa); |
121 | } |
122 | |