/src/openssl/crypto/rsa/rsa_asn1.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2000-2017 The OpenSSL Project Authors. All Rights Reserved. |
3 | | * |
4 | | * Licensed under the OpenSSL license (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_locl.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 | 773k | { |
25 | 773k | if (operation == ASN1_OP_NEW_PRE) { |
26 | 253k | *pval = (ASN1_VALUE *)RSA_new(); |
27 | 253k | if (*pval != NULL) |
28 | 253k | return 2; |
29 | 0 | return 0; |
30 | 520k | } else if (operation == ASN1_OP_FREE_PRE) { |
31 | 62.1k | RSA_free((RSA *)*pval); |
32 | 62.1k | *pval = NULL; |
33 | 62.1k | return 2; |
34 | 457k | } else if (operation == ASN1_OP_D2I_POST) { |
35 | 191k | if (((RSA *)*pval)->version != RSA_ASN1_VERSION_MULTI) { |
36 | 99.8k | /* not a multi-prime key, skip */ |
37 | 99.8k | return 1; |
38 | 99.8k | } |
39 | 91.9k | return (rsa_multip_calc_product((RSA *)*pval) == 1) ? 2 : 0; |
40 | 91.9k | } |
41 | 266k | return 1; |
42 | 266k | } |
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 | 0 | { |
74 | 0 | if (operation == ASN1_OP_FREE_PRE) { |
75 | 0 | RSA_PSS_PARAMS *pss = (RSA_PSS_PARAMS *)*pval; |
76 | 0 | X509_ALGOR_free(pss->maskHash); |
77 | 0 | } |
78 | 0 | return 1; |
79 | 0 | } |
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 | 0 | { |
94 | 0 | if (operation == ASN1_OP_FREE_PRE) { |
95 | 0 | RSA_OAEP_PARAMS *oaep = (RSA_OAEP_PARAMS *)*pval; |
96 | 0 | X509_ALGOR_free(oaep->maskHash); |
97 | 0 | } |
98 | 0 | return 1; |
99 | 0 | } |
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_const_fname(RSA, RSAPrivateKey, RSAPrivateKey) |
110 | | |
111 | | IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(RSA, RSAPublicKey, RSAPublicKey) |
112 | | |
113 | | RSA *RSAPublicKey_dup(RSA *rsa) |
114 | 0 | { |
115 | 0 | return ASN1_item_dup(ASN1_ITEM_rptr(RSAPublicKey), rsa); |
116 | 0 | } |
117 | | |
118 | | RSA *RSAPrivateKey_dup(RSA *rsa) |
119 | 0 | { |
120 | 0 | return ASN1_item_dup(ASN1_ITEM_rptr(RSAPrivateKey), rsa); |
121 | 0 | } |