summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortb <>2023-05-05 12:19:37 +0000
committertb <>2023-05-05 12:19:37 +0000
commitf6e04428acaae7386fa256d1e42c3e05b4caa1df (patch)
tree30e2869a494de9f9768ba8a88c6e63ee4447fa59 /src/lib
parentac3a45c919d4bd970c6ae1d7906447867a37a12a (diff)
downloadopenbsd-f6e04428acaae7386fa256d1e42c3e05b4caa1df.tar.gz
openbsd-f6e04428acaae7386fa256d1e42c3e05b4caa1df.tar.bz2
openbsd-f6e04428acaae7386fa256d1e42c3e05b4caa1df.zip
Bring back the X9.31 padding helpers
Nothing should be using this anymore, except that salt decided to use it in its home-cooked protocol, which already had its share of issues. Hopefully the efforts to switch salt to something more reasonable and standardized like mTLS will succeed sooner rather than later. tested as part of a larger patch by robert ok jsing
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/rsa/rsa_x931.c164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_x931.c b/src/lib/libcrypto/rsa/rsa_x931.c
new file mode 100644
index 0000000000..52f3f803b2
--- /dev/null
+++ b/src/lib/libcrypto/rsa/rsa_x931.c
@@ -0,0 +1,164 @@
1/* $OpenBSD: rsa_x931.c,v 1.12 2023/05/05 12:19:37 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 <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}