summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/objects
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/objects')
-rw-r--r--src/lib/libcrypto/objects/obj_xref.c231
-rw-r--r--src/lib/libcrypto/objects/obj_xref.h75
-rw-r--r--src/lib/libcrypto/objects/obj_xref.txt42
-rw-r--r--src/lib/libcrypto/objects/objxref.pl107
4 files changed, 455 insertions, 0 deletions
diff --git a/src/lib/libcrypto/objects/obj_xref.c b/src/lib/libcrypto/objects/obj_xref.c
new file mode 100644
index 0000000000..152eca5c67
--- /dev/null
+++ b/src/lib/libcrypto/objects/obj_xref.c
@@ -0,0 +1,231 @@
1/* crypto/objects/obj_xref.c */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2006.
4 */
5/* ====================================================================
6 * Copyright (c) 2006 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 <openssl/objects.h>
60#include "obj_xref.h"
61
62DECLARE_STACK_OF(nid_triple)
63STACK_OF(nid_triple) *sig_app, *sigx_app;
64
65static int sig_cmp(const nid_triple *a, const nid_triple *b)
66 {
67 return a->sign_id - b->sign_id;
68 }
69
70DECLARE_OBJ_BSEARCH_CMP_FN(nid_triple, nid_triple, sig);
71IMPLEMENT_OBJ_BSEARCH_CMP_FN(nid_triple, nid_triple, sig);
72
73static int sig_sk_cmp(const nid_triple * const *a, const nid_triple * const *b)
74 {
75 return (*a)->sign_id - (*b)->sign_id;
76 }
77
78DECLARE_OBJ_BSEARCH_CMP_FN(const nid_triple *, const nid_triple *, sigx);
79
80static int sigx_cmp(const nid_triple * const *a, const nid_triple * const *b)
81 {
82 int ret;
83 ret = (*a)->hash_id - (*b)->hash_id;
84 if (ret)
85 return ret;
86 return (*a)->pkey_id - (*b)->pkey_id;
87 }
88
89IMPLEMENT_OBJ_BSEARCH_CMP_FN(const nid_triple *, const nid_triple *, sigx);
90
91int OBJ_find_sigid_algs(int signid, int *pdig_nid, int *ppkey_nid)
92 {
93 nid_triple tmp;
94 const nid_triple *rv = NULL;
95 tmp.sign_id = signid;
96
97 if (sig_app)
98 {
99 int idx = sk_nid_triple_find(sig_app, &tmp);
100 if (idx >= 0)
101 rv = sk_nid_triple_value(sig_app, idx);
102 }
103
104#ifndef OBJ_XREF_TEST2
105 if (rv == NULL)
106 {
107 rv = OBJ_bsearch_sig(&tmp, sigoid_srt,
108 sizeof(sigoid_srt) / sizeof(nid_triple));
109 }
110#endif
111 if (rv == NULL)
112 return 0;
113 *pdig_nid = rv->hash_id;
114 *ppkey_nid = rv->pkey_id;
115 return 1;
116 }
117
118int OBJ_find_sigid_by_algs(int *psignid, int dig_nid, int pkey_nid)
119 {
120 nid_triple tmp;
121 const nid_triple *t=&tmp;
122 const nid_triple **rv = NULL;
123
124 tmp.hash_id = dig_nid;
125 tmp.pkey_id = pkey_nid;
126
127 if (sigx_app)
128 {
129 int idx = sk_nid_triple_find(sigx_app, &tmp);
130 if (idx >= 0)
131 {
132 t = sk_nid_triple_value(sigx_app, idx);
133 rv = &t;
134 }
135 }
136
137#ifndef OBJ_XREF_TEST2
138 if (rv == NULL)
139 {
140 rv = OBJ_bsearch_sigx(&t, sigoid_srt_xref,
141 sizeof(sigoid_srt_xref) / sizeof(nid_triple *)
142 );
143 }
144#endif
145 if (rv == NULL)
146 return 0;
147 *psignid = (*rv)->sign_id;
148 return 1;
149 }
150
151int OBJ_add_sigid(int signid, int dig_id, int pkey_id)
152 {
153 nid_triple *ntr;
154 if (!sig_app)
155 sig_app = sk_nid_triple_new(sig_sk_cmp);
156 if (!sig_app)
157 return 0;
158 if (!sigx_app)
159 sigx_app = sk_nid_triple_new(sigx_cmp);
160 if (!sigx_app)
161 return 0;
162 ntr = OPENSSL_malloc(sizeof(int) * 3);
163 if (!ntr)
164 return 0;
165 ntr->sign_id = signid;
166 ntr->hash_id = dig_id;
167 ntr->pkey_id = pkey_id;
168
169 if (!sk_nid_triple_push(sig_app, ntr))
170 {
171 OPENSSL_free(ntr);
172 return 0;
173 }
174
175 if (!sk_nid_triple_push(sigx_app, ntr))
176 return 0;
177
178 sk_nid_triple_sort(sig_app);
179 sk_nid_triple_sort(sigx_app);
180
181 return 1;
182 }
183
184static void sid_free(nid_triple *tt)
185 {
186 OPENSSL_free(tt);
187 }
188
189void OBJ_sigid_free(void)
190 {
191 if (sig_app)
192 {
193 sk_nid_triple_pop_free(sig_app, sid_free);
194 sig_app = NULL;
195 }
196 if (sigx_app)
197 {
198 sk_nid_triple_free(sigx_app);
199 sigx_app = NULL;
200 }
201 }
202
203#ifdef OBJ_XREF_TEST
204
205main()
206 {
207 int n1, n2, n3;
208
209 int i, rv;
210#ifdef OBJ_XREF_TEST2
211 for (i = 0; i < sizeof(sigoid_srt) / sizeof(nid_triple); i++)
212 {
213 OBJ_add_sigid(sigoid_srt[i][0], sigoid_srt[i][1],
214 sigoid_srt[i][2]);
215 }
216#endif
217
218 for (i = 0; i < sizeof(sigoid_srt) / sizeof(nid_triple); i++)
219 {
220 n1 = sigoid_srt[i][0];
221 rv = OBJ_find_sigid_algs(n1, &n2, &n3);
222 printf("Forward: %d, %s %s %s\n", rv,
223 OBJ_nid2ln(n1), OBJ_nid2ln(n2), OBJ_nid2ln(n3));
224 n1=0;
225 rv = OBJ_find_sigid_by_algs(&n1, n2, n3);
226 printf("Reverse: %d, %s %s %s\n", rv,
227 OBJ_nid2ln(n1), OBJ_nid2ln(n2), OBJ_nid2ln(n3));
228 }
229 }
230
231#endif
diff --git a/src/lib/libcrypto/objects/obj_xref.h b/src/lib/libcrypto/objects/obj_xref.h
new file mode 100644
index 0000000000..d5b9b8e198
--- /dev/null
+++ b/src/lib/libcrypto/objects/obj_xref.h
@@ -0,0 +1,75 @@
1/* AUTOGENERATED BY objxref.pl, DO NOT EDIT */
2
3typedef struct
4 {
5 int sign_id;
6 int hash_id;
7 int pkey_id;
8 } nid_triple;
9
10static const nid_triple sigoid_srt[] =
11 {
12 {NID_md2WithRSAEncryption, NID_md2, NID_rsaEncryption},
13 {NID_md5WithRSAEncryption, NID_md5, NID_rsaEncryption},
14 {NID_shaWithRSAEncryption, NID_sha, NID_rsaEncryption},
15 {NID_sha1WithRSAEncryption, NID_sha1, NID_rsaEncryption},
16 {NID_dsaWithSHA, NID_sha, NID_dsa},
17 {NID_dsaWithSHA1_2, NID_sha1, NID_dsa_2},
18 {NID_mdc2WithRSA, NID_mdc2, NID_rsaEncryption},
19 {NID_md5WithRSA, NID_md5, NID_rsa},
20 {NID_dsaWithSHA1, NID_sha1, NID_dsa},
21 {NID_sha1WithRSA, NID_sha1, NID_rsa},
22 {NID_ripemd160WithRSA, NID_ripemd160, NID_rsaEncryption},
23 {NID_md4WithRSAEncryption, NID_md4, NID_rsaEncryption},
24 {NID_ecdsa_with_SHA1, NID_sha1, NID_X9_62_id_ecPublicKey},
25 {NID_sha256WithRSAEncryption, NID_sha256, NID_rsaEncryption},
26 {NID_sha384WithRSAEncryption, NID_sha384, NID_rsaEncryption},
27 {NID_sha512WithRSAEncryption, NID_sha512, NID_rsaEncryption},
28 {NID_sha224WithRSAEncryption, NID_sha224, NID_rsaEncryption},
29 {NID_ecdsa_with_Recommended, NID_undef, NID_X9_62_id_ecPublicKey},
30 {NID_ecdsa_with_Specified, NID_undef, NID_X9_62_id_ecPublicKey},
31 {NID_ecdsa_with_SHA224, NID_sha224, NID_X9_62_id_ecPublicKey},
32 {NID_ecdsa_with_SHA256, NID_sha256, NID_X9_62_id_ecPublicKey},
33 {NID_ecdsa_with_SHA384, NID_sha384, NID_X9_62_id_ecPublicKey},
34 {NID_ecdsa_with_SHA512, NID_sha512, NID_X9_62_id_ecPublicKey},
35 {NID_dsa_with_SHA224, NID_sha224, NID_dsa},
36 {NID_dsa_with_SHA256, NID_sha256, NID_dsa},
37 {NID_id_GostR3411_94_with_GostR3410_2001, NID_id_GostR3411_94, NID_id_GostR3410_2001},
38 {NID_id_GostR3411_94_with_GostR3410_94, NID_id_GostR3411_94, NID_id_GostR3410_94},
39 {NID_id_GostR3411_94_with_GostR3410_94_cc, NID_id_GostR3411_94, NID_id_GostR3410_94_cc},
40 {NID_id_GostR3411_94_with_GostR3410_2001_cc, NID_id_GostR3411_94, NID_id_GostR3410_2001_cc},
41 };
42
43static const nid_triple * const sigoid_srt_xref[] =
44 {
45 &sigoid_srt[17],
46 &sigoid_srt[18],
47 &sigoid_srt[0],
48 &sigoid_srt[1],
49 &sigoid_srt[7],
50 &sigoid_srt[2],
51 &sigoid_srt[4],
52 &sigoid_srt[3],
53 &sigoid_srt[9],
54 &sigoid_srt[5],
55 &sigoid_srt[8],
56 &sigoid_srt[12],
57 &sigoid_srt[6],
58 &sigoid_srt[10],
59 &sigoid_srt[11],
60 &sigoid_srt[13],
61 &sigoid_srt[24],
62 &sigoid_srt[20],
63 &sigoid_srt[14],
64 &sigoid_srt[21],
65 &sigoid_srt[15],
66 &sigoid_srt[22],
67 &sigoid_srt[16],
68 &sigoid_srt[23],
69 &sigoid_srt[19],
70 &sigoid_srt[25],
71 &sigoid_srt[26],
72 &sigoid_srt[27],
73 &sigoid_srt[28],
74 };
75
diff --git a/src/lib/libcrypto/objects/obj_xref.txt b/src/lib/libcrypto/objects/obj_xref.txt
new file mode 100644
index 0000000000..e45b3d34b9
--- /dev/null
+++ b/src/lib/libcrypto/objects/obj_xref.txt
@@ -0,0 +1,42 @@
1# OID cross reference table.
2# Links signatures OIDs to their corresponding public key algorithms
3# and digests.
4
5md2WithRSAEncryption md2 rsaEncryption
6md5WithRSAEncryption md5 rsaEncryption
7shaWithRSAEncryption sha rsaEncryption
8sha1WithRSAEncryption sha1 rsaEncryption
9md4WithRSAEncryption md4 rsaEncryption
10sha256WithRSAEncryption sha256 rsaEncryption
11sha384WithRSAEncryption sha384 rsaEncryption
12sha512WithRSAEncryption sha512 rsaEncryption
13sha224WithRSAEncryption sha224 rsaEncryption
14mdc2WithRSA mdc2 rsaEncryption
15ripemd160WithRSA ripemd160 rsaEncryption
16
17# Alternative deprecated OIDs. By using the older "rsa" OID this
18# type will be recognized by not normally used.
19
20md5WithRSA md5 rsa
21sha1WithRSA sha1 rsa
22
23dsaWithSHA sha dsa
24dsaWithSHA1 sha1 dsa
25
26dsaWithSHA1_2 sha1 dsa_2
27
28ecdsa_with_SHA1 sha1 X9_62_id_ecPublicKey
29ecdsa_with_SHA224 sha224 X9_62_id_ecPublicKey
30ecdsa_with_SHA256 sha256 X9_62_id_ecPublicKey
31ecdsa_with_SHA384 sha384 X9_62_id_ecPublicKey
32ecdsa_with_SHA512 sha512 X9_62_id_ecPublicKey
33ecdsa_with_Recommended undef X9_62_id_ecPublicKey
34ecdsa_with_Specified undef X9_62_id_ecPublicKey
35
36dsa_with_SHA224 sha224 dsa
37dsa_with_SHA256 sha256 dsa
38
39id_GostR3411_94_with_GostR3410_2001 id_GostR3411_94 id_GostR3410_2001
40id_GostR3411_94_with_GostR3410_94 id_GostR3411_94 id_GostR3410_94
41id_GostR3411_94_with_GostR3410_94_cc id_GostR3411_94 id_GostR3410_94_cc
42id_GostR3411_94_with_GostR3410_2001_cc id_GostR3411_94 id_GostR3410_2001_cc
diff --git a/src/lib/libcrypto/objects/objxref.pl b/src/lib/libcrypto/objects/objxref.pl
new file mode 100644
index 0000000000..731d3ae22c
--- /dev/null
+++ b/src/lib/libcrypto/objects/objxref.pl
@@ -0,0 +1,107 @@
1#!/usr/local/bin/perl
2
3use strict;
4
5my %xref_tbl;
6my %oid_tbl;
7
8my ($mac_file, $xref_file) = @ARGV;
9
10open(IN, $mac_file) || die "Can't open $mac_file";
11
12# Read in OID nid values for a lookup table.
13
14while (<IN>)
15 {
16 chomp;
17 my ($name, $num) = /^(\S+)\s+(\S+)$/;
18 $oid_tbl{$name} = $num;
19 }
20close IN;
21
22open(IN, $xref_file) || die "Can't open $xref_file";
23
24my $ln = 1;
25
26while (<IN>)
27 {
28 chomp;
29 s/#.*$//;
30 next if (/^\S*$/);
31 my ($xr, $p1, $p2) = /^(\S+)\s+(\S+)\s+(\S+)/;
32 check_oid($xr);
33 check_oid($p1);
34 check_oid($p2);
35 $xref_tbl{$xr} = [$p1, $p2, $ln];
36 }
37
38my @xrkeys = keys %xref_tbl;
39
40my @srt1 = sort { $oid_tbl{$a} <=> $oid_tbl{$b}} @xrkeys;
41
42for(my $i = 0; $i <= $#srt1; $i++)
43 {
44 $xref_tbl{$srt1[$i]}[2] = $i;
45 }
46
47my @srt2 = sort
48 {
49 my$ap1 = $oid_tbl{$xref_tbl{$a}[0]};
50 my$bp1 = $oid_tbl{$xref_tbl{$b}[0]};
51 return $ap1 - $bp1 if ($ap1 != $bp1);
52 my$ap2 = $oid_tbl{$xref_tbl{$a}[1]};
53 my$bp2 = $oid_tbl{$xref_tbl{$b}[1]};
54
55 return $ap2 - $bp2;
56 } @xrkeys;
57
58my $pname = $0;
59
60$pname =~ s|^.[^/]/||;
61
62print <<EOF;
63/* AUTOGENERATED BY $pname, DO NOT EDIT */
64
65typedef struct
66 {
67 int sign_id;
68 int hash_id;
69 int pkey_id;
70 } nid_triple;
71
72static const nid_triple sigoid_srt[] =
73 {
74EOF
75
76foreach (@srt1)
77 {
78 my $xr = $_;
79 my ($p1, $p2) = @{$xref_tbl{$_}};
80 print "\t{NID_$xr, NID_$p1, NID_$p2},\n";
81 }
82
83print "\t};";
84print <<EOF;
85
86
87static const nid_triple * const sigoid_srt_xref[] =
88 {
89EOF
90
91foreach (@srt2)
92 {
93 my $x = $xref_tbl{$_}[2];
94 print "\t\&sigoid_srt\[$x\],\n";
95 }
96
97print "\t};\n\n";
98
99sub check_oid
100 {
101 my ($chk) = @_;
102 if (!exists $oid_tbl{$chk})
103 {
104 die "Not Found \"$chk\"\n";
105 }
106 }
107