summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortb <>2023-04-25 16:50:33 +0000
committertb <>2023-04-25 16:50:33 +0000
commit2a03a7f8e865066559744ab3a932de210f129974 (patch)
treecfbe10719d1c36f8340490aefd7f60d686a1db5c /src/lib
parent766569e18d98adffa5a2bdb21a1e45a921ead53f (diff)
downloadopenbsd-2a03a7f8e865066559744ab3a932de210f129974.tar.gz
openbsd-2a03a7f8e865066559744ab3a932de210f129974.tar.bz2
openbsd-2a03a7f8e865066559744ab3a932de210f129974.zip
Remove X9.31 support
ok jsing
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/Makefile4
-rw-r--r--src/lib/libcrypto/bn/bn.h16
-rw-r--r--src/lib/libcrypto/bn/bn_x931p.c292
-rw-r--r--src/lib/libcrypto/evp/evp.h3
-rw-r--r--src/lib/libcrypto/man/EVP_PKEY_keygen.310
-rw-r--r--src/lib/libcrypto/rsa/rsa.h10
-rw-r--r--src/lib/libcrypto/rsa/rsa_x931.c164
7 files changed, 6 insertions, 493 deletions
diff --git a/src/lib/libcrypto/Makefile b/src/lib/libcrypto/Makefile
index 5710b9210a..87b699bb2f 100644
--- a/src/lib/libcrypto/Makefile
+++ b/src/lib/libcrypto/Makefile
@@ -1,4 +1,4 @@
1# $OpenBSD: Makefile,v 1.109 2023/04/25 15:51:31 tb Exp $ 1# $OpenBSD: Makefile,v 1.110 2023/04/25 16:50:33 tb Exp $
2 2
3LIB= crypto 3LIB= crypto
4LIBREBUILD=y 4LIBREBUILD=y
@@ -204,7 +204,6 @@ SRCS+= bn_shift.c
204SRCS+= bn_small_primes.c 204SRCS+= bn_small_primes.c
205SRCS+= bn_sqr.c 205SRCS+= bn_sqr.c
206SRCS+= bn_word.c 206SRCS+= bn_word.c
207#SRCS+= bn_x931p.c
208 207
209# buffer/ 208# buffer/
210SRCS+= buf_err.c 209SRCS+= buf_err.c
@@ -617,7 +616,6 @@ SRCS+= rsa_prn.c
617SRCS+= rsa_pss.c 616SRCS+= rsa_pss.c
618SRCS+= rsa_saos.c 617SRCS+= rsa_saos.c
619SRCS+= rsa_sign.c 618SRCS+= rsa_sign.c
620#SRCS+= rsa_x931.c
621 619
622# sha/ 620# sha/
623SRCS+= sha1.c 621SRCS+= sha1.c
diff --git a/src/lib/libcrypto/bn/bn.h b/src/lib/libcrypto/bn/bn.h
index fae8df5d90..b443d82c96 100644
--- a/src/lib/libcrypto/bn/bn.h
+++ b/src/lib/libcrypto/bn/bn.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn.h,v 1.63 2023/04/25 16:41:29 tb Exp $ */ 1/* $OpenBSD: bn.h,v 1.64 2023/04/25 16:50:33 tb Exp $ */
2/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -483,20 +483,6 @@ int BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb);
483int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, 483int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx,
484 int do_trial_division, BN_GENCB *cb); 484 int do_trial_division, BN_GENCB *cb);
485 485
486/* Remove in next major bump. */
487#if !defined(LIBRESSL_NEXT_API) || defined(LIBRESSL_INTERNAL)
488int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx);
489
490int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2,
491 const BIGNUM *Xp, const BIGNUM *Xp1, const BIGNUM *Xp2,
492 const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb);
493int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2,
494 BIGNUM *Xp1, BIGNUM *Xp2,
495 const BIGNUM *Xp,
496 const BIGNUM *e, BN_CTX *ctx,
497 BN_GENCB *cb);
498#endif
499
500BN_MONT_CTX *BN_MONT_CTX_new(void ); 486BN_MONT_CTX *BN_MONT_CTX_new(void );
501/* Remove in next major bump. */ 487/* Remove in next major bump. */
502#if !defined(LIBRESSL_NEXT_API) || defined(LIBRESSL_INTERNAL) 488#if !defined(LIBRESSL_NEXT_API) || defined(LIBRESSL_INTERNAL)
diff --git a/src/lib/libcrypto/bn/bn_x931p.c b/src/lib/libcrypto/bn/bn_x931p.c
deleted file mode 100644
index 9105be11cd..0000000000
--- a/src/lib/libcrypto/bn/bn_x931p.c
+++ /dev/null
@@ -1,292 +0,0 @@
1/* $OpenBSD: bn_x931p.c,v 1.16 2023/03/27 10:25:02 tb Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2005.
4 */
5/* ====================================================================
6 * Copyright (c) 2005 The OpenSSL Project. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * 3. All advertising materials mentioning features or use of this
21 * software must display the following acknowledgment:
22 * "This product includes software developed by the OpenSSL Project
23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 *
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 * endorse or promote products derived from this software without
27 * prior written permission. For written permission, please contact
28 * licensing@OpenSSL.org.
29 *
30 * 5. Products derived from this software may not be called "OpenSSL"
31 * nor may "OpenSSL" appear in their names without prior written
32 * permission of the OpenSSL Project.
33 *
34 * 6. Redistributions of any form whatsoever must retain the following
35 * acknowledgment:
36 * "This product includes software developed by the OpenSSL Project
37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 * OF THE POSSIBILITY OF SUCH DAMAGE.
51 * ====================================================================
52 *
53 * This product includes cryptographic software written by Eric Young
54 * (eay@cryptsoft.com). This product includes software written by Tim
55 * Hudson (tjh@cryptsoft.com).
56 *
57 */
58
59#include <stdio.h>
60#include <openssl/bn.h>
61
62#include "bn_local.h"
63
64/* X9.31 routines for prime derivation */
65
66/* X9.31 prime derivation. This is used to generate the primes pi
67 * (p1, p2, q1, q2) from a parameter Xpi by checking successive odd
68 * integers.
69 */
70
71static int
72bn_x931_derive_pi(BIGNUM *pi, const BIGNUM *Xpi, BN_CTX *ctx, BN_GENCB *cb)
73{
74 int i = 0, is_prime;
75
76 if (!bn_copy(pi, Xpi))
77 return 0;
78 if (!BN_is_odd(pi) && !BN_add_word(pi, 1))
79 return 0;
80 for (;;) {
81 i++;
82 BN_GENCB_call(cb, 0, i);
83 /* NB 27 MR is specified in X9.31 */
84 is_prime = BN_is_prime_fasttest_ex(pi, 27, ctx, 1, cb);
85 if (is_prime < 0)
86 return 0;
87 if (is_prime == 1)
88 break;
89 if (!BN_add_word(pi, 2))
90 return 0;
91 }
92 BN_GENCB_call(cb, 2, i);
93 return 1;
94}
95
96/* This is the main X9.31 prime derivation function. From parameters
97 * Xp1, Xp2 and Xp derive the prime p. If the parameters p1 or p2 are
98 * not NULL they will be returned too: this is needed for testing.
99 */
100
101int
102BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, const BIGNUM *Xp,
103 const BIGNUM *Xp1, const BIGNUM *Xp2, const BIGNUM *e, BN_CTX *ctx,
104 BN_GENCB *cb)
105{
106 int ret = 0;
107
108 BIGNUM *t, *p1p2, *pm1;
109
110 /* Only even e supported */
111 if (!BN_is_odd(e))
112 return 0;
113
114 BN_CTX_start(ctx);
115 if (p1 == NULL) {
116 if ((p1 = BN_CTX_get(ctx)) == NULL)
117 goto err;
118 }
119 if (p2 == NULL) {
120 if ((p2 = BN_CTX_get(ctx)) == NULL)
121 goto err;
122 }
123
124 if ((t = BN_CTX_get(ctx)) == NULL)
125 goto err;
126 if ((p1p2 = BN_CTX_get(ctx)) == NULL)
127 goto err;
128 if ((pm1 = BN_CTX_get(ctx)) == NULL)
129 goto err;
130
131 if (!bn_x931_derive_pi(p1, Xp1, ctx, cb))
132 goto err;
133
134 if (!bn_x931_derive_pi(p2, Xp2, ctx, cb))
135 goto err;
136
137 if (!BN_mul(p1p2, p1, p2, ctx))
138 goto err;
139
140 /* First set p to value of Rp */
141
142 if (BN_mod_inverse_ct(p, p2, p1, ctx) == NULL)
143 goto err;
144
145 if (!BN_mul(p, p, p2, ctx))
146 goto err;
147
148 if (BN_mod_inverse_ct(t, p1, p2, ctx) == NULL)
149 goto err;
150
151 if (!BN_mul(t, t, p1, ctx))
152 goto err;
153
154 if (!BN_sub(p, p, t))
155 goto err;
156
157 if (BN_is_negative(p) && !BN_add(p, p, p1p2))
158 goto err;
159
160 /* p now equals Rp */
161
162 if (!BN_mod_sub(p, p, Xp, p1p2, ctx))
163 goto err;
164
165 if (!BN_add(p, p, Xp))
166 goto err;
167
168 /* p now equals Yp0 */
169
170 for (;;) {
171 int i = 1;
172 BN_GENCB_call(cb, 0, i++);
173 if (!bn_copy(pm1, p))
174 goto err;
175 if (!BN_sub_word(pm1, 1))
176 goto err;
177 if (!BN_gcd_ct(t, pm1, e, ctx))
178 goto err;
179 if (BN_is_one(t)) {
180 int r;
181
182 /*
183 * X9.31 specifies 8 MR and 1 Lucas test or any prime
184 * test offering similar or better guarantees 50 MR
185 * is considerably better.
186 */
187 r = BN_is_prime_fasttest_ex(p, 50, ctx, 1, cb);
188 if (r < 0)
189 goto err;
190 if (r == 1)
191 break;
192 }
193 if (!BN_add(p, p, p1p2))
194 goto err;
195 }
196
197 BN_GENCB_call(cb, 3, 0);
198
199 ret = 1;
200
201err:
202
203 BN_CTX_end(ctx);
204
205 return ret;
206}
207
208/* Generate pair of parameters Xp, Xq for X9.31 prime generation.
209 * Note: nbits parameter is sum of number of bits in both.
210 */
211
212int
213BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx)
214{
215 BIGNUM *t;
216 int i;
217 int ret = 0;
218
219 /* Number of bits for each prime is of the form
220 * 512+128s for s = 0, 1, ...
221 */
222 if ((nbits < 1024) || (nbits & 0xff))
223 return 0;
224 nbits >>= 1;
225 /* The random value Xp must be between sqrt(2) * 2^(nbits-1) and
226 * 2^nbits - 1. By setting the top two bits we ensure that the lower
227 * bound is exceeded.
228 */
229 if (!BN_rand(Xp, nbits, 1, 0))
230 return 0;
231
232 BN_CTX_start(ctx);
233 if ((t = BN_CTX_get(ctx)) == NULL)
234 goto err;
235
236 for (i = 0; i < 1000; i++) {
237 if (!BN_rand(Xq, nbits, 1, 0))
238 goto err;
239 /* Check that |Xp - Xq| > 2^(nbits - 100) */
240 if (!BN_sub(t, Xp, Xq))
241 goto err;
242 if (BN_num_bits(t) > (nbits - 100))
243 break;
244 }
245
246 if (i < 1000)
247 ret = 1;
248
249err:
250 BN_CTX_end(ctx);
251
252 return ret;
253}
254
255/* Generate primes using X9.31 algorithm. Of the values p, p1, p2, Xp1
256 * and Xp2 only 'p' needs to be non-NULL. If any of the others are not NULL
257 * the relevant parameter will be stored in it.
258 *
259 * Due to the fact that |Xp - Xq| > 2^(nbits - 100) must be satisfied Xp and Xq
260 * are generated using the previous function and supplied as input.
261 */
262
263int
264BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, BIGNUM *Xp1,
265 BIGNUM *Xp2, const BIGNUM *Xp, const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb)
266{
267 int ret = 0;
268
269 BN_CTX_start(ctx);
270 if (Xp1 == NULL) {
271 if ((Xp1 = BN_CTX_get(ctx)) == NULL)
272 goto error;
273 }
274 if (Xp2 == NULL) {
275 if ((Xp2 = BN_CTX_get(ctx)) == NULL)
276 goto error;
277 }
278
279 if (!BN_rand(Xp1, 101, 0, 0))
280 goto error;
281 if (!BN_rand(Xp2, 101, 0, 0))
282 goto error;
283 if (!BN_X931_derive_prime_ex(p, p1, p2, Xp, Xp1, Xp2, e, ctx, cb))
284 goto error;
285
286 ret = 1;
287
288error:
289 BN_CTX_end(ctx);
290
291 return ret;
292}
diff --git a/src/lib/libcrypto/evp/evp.h b/src/lib/libcrypto/evp/evp.h
index 830774a740..548522eb12 100644
--- a/src/lib/libcrypto/evp/evp.h
+++ b/src/lib/libcrypto/evp/evp.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: evp.h,v 1.116 2023/04/16 17:06:19 jsing Exp $ */ 1/* $OpenBSD: evp.h,v 1.117 2023/04/25 16:50:33 tb Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -183,7 +183,6 @@ extern "C" {
183 */ 183 */
184#define EVP_MD_CTX_FLAG_PAD_MASK 0xF0 /* RSA mode to use */ 184#define EVP_MD_CTX_FLAG_PAD_MASK 0xF0 /* RSA mode to use */
185#define EVP_MD_CTX_FLAG_PAD_PKCS1 0x00 /* PKCS#1 v1.5 mode */ 185#define EVP_MD_CTX_FLAG_PAD_PKCS1 0x00 /* PKCS#1 v1.5 mode */
186#define EVP_MD_CTX_FLAG_PAD_X931 0x10 /* X9.31 mode */
187#define EVP_MD_CTX_FLAG_PAD_PSS 0x20 /* PSS mode */ 186#define EVP_MD_CTX_FLAG_PAD_PSS 0x20 /* PSS mode */
188 187
189#define EVP_MD_CTX_FLAG_NO_INIT 0x0100 /* Don't initialize md_data */ 188#define EVP_MD_CTX_FLAG_NO_INIT 0x0100 /* Don't initialize md_data */
diff --git a/src/lib/libcrypto/man/EVP_PKEY_keygen.3 b/src/lib/libcrypto/man/EVP_PKEY_keygen.3
index 8994496a91..aae994541f 100644
--- a/src/lib/libcrypto/man/EVP_PKEY_keygen.3
+++ b/src/lib/libcrypto/man/EVP_PKEY_keygen.3
@@ -1,4 +1,4 @@
1.\" $OpenBSD: EVP_PKEY_keygen.3,v 1.10 2022/11/16 15:34:41 schwarze Exp $ 1.\" $OpenBSD: EVP_PKEY_keygen.3,v 1.11 2023/04/25 16:50:33 tb Exp $
2.\" full merge up to: OpenSSL e9b77246 Jan 20 19:58:49 2017 +0100 2.\" full merge up to: OpenSSL e9b77246 Jan 20 19:58:49 2017 +0100
3.\" selective merge up to: OpenSSL 48e5119a Jan 19 10:49:22 2018 +0100 3.\" selective merge up to: OpenSSL 48e5119a Jan 19 10:49:22 2018 +0100
4.\" 4.\"
@@ -50,7 +50,7 @@
50.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51.\" OF THE POSSIBILITY OF SUCH DAMAGE. 51.\" OF THE POSSIBILITY OF SUCH DAMAGE.
52.\" 52.\"
53.Dd $Mdocdate: November 16 2022 $ 53.Dd $Mdocdate: April 25 2023 $
54.Dt EVP_PKEY_KEYGEN 3 54.Dt EVP_PKEY_KEYGEN 3
55.Os 55.Os
56.Sh NAME 56.Sh NAME
@@ -64,12 +64,6 @@
64.Nm EVP_PKEY_CTX_get_keygen_info , 64.Nm EVP_PKEY_CTX_get_keygen_info ,
65.Nm EVP_PKEY_CTX_set_app_data , 65.Nm EVP_PKEY_CTX_set_app_data ,
66.Nm EVP_PKEY_CTX_get_app_data 66.Nm EVP_PKEY_CTX_get_app_data
67.\" The following functions are intentionally undocumented:
68.\" .Nm BN_X931_derive_prime_ex ,
69.\" .Nm BN_X931_generate_prime_ex ,
70.\" .Nm BN_X931_generate_Xpq
71.\" They are unused outside OpenSSL/LibreSSL and deprecated in OpenSSL 3.0,
72.\" see https://github.com/openssl/openssl/issues/10111
73.Nd key and parameter generation functions 67.Nd key and parameter generation functions
74.Sh SYNOPSIS 68.Sh SYNOPSIS
75.In openssl/evp.h 69.In openssl/evp.h
diff --git a/src/lib/libcrypto/rsa/rsa.h b/src/lib/libcrypto/rsa/rsa.h
index cddd80bc85..b2a9a85ea8 100644
--- a/src/lib/libcrypto/rsa/rsa.h
+++ b/src/lib/libcrypto/rsa/rsa.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: rsa.h,v 1.62 2023/04/18 08:47:28 tb Exp $ */ 1/* $OpenBSD: rsa.h,v 1.63 2023/04/25 16:50:33 tb Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -349,14 +349,6 @@ int RSA_padding_add_none(unsigned char *to, int tlen,
349 const unsigned char *f, int fl); 349 const unsigned char *f, int fl);
350int RSA_padding_check_none(unsigned char *to, int tlen, 350int RSA_padding_check_none(unsigned char *to, int tlen,
351 const unsigned char *f, int fl, int rsa_len); 351 const unsigned char *f, int fl, int rsa_len);
352/* Remove in next major bump. */
353#if !defined(LIBRESSL_NEXT_API) || defined(LIBRESSL_INTERNAL)
354int RSA_padding_add_X931(unsigned char *to, int tlen,
355 const unsigned char *f, int fl);
356int RSA_padding_check_X931(unsigned char *to, int tlen,
357 const unsigned char *f, int fl, int rsa_len);
358int RSA_X931_hash_id(int nid);
359#endif
360 352
361int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash, 353int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash,
362 const EVP_MD *Hash, const unsigned char *EM, int sLen); 354 const EVP_MD *Hash, const unsigned char *EM, int sLen);
diff --git a/src/lib/libcrypto/rsa/rsa_x931.c b/src/lib/libcrypto/rsa/rsa_x931.c
deleted file mode 100644
index 3579735ab2..0000000000
--- a/src/lib/libcrypto/rsa/rsa_x931.c
+++ /dev/null
@@ -1,164 +0,0 @@
1/* $OpenBSD: rsa_x931.c,v 1.10 2017/01/29 17:49:23 beck Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2005.
4 */
5/* ====================================================================
6 * Copyright (c) 2005 The OpenSSL Project. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * 3. All advertising materials mentioning features or use of this
21 * software must display the following acknowledgment:
22 * "This product includes software developed by the OpenSSL Project
23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 *
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 * endorse or promote products derived from this software without
27 * prior written permission. For written permission, please contact
28 * licensing@OpenSSL.org.
29 *
30 * 5. Products derived from this software may not be called "OpenSSL"
31 * nor may "OpenSSL" appear in their names without prior written
32 * permission of the OpenSSL Project.
33 *
34 * 6. Redistributions of any form whatsoever must retain the following
35 * acknowledgment:
36 * "This product includes software developed by the OpenSSL Project
37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 * OF THE POSSIBILITY OF SUCH DAMAGE.
51 * ====================================================================
52 *
53 * This product includes cryptographic software written by Eric Young
54 * (eay@cryptsoft.com). This product includes software written by Tim
55 * Hudson (tjh@cryptsoft.com).
56 *
57 */
58
59#include <stdio.h>
60#include <string.h>
61
62#include <openssl/bn.h>
63#include <openssl/err.h>
64#include <openssl/objects.h>
65#include <openssl/rsa.h>
66
67int
68RSA_padding_add_X931(unsigned char *to, int tlen, const unsigned char *from,
69 int flen)
70{
71 int j;
72 unsigned char *p;
73
74 /*
75 * Absolute minimum amount of padding is 1 header nibble, 1 padding
76 * nibble and 2 trailer bytes: but 1 hash if is already in 'from'.
77 */
78 j = tlen - flen - 2;
79
80 if (j < 0) {
81 RSAerror(RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE);
82 return -1;
83 }
84
85 p = (unsigned char *)to;
86
87 /* If no padding start and end nibbles are in one byte */
88 if (j == 0)
89 *p++ = 0x6A;
90 else {
91 *p++ = 0x6B;
92 if (j > 1) {
93 memset(p, 0xBB, j - 1);
94 p += j - 1;
95 }
96 *p++ = 0xBA;
97 }
98 memcpy(p, from, flen);
99 p += flen;
100 *p = 0xCC;
101 return 1;
102}
103
104int
105RSA_padding_check_X931(unsigned char *to, int tlen, const unsigned char *from,
106 int flen, int num)
107{
108 int i = 0, j;
109 const unsigned char *p = from;
110
111 if (num != flen || (*p != 0x6A && *p != 0x6B)) {
112 RSAerror(RSA_R_INVALID_HEADER);
113 return -1;
114 }
115
116 if (*p++ == 0x6B) {
117 j = flen - 3;
118 for (i = 0; i < j; i++) {
119 unsigned char c = *p++;
120 if (c == 0xBA)
121 break;
122 if (c != 0xBB) {
123 RSAerror(RSA_R_INVALID_PADDING);
124 return -1;
125 }
126 }
127
128 if (i == 0) {
129 RSAerror(RSA_R_INVALID_PADDING);
130 return -1;
131 }
132
133 j -= i;
134 } else
135 j = flen - 2;
136
137 if (j < 0 || p[j] != 0xCC) {
138 RSAerror(RSA_R_INVALID_TRAILER);
139 return -1;
140 }
141
142 memcpy(to, p, j);
143
144 return j;
145}
146
147/* Translate between X931 hash ids and NIDs */
148
149int
150RSA_X931_hash_id(int nid)
151{
152 switch (nid) {
153 case NID_sha1:
154 return 0x33;
155 case NID_sha256:
156 return 0x34;
157 case NID_sha384:
158 return 0x36;
159 case NID_sha512:
160 return 0x35;
161 }
162
163 return -1;
164}