mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] oid_registry: allow arbitrary size OIDs
@ 2025-11-25 18:19 James Bottomley
  2025-11-25 18:33 ` Andrew Morton
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: James Bottomley @ 2025-11-25 18:19 UTC (permalink / raw)
  To: linux-kernel; +Cc: Andrew Morton, David Howells, Blaise Boscaccy

The current OID registry parser uses 64 bit arithmetic which limits us
to supporting 64 bit or smaller OIDs.  This isn't usually a problem
except that it prevents us from representing the 2.25. prefix OIDs
which are the OID representation of UUIDs and have a 128 bit number
following the prefix.  Rather than import not often used perl
arithmetic modules, replace the current perl 64 bit arithmetic with a
callout to bc, which is arbitrary precision.

Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
---
 lib/build_OID_registry | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/lib/build_OID_registry b/lib/build_OID_registry
index 8267e8d71338..7111537eaff8 100755
--- a/lib/build_OID_registry
+++ b/lib/build_OID_registry
@@ -60,10 +60,12 @@ for (my $i = 0; $i <= $#names; $i++) {
     # Determine the encoded length of this OID
     my $size = $#components;
     for (my $loop = 2; $loop <= $#components; $loop++) {
-	my $c = $components[$loop];
+	$ENV{'BC_LINE_LENGTH'} = "200";
+	my $c = `echo "ibase=10; obase=2; $components[$loop]" | bc`;
+	chomp($c);
 
 	# We will base128 encode the number
-	my $tmp = ($c == 0) ? 0 : int(log($c)/log(2));
+	my $tmp = length($c) - 1;
 	$tmp = int($tmp / 7);
 	$size += $tmp;
     }
@@ -100,16 +102,27 @@ for (my $i = 0; $i <= $#names; $i++) {
     push @octets, $components[0] * 40 + $components[1];
 
     for (my $loop = 2; $loop <= $#components; $loop++) {
-	my $c = $components[$loop];
+	# get the base 2 representation of the component
+	$ENV{'BC_LINE_LENGTH'} = "200";
+	my $c = `echo "ibase=10; obase=2; $components[$loop]" | bc`;
+	chomp($c);
 
-	# Base128 encode the number
-	my $tmp = ($c == 0) ? 0 : int(log($c)/log(2));
+	my $tmp = length($c) - 1;
 	$tmp = int($tmp / 7);
 
-	for (; $tmp > 0; $tmp--) {
-	    push @octets, (($c >> $tmp * 7) & 0x7f) | 0x80;
+	# zero pad upto length multiple of 7
+	$c = substr("0000000", 0, ($tmp + 1) * 7 - length($c)).$c;
+
+	# Base128 encode the number
+	my $j;
+	my $b;
+	for ($j = 0; $j < $tmp; $j++) {
+	    $b = oct("0b".substr($c, $j * 7, 7));
+
+	    push @octets, $b | 0x80;
 	}
-	push @octets, $c & 0x7f;
+	$b = oct("0b".substr($c, $j * 7, 7));
+	push @octets, $b;
     }
 
     push @encoded_oids, \@octets;
-- 
2.51.0



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-11-26 19:22 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-11-25 18:19 [PATCH] oid_registry: allow arbitrary size OIDs James Bottomley
2025-11-25 18:33 ` Andrew Morton
2025-11-25 20:33 ` David Howells
2025-11-25 22:12   ` James Bottomley
2025-11-25 20:35 ` David Howells
2025-11-25 22:03   ` James Bottomley
2025-11-26 19:22 ` [PATCH v2 1/1] " James Bottomley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®