Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/rsa/rsa_pk1.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* | - | ||||||||||||
2 | * Copyright 1995-2018 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 "internal/constant_time_locl.h" | - | ||||||||||||
11 | - | |||||||||||||
12 | #include <stdio.h> | - | ||||||||||||
13 | #include "internal/cryptlib.h" | - | ||||||||||||
14 | #include <openssl/bn.h> | - | ||||||||||||
15 | #include <openssl/rsa.h> | - | ||||||||||||
16 | #include <openssl/rand.h> | - | ||||||||||||
17 | - | |||||||||||||
18 | int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen, | - | ||||||||||||
19 | const unsigned char *from, int flen) | - | ||||||||||||
20 | { | - | ||||||||||||
21 | int j; | - | ||||||||||||
22 | unsigned char *p; | - | ||||||||||||
23 | - | |||||||||||||
24 | if (flen > (tlen - RSA_PKCS1_PADDING_SIZE)) {
| 0-559 | ||||||||||||
25 | RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1, | - | ||||||||||||
26 | RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE); | - | ||||||||||||
27 | return 0; never executed: return 0; | 0 | ||||||||||||
28 | } | - | ||||||||||||
29 | - | |||||||||||||
30 | p = (unsigned char *)to; | - | ||||||||||||
31 | - | |||||||||||||
32 | *(p++) = 0; | - | ||||||||||||
33 | *(p++) = 1; /* Private Key BT (Block Type) */ | - | ||||||||||||
34 | - | |||||||||||||
35 | /* pad out with 0xff data */ | - | ||||||||||||
36 | j = tlen - 3 - flen; | - | ||||||||||||
37 | memset(p, 0xff, j); | - | ||||||||||||
38 | p += j; | - | ||||||||||||
39 | *(p++) = '\0'; | - | ||||||||||||
40 | memcpy(p, from, (unsigned int)flen); | - | ||||||||||||
41 | return 1; executed 559 times by 1 test: return 1; Executed by:
| 559 | ||||||||||||
42 | } | - | ||||||||||||
43 | - | |||||||||||||
44 | int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen, | - | ||||||||||||
45 | const unsigned char *from, int flen, | - | ||||||||||||
46 | int num) | - | ||||||||||||
47 | { | - | ||||||||||||
48 | int i, j; | - | ||||||||||||
49 | const unsigned char *p; | - | ||||||||||||
50 | - | |||||||||||||
51 | p = from; | - | ||||||||||||
52 | - | |||||||||||||
53 | /* | - | ||||||||||||
54 | * The format is | - | ||||||||||||
55 | * 00 || 01 || PS || 00 || D | - | ||||||||||||
56 | * PS - padding string, at least 8 bytes of FF | - | ||||||||||||
57 | * D - data. | - | ||||||||||||
58 | */ | - | ||||||||||||
59 | - | |||||||||||||
60 | if (num < 11)
| 0-1763 | ||||||||||||
61 | return -1; never executed: return -1; | 0 | ||||||||||||
62 | - | |||||||||||||
63 | /* Accept inputs with and without the leading 0-byte. */ | - | ||||||||||||
64 | if (num == flen) {
| 0-1763 | ||||||||||||
65 | if ((*p++) != 0x00) {
| 16-1747 | ||||||||||||
66 | RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1, | - | ||||||||||||
67 | RSA_R_INVALID_PADDING); | - | ||||||||||||
68 | return -1; executed 16 times by 1 test: return -1; Executed by:
| 16 | ||||||||||||
69 | } | - | ||||||||||||
70 | flen--; | - | ||||||||||||
71 | } executed 1747 times by 1 test: end of block Executed by:
| 1747 | ||||||||||||
72 | - | |||||||||||||
73 | if ((num != (flen + 1)) || (*(p++) != 0x01)) {
| 0-1747 | ||||||||||||
74 | RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1, | - | ||||||||||||
75 | RSA_R_BLOCK_TYPE_IS_NOT_01); | - | ||||||||||||
76 | return -1; executed 1 time by 1 test: return -1; Executed by:
| 1 | ||||||||||||
77 | } | - | ||||||||||||
78 | - | |||||||||||||
79 | /* scan over padding data */ | - | ||||||||||||
80 | j = flen - 1; /* one for type. */ | - | ||||||||||||
81 | for (i = 0; i < j; i++) {
| 1-361120 | ||||||||||||
82 | if (*p != 0xff) { /* should decrypt to 0xff */
| 1745-359375 | ||||||||||||
83 | if (*p == 0) {
| 2-1743 | ||||||||||||
84 | p++; | - | ||||||||||||
85 | break; executed 1743 times by 1 test: break; Executed by:
| 1743 | ||||||||||||
86 | } else { | - | ||||||||||||
87 | RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1, | - | ||||||||||||
88 | RSA_R_BAD_FIXED_HEADER_DECRYPT); | - | ||||||||||||
89 | return -1; executed 2 times by 1 test: return -1; Executed by:
| 2 | ||||||||||||
90 | } | - | ||||||||||||
91 | } | - | ||||||||||||
92 | p++; | - | ||||||||||||
93 | } executed 359375 times by 1 test: end of block Executed by:
| 359375 | ||||||||||||
94 | - | |||||||||||||
95 | if (i == j) {
| 1-1743 | ||||||||||||
96 | RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1, | - | ||||||||||||
97 | RSA_R_NULL_BEFORE_BLOCK_MISSING); | - | ||||||||||||
98 | return -1; executed 1 time by 1 test: return -1; Executed by:
| 1 | ||||||||||||
99 | } | - | ||||||||||||
100 | - | |||||||||||||
101 | if (i < 8) {
| 0-1743 | ||||||||||||
102 | RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1, | - | ||||||||||||
103 | RSA_R_BAD_PAD_BYTE_COUNT); | - | ||||||||||||
104 | return -1; never executed: return -1; | 0 | ||||||||||||
105 | } | - | ||||||||||||
106 | i++; /* Skip over the '\0' */ | - | ||||||||||||
107 | j -= i; | - | ||||||||||||
108 | if (j > tlen) {
| 0-1743 | ||||||||||||
109 | RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1, RSA_R_DATA_TOO_LARGE); | - | ||||||||||||
110 | return -1; never executed: return -1; | 0 | ||||||||||||
111 | } | - | ||||||||||||
112 | memcpy(to, p, (unsigned int)j); | - | ||||||||||||
113 | - | |||||||||||||
114 | return j; executed 1743 times by 1 test: return j; Executed by:
| 1743 | ||||||||||||
115 | } | - | ||||||||||||
116 | - | |||||||||||||
117 | int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen, | - | ||||||||||||
118 | const unsigned char *from, int flen) | - | ||||||||||||
119 | { | - | ||||||||||||
120 | int i, j; | - | ||||||||||||
121 | unsigned char *p; | - | ||||||||||||
122 | - | |||||||||||||
123 | if (flen > (tlen - 11)) {
| 1-492 | ||||||||||||
124 | RSAerr(RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2, | - | ||||||||||||
125 | RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE); | - | ||||||||||||
126 | return 0; executed 1 time by 1 test: return 0; Executed by:
| 1 | ||||||||||||
127 | } | - | ||||||||||||
128 | - | |||||||||||||
129 | p = (unsigned char *)to; | - | ||||||||||||
130 | - | |||||||||||||
131 | *(p++) = 0; | - | ||||||||||||
132 | *(p++) = 2; /* Public Key BT (Block Type) */ | - | ||||||||||||
133 | - | |||||||||||||
134 | /* pad out with non-zero random data */ | - | ||||||||||||
135 | j = tlen - 3 - flen; | - | ||||||||||||
136 | - | |||||||||||||
137 | if (RAND_bytes(p, j) <= 0)
| 0-492 | ||||||||||||
138 | return 0; never executed: return 0; | 0 | ||||||||||||
139 | for (i = 0; i < j; i++) {
| 492-62886 | ||||||||||||
140 | if (*p == '\0')
| 118-62768 | ||||||||||||
141 | do { | - | ||||||||||||
142 | if (RAND_bytes(p, 1) <= 0)
| 0-119 | ||||||||||||
143 | return 0; never executed: return 0; | 0 | ||||||||||||
144 | } while (*p == '\0'); executed 119 times by 1 test: end of block Executed by:
| 1-119 | ||||||||||||
145 | p++; | - | ||||||||||||
146 | } executed 62886 times by 1 test: end of block Executed by:
| 62886 | ||||||||||||
147 | - | |||||||||||||
148 | *(p++) = '\0'; | - | ||||||||||||
149 | - | |||||||||||||
150 | memcpy(p, from, (unsigned int)flen); | - | ||||||||||||
151 | return 1; executed 492 times by 1 test: return 1; Executed by:
| 492 | ||||||||||||
152 | } | - | ||||||||||||
153 | - | |||||||||||||
154 | int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen, | - | ||||||||||||
155 | const unsigned char *from, int flen, | - | ||||||||||||
156 | int num) | - | ||||||||||||
157 | { | - | ||||||||||||
158 | int i; | - | ||||||||||||
159 | /* |em| is the encoded message, zero-padded to exactly |num| bytes */ | - | ||||||||||||
160 | unsigned char *em = NULL; | - | ||||||||||||
161 | unsigned int good, found_zero_byte; | - | ||||||||||||
162 | int zero_index = 0, msg_index, mlen = -1; | - | ||||||||||||
163 | - | |||||||||||||
164 | if (tlen < 0 || flen < 0)
| 0-31 | ||||||||||||
165 | return -1; never executed: return -1; | 0 | ||||||||||||
166 | - | |||||||||||||
167 | /* | - | ||||||||||||
168 | * PKCS#1 v1.5 decryption. See "PKCS #1 v2.2: RSA Cryptography Standard", | - | ||||||||||||
169 | * section 7.2.2. | - | ||||||||||||
170 | */ | - | ||||||||||||
171 | - | |||||||||||||
172 | if (flen > num)
| 0-31 | ||||||||||||
173 | goto err; never executed: goto err; | 0 | ||||||||||||
174 | - | |||||||||||||
175 | if (num < 11)
| 0-31 | ||||||||||||
176 | goto err; never executed: goto err; | 0 | ||||||||||||
177 | - | |||||||||||||
178 | if (flen != num) {
| 0-31 | ||||||||||||
179 | em = OPENSSL_zalloc(num); | - | ||||||||||||
180 | if (em == NULL) {
| 0 | ||||||||||||
181 | RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2, ERR_R_MALLOC_FAILURE); | - | ||||||||||||
182 | return -1; never executed: return -1; | 0 | ||||||||||||
183 | } | - | ||||||||||||
184 | /* | - | ||||||||||||
185 | * Caller is encouraged to pass zero-padded message created with | - | ||||||||||||
186 | * BN_bn2binpad, but if it doesn't, we do this zero-padding copy | - | ||||||||||||
187 | * to avoid leaking that information. The copy still leaks some | - | ||||||||||||
188 | * side-channel information, but it's impossible to have a fixed | - | ||||||||||||
189 | * memory access pattern since we can't read out of the bounds of | - | ||||||||||||
190 | * |from|. | - | ||||||||||||
191 | */ | - | ||||||||||||
192 | memcpy(em + num - flen, from, flen); | - | ||||||||||||
193 | from = em; | - | ||||||||||||
194 | } never executed: end of block | 0 | ||||||||||||
195 | - | |||||||||||||
196 | good = constant_time_is_zero(from[0]); | - | ||||||||||||
197 | good &= constant_time_eq(from[1], 2); | - | ||||||||||||
198 | - | |||||||||||||
199 | found_zero_byte = 0; | - | ||||||||||||
200 | for (i = 2; i < num; i++) {
| 31-9268 | ||||||||||||
201 | unsigned int equals0 = constant_time_is_zero(from[i]); | - | ||||||||||||
202 | zero_index = | - | ||||||||||||
203 | constant_time_select_int(~found_zero_byte & equals0, i, | - | ||||||||||||
204 | zero_index); | - | ||||||||||||
205 | found_zero_byte |= equals0; | - | ||||||||||||
206 | } executed 9268 times by 1 test: end of block Executed by:
| 9268 | ||||||||||||
207 | - | |||||||||||||
208 | /* | - | ||||||||||||
209 | * PS must be at least 8 bytes long, and it starts two bytes into |from|. | - | ||||||||||||
210 | * If we never found a 0-byte, then |zero_index| is 0 and the check | - | ||||||||||||
211 | * also fails. | - | ||||||||||||
212 | */ | - | ||||||||||||
213 | good &= constant_time_ge((unsigned int)(zero_index), 2 + 8); | - | ||||||||||||
214 | - | |||||||||||||
215 | /* | - | ||||||||||||
216 | * Skip the zero byte. This is incorrect if we never found a zero-byte | - | ||||||||||||
217 | * but in this case we also do not copy the message out. | - | ||||||||||||
218 | */ | - | ||||||||||||
219 | msg_index = zero_index + 1; | - | ||||||||||||
220 | mlen = num - msg_index; | - | ||||||||||||
221 | - | |||||||||||||
222 | /* | - | ||||||||||||
223 | * For good measure, do this check in constant time as well; it could | - | ||||||||||||
224 | * leak something if |tlen| was assuming valid padding. | - | ||||||||||||
225 | */ | - | ||||||||||||
226 | good &= constant_time_ge((unsigned int)(tlen), (unsigned int)(mlen)); | - | ||||||||||||
227 | - | |||||||||||||
228 | /* | - | ||||||||||||
229 | * We can't continue in constant-time because we need to copy the result | - | ||||||||||||
230 | * and we cannot fake its length. This unavoidably leaks timing | - | ||||||||||||
231 | * information at the API boundary. | - | ||||||||||||
232 | */ | - | ||||||||||||
233 | if (!good) {
| 5-26 | ||||||||||||
234 | mlen = -1; | - | ||||||||||||
235 | goto err; executed 5 times by 1 test: goto err; Executed by:
| 5 | ||||||||||||
236 | } | - | ||||||||||||
237 | - | |||||||||||||
238 | memcpy(to, from + msg_index, mlen); | - | ||||||||||||
239 | - | |||||||||||||
240 | err: code before this statement executed 26 times by 1 test: err: Executed by:
| 26 | ||||||||||||
241 | OPENSSL_clear_free(em, num); | - | ||||||||||||
242 | if (mlen == -1)
| 5-26 | ||||||||||||
243 | RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2, executed 5 times by 1 test: ERR_put_error(4,(113),(159),__FILE__,244) ; Executed by:
| 5 | ||||||||||||
244 | RSA_R_PKCS_DECODING_ERROR); executed 5 times by 1 test: ERR_put_error(4,(113),(159),__FILE__,244) ; Executed by:
| 5 | ||||||||||||
245 | return mlen; executed 31 times by 1 test: return mlen; Executed by:
| 31 | ||||||||||||
246 | } | - | ||||||||||||
Source code | Switch to Preprocessed file |