1 |
|
|
/* $OpenBSD: matching.c,v 1.2 2010/11/04 15:35:00 martinh Exp $ */ |
2 |
|
|
|
3 |
|
|
/* |
4 |
|
|
* Copyright (c) 2010 Martin Hedenfalk <martinh@openbsd.org> |
5 |
|
|
* |
6 |
|
|
* Permission to use, copy, modify, and distribute this software for any |
7 |
|
|
* purpose with or without fee is hereby granted, provided that the above |
8 |
|
|
* copyright notice and this permission notice appear in all copies. |
9 |
|
|
* |
10 |
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
11 |
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
12 |
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
13 |
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
14 |
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
15 |
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
16 |
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
17 |
|
|
*/ |
18 |
|
|
|
19 |
|
|
#include <sys/types.h> |
20 |
|
|
#include <sys/queue.h> |
21 |
|
|
#include <sys/tree.h> |
22 |
|
|
|
23 |
|
|
#include <stdio.h> |
24 |
|
|
#include <stdlib.h> |
25 |
|
|
#include <string.h> |
26 |
|
|
|
27 |
|
|
#include "schema.h" |
28 |
|
|
|
29 |
|
|
#ifndef nitems |
30 |
|
|
# define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) |
31 |
|
|
#endif |
32 |
|
|
|
33 |
|
|
static const char *ia5string_syntaxes[] = { |
34 |
|
|
"1.3.6.1.4.1.1466.115.121.1.26", |
35 |
|
|
NULL |
36 |
|
|
}; |
37 |
|
|
|
38 |
|
|
static const char *dir_string_syntaxes[] = { |
39 |
|
|
"1.3.6.1.4.1.1466.115.121.1.15", |
40 |
|
|
"1.3.6.1.4.1.1466.115.121.1.44", |
41 |
|
|
"1.3.6.1.4.1.1466.115.121.1.11", |
42 |
|
|
"1.3.6.1.4.1.1466.115.121.1.50", |
43 |
|
|
"1.3.6.1.4.1.1466.115.121.1.26", |
44 |
|
|
NULL |
45 |
|
|
}; |
46 |
|
|
|
47 |
|
|
static const char *num_string_syntaxes[] = { |
48 |
|
|
"1.3.6.1.4.1.1466.115.121.1.36", |
49 |
|
|
NULL |
50 |
|
|
}; |
51 |
|
|
|
52 |
|
|
static const char *telephone_syntaxes[] = { |
53 |
|
|
"1.3.6.1.4.1.1466.115.121.1.50", |
54 |
|
|
NULL |
55 |
|
|
}; |
56 |
|
|
|
57 |
|
|
static const char *dir_string_sequence_syntaxes[] = { |
58 |
|
|
"1.3.6.1.4.1.1466.115.121.1.41", |
59 |
|
|
NULL |
60 |
|
|
}; |
61 |
|
|
|
62 |
|
|
static const char *int_first_component_syntaxes[] = { |
63 |
|
|
"1.3.6.1.4.1.1466.115.121.1.17", |
64 |
|
|
NULL |
65 |
|
|
}; |
66 |
|
|
|
67 |
|
|
static const char *oid_first_component_syntaxes[] = { |
68 |
|
|
"1.3.6.1.4.1.1466.115.121.1.3", |
69 |
|
|
"1.3.6.1.4.1.1466.115.121.1.16", |
70 |
|
|
"1.3.6.1.4.1.1466.115.121.1.54", |
71 |
|
|
"1.3.6.1.4.1.1466.115.121.1.30", |
72 |
|
|
"1.3.6.1.4.1.1466.115.121.1.31", |
73 |
|
|
"1.3.6.1.4.1.1466.115.121.1.35", |
74 |
|
|
"1.3.6.1.4.1.1466.115.121.1.37", |
75 |
|
|
NULL |
76 |
|
|
}; |
77 |
|
|
|
78 |
|
|
struct match_rule match_rules[] = { |
79 |
|
|
|
80 |
|
|
{ "1.3.6.1.1.16.2", "uuidMatch", MATCH_EQUALITY, NULL, "1.3.6.1.1.16.1", NULL }, |
81 |
|
|
{ "1.3.6.1.1.16.3", "uuidOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.1.16.1", NULL }, |
82 |
|
|
{ "1.3.6.1.4.1.1466.109.114.1", "caseExactIA5Match", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.26", ia5string_syntaxes }, |
83 |
|
|
{ "1.3.6.1.4.1.1466.109.114.2", "caseIgnoreIA5Match", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.26", ia5string_syntaxes }, |
84 |
|
|
{ "1.3.6.1.4.1.1466.109.114.3", "caseIgnoreIA5SubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", ia5string_syntaxes }, |
85 |
|
|
{ "2.5.13.0", "objectIdentifierMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.38", NULL }, |
86 |
|
|
{ "2.5.13.1", "distinguishedNameMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.12", NULL }, |
87 |
|
|
{ "2.5.13.10", "numericStringSubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", num_string_syntaxes }, |
88 |
|
|
{ "2.5.13.11", "caseIgnoreListMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.41", NULL }, |
89 |
|
|
{ "2.5.13.12", "caseIgnoreListSubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", dir_string_sequence_syntaxes }, |
90 |
|
|
{ "2.5.13.13", "booleanMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.7", NULL }, |
91 |
|
|
{ "2.5.13.14", "integerMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.27", NULL }, |
92 |
|
|
{ "2.5.13.15", "integerOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.27", NULL }, |
93 |
|
|
{ "2.5.13.16", "bitStringMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.6", NULL }, |
94 |
|
|
{ "2.5.13.17", "octetStringMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.40", NULL }, |
95 |
|
|
{ "2.5.13.18", "octetStringOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.40", NULL }, |
96 |
|
|
{ "2.5.13.2", "caseIgnoreMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.15", dir_string_syntaxes }, |
97 |
|
|
{ "2.5.13.20", "telephoneNumberMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.50", NULL }, |
98 |
|
|
{ "2.5.13.21", "telephoneNumberSubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", telephone_syntaxes }, |
99 |
|
|
{ "2.5.13.23", "uniqueMemberMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.34", NULL }, |
100 |
|
|
{ "2.5.13.27", "generalizedTimeMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.24", NULL }, |
101 |
|
|
{ "2.5.13.28", "generalizedTimeOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.24", NULL }, |
102 |
|
|
{ "2.5.13.29", "integerFirstComponentMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.27", int_first_component_syntaxes }, |
103 |
|
|
{ "2.5.13.3", "caseIgnoreOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.15", dir_string_syntaxes }, |
104 |
|
|
{ "2.5.13.30", "objectIdentifierFirstComponentMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.38", oid_first_component_syntaxes }, |
105 |
|
|
{ "2.5.13.31", "directoryStringFirstComponentMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.15", NULL }, |
106 |
|
|
{ "2.5.13.4", "caseIgnoreSubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", dir_string_syntaxes }, |
107 |
|
|
{ "2.5.13.5", "caseExactMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.15", NULL }, |
108 |
|
|
{ "2.5.13.6", "caseExactOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.15", NULL }, |
109 |
|
|
{ "2.5.13.7", "caseExactSubstringsMatch", MATCH_SUBSTR, NULL, "1.3.6.1.4.1.1466.115.121.1.58", dir_string_syntaxes }, |
110 |
|
|
{ "2.5.13.8", "numericStringMatch", MATCH_EQUALITY, NULL, "1.3.6.1.4.1.1466.115.121.1.36", NULL }, |
111 |
|
|
{ "2.5.13.9", "numericStringOrderingMatch", MATCH_ORDERING, NULL, "1.3.6.1.4.1.1466.115.121.1.36", NULL }, |
112 |
|
|
|
113 |
|
|
#if 0 |
114 |
|
|
{ "2.5.13.32", "wordMatch", "1.3.6.1.4.1.1466.115.121.1.15", MATCH_EQUALITY, NULL }, |
115 |
|
|
{ "2.5.13.33", "keywordMatch", "1.3.6.1.4.1.1466.115.121.1.15", MATCH_EQUALITY, NULL }, |
116 |
|
|
#endif |
117 |
|
|
}; |
118 |
|
|
|
119 |
|
|
int num_match_rules = nitems(match_rules); |
120 |
|
|
|
121 |
|
|
static struct match_rule_alias { |
122 |
|
|
char *name; |
123 |
|
|
char *oid; |
124 |
|
|
} aliases[] = { |
125 |
|
|
{ "caseExactIA5SubstringsMatch", "caseExactSubstringsMatch" }, |
126 |
|
|
}; |
127 |
|
|
|
128 |
|
|
const struct match_rule * |
129 |
|
|
match_rule_lookup(const char *oid_or_name) |
130 |
|
|
{ |
131 |
|
|
unsigned int i; |
132 |
|
|
|
133 |
|
|
for (i = 0; i < nitems(match_rules); i++) { |
134 |
|
|
if (strcasecmp(oid_or_name, match_rules[i].name) == 0 || |
135 |
|
|
strcmp(oid_or_name, match_rules[i].oid) == 0) |
136 |
|
|
return &match_rules[i]; |
137 |
|
|
} |
138 |
|
|
|
139 |
|
|
for (i = 0; i < nitems(aliases); i++) { |
140 |
|
|
if (strcasecmp(oid_or_name, aliases[i].name) == 0) |
141 |
|
|
return match_rule_lookup(aliases[i].oid); |
142 |
|
|
} |
143 |
|
|
|
144 |
|
|
return NULL; |
145 |
|
|
} |
146 |
|
|
|