Blame view
lib/oid_registry.c
3.69 KB
b4d0d230c treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-or-later |
a77ad6ea0 X.509: Implement ... |
2 3 4 5 |
/* ASN.1 Object identifier (OID) registry * * Copyright (C) 2012 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com) |
a77ad6ea0 X.509: Implement ... |
6 |
*/ |
9e6879460 Give the OID regi... |
7 |
#include <linux/module.h> |
a77ad6ea0 X.509: Implement ... |
8 9 |
#include <linux/export.h> #include <linux/oid_registry.h> |
4f73175d0 X.509: Add utilit... |
10 11 12 |
#include <linux/kernel.h> #include <linux/errno.h> #include <linux/bug.h> |
a77ad6ea0 X.509: Implement ... |
13 |
#include "oid_registry_data.c" |
9e6879460 Give the OID regi... |
14 15 16 |
MODULE_DESCRIPTION("OID Registry"); MODULE_AUTHOR("Red Hat, Inc."); MODULE_LICENSE("GPL"); |
a77ad6ea0 X.509: Implement ... |
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
/** * look_up_OID - Find an OID registration for the specified data * @data: Binary representation of the OID * @datasize: Size of the binary representation */ enum OID look_up_OID(const void *data, size_t datasize) { const unsigned char *octets = data; enum OID oid; unsigned char xhash; unsigned i, j, k, hash; size_t len; /* Hash the OID data */ hash = datasize - 1; for (i = 0; i < datasize; i++) hash += octets[i] * 33; hash = (hash >> 24) ^ (hash >> 16) ^ (hash >> 8) ^ hash; hash &= 0xff; /* Binary search the OID registry. OIDs are stored in ascending order * of hash value then ascending order of size and then in ascending * order of reverse value. */ i = 0; k = OID__NR; while (i < k) { j = (i + k) / 2; xhash = oid_search_table[j].hash; if (xhash > hash) { k = j; continue; } if (xhash < hash) { i = j + 1; continue; } oid = oid_search_table[j].oid; len = oid_index[oid + 1] - oid_index[oid]; if (len > datasize) { k = j; continue; } if (len < datasize) { i = j + 1; continue; } /* Variation is most likely to be at the tail end of the * OID, so do the comparison in reverse. */ while (len > 0) { unsigned char a = oid_data[oid_index[oid] + --len]; unsigned char b = octets[len]; if (a > b) { k = j; goto next; } if (a < b) { i = j + 1; goto next; } } return oid; next: ; } return OID__NR; } EXPORT_SYMBOL_GPL(look_up_OID); |
4f73175d0 X.509: Add utilit... |
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
/* * sprint_OID - Print an Object Identifier into a buffer * @data: The encoded OID to print * @datasize: The size of the encoded OID * @buffer: The buffer to render into * @bufsize: The size of the buffer * * The OID is rendered into the buffer in "a.b.c.d" format and the number of * bytes is returned. -EBADMSG is returned if the data could not be intepreted * and -ENOBUFS if the buffer was too small. */ int sprint_oid(const void *data, size_t datasize, char *buffer, size_t bufsize) { const unsigned char *v = data, *end = v + datasize; unsigned long num; unsigned char n; size_t ret; int count; if (v >= end) |
8dfd2f22d 509: fix printing... |
112 |
goto bad; |
4f73175d0 X.509: Add utilit... |
113 114 115 |
n = *v++; ret = count = snprintf(buffer, bufsize, "%u.%u", n / 40, n % 40); |
47e0a208f X.509: fix buffer... |
116 117 |
if (count >= bufsize) return -ENOBUFS; |
4f73175d0 X.509: Add utilit... |
118 119 |
buffer += count; bufsize -= count; |
4f73175d0 X.509: Add utilit... |
120 121 122 123 124 125 126 127 128 129 |
while (v < end) { num = 0; n = *v++; if (!(n & 0x80)) { num = n; } else { num = n & 0x7f; do { if (v >= end) |
8dfd2f22d 509: fix printing... |
130 |
goto bad; |
4f73175d0 X.509: Add utilit... |
131 132 133 134 135 136 |
n = *v++; num <<= 7; num |= n & 0x7f; } while (n & 0x80); } ret += count = snprintf(buffer, bufsize, ".%lu", num); |
47e0a208f X.509: fix buffer... |
137 |
if (count >= bufsize) |
4f73175d0 X.509: Add utilit... |
138 |
return -ENOBUFS; |
47e0a208f X.509: fix buffer... |
139 |
buffer += count; |
afdb05e9d lib/oid_registry.... |
140 |
bufsize -= count; |
4f73175d0 X.509: Add utilit... |
141 142 143 |
} return ret; |
8dfd2f22d 509: fix printing... |
144 145 146 147 |
bad: snprintf(buffer, bufsize, "(bad)"); return -EBADMSG; |
4f73175d0 X.509: Add utilit... |
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
} EXPORT_SYMBOL_GPL(sprint_oid); /** * sprint_OID - Print an Object Identifier into a buffer * @oid: The OID to print * @buffer: The buffer to render into * @bufsize: The size of the buffer * * The OID is rendered into the buffer in "a.b.c.d" format and the number of * bytes is returned. */ int sprint_OID(enum OID oid, char *buffer, size_t bufsize) { int ret; BUG_ON(oid >= OID__NR); ret = sprint_oid(oid_data + oid_index[oid], oid_index[oid + 1] - oid_index[oid], buffer, bufsize); BUG_ON(ret == -EBADMSG); return ret; } EXPORT_SYMBOL_GPL(sprint_OID); |