1*b077aed3SPierre Pronchery#! /usr/bin/env perl 2*b077aed3SPierre Pronchery# Copyright 2020 The OpenSSL Project Authors. All Rights Reserved. 3*b077aed3SPierre Pronchery# 4*b077aed3SPierre Pronchery# Licensed under the Apache License 2.0 (the "License"). You may not use 5*b077aed3SPierre Pronchery# this file except in compliance with the License. You can obtain a copy 6*b077aed3SPierre Pronchery# in the file LICENSE in the source distribution or at 7*b077aed3SPierre Pronchery# https://www.openssl.org/source/license.html 8*b077aed3SPierre Pronchery 9*b077aed3SPierre Proncheryuse strict; 10*b077aed3SPierre Proncheryuse warnings; 11*b077aed3SPierre Pronchery 12*b077aed3SPierre Proncherypackage oids_to_c; 13*b077aed3SPierre Pronchery 14*b077aed3SPierre Proncheryuse Carp; 15*b077aed3SPierre Proncheryuse File::Spec; 16*b077aed3SPierre Proncheryuse OpenSSL::OID; 17*b077aed3SPierre Pronchery 18*b077aed3SPierre Proncherymy $OID_name_re = qr/([a-z](?:[-_A-Za-z0-9]*[A-Za-z0-9])?)/; 19*b077aed3SPierre Proncherymy $OID_value_re = qr/(\{.*?\})/s; 20*b077aed3SPierre Proncherymy $OID_def_re = qr/ 21*b077aed3SPierre Pronchery ${OID_name_re} \s+ OBJECT \s+ IDENTIFIER \s* 22*b077aed3SPierre Pronchery ::= 23*b077aed3SPierre Pronchery \s* ${OID_value_re} 24*b077aed3SPierre Pronchery /x; 25*b077aed3SPierre Pronchery 26*b077aed3SPierre Proncherysub filter_to_H { 27*b077aed3SPierre Pronchery my ($name, $comment) = @{ shift() }; 28*b077aed3SPierre Pronchery my @oid_nums = @_; 29*b077aed3SPierre Pronchery my $oid_size = scalar @oid_nums; 30*b077aed3SPierre Pronchery 31*b077aed3SPierre Pronchery (my $C_comment = $comment) =~ s|^| * |msg; 32*b077aed3SPierre Pronchery $C_comment = "\n/*\n${C_comment}\n */" if $C_comment ne ''; 33*b077aed3SPierre Pronchery (my $C_name = $name) =~ s|-|_|g; 34*b077aed3SPierre Pronchery my $C_bytes_size = 2 + scalar @_; 35*b077aed3SPierre Pronchery my $C_bytes = join(', ', map { sprintf("0x%02X", $_) } @oid_nums ); 36*b077aed3SPierre Pronchery 37*b077aed3SPierre Pronchery return <<"_____"; 38*b077aed3SPierre Pronchery$C_comment 39*b077aed3SPierre Pronchery#define DER_OID_V_${C_name} DER_P_OBJECT, $oid_size, ${C_bytes} 40*b077aed3SPierre Pronchery#define DER_OID_SZ_${C_name} ${C_bytes_size} 41*b077aed3SPierre Proncheryextern const unsigned char ossl_der_oid_${C_name}[DER_OID_SZ_${C_name}]; 42*b077aed3SPierre Pronchery_____ 43*b077aed3SPierre Pronchery} 44*b077aed3SPierre Pronchery 45*b077aed3SPierre Proncherysub filter_to_C { 46*b077aed3SPierre Pronchery my ($name, $comment) = @{ shift() }; 47*b077aed3SPierre Pronchery my @oid_nums = @_; 48*b077aed3SPierre Pronchery my $oid_size = scalar @oid_nums; 49*b077aed3SPierre Pronchery 50*b077aed3SPierre Pronchery croak "Unsupported OID size (>127 bytes)" if $oid_size > 127; 51*b077aed3SPierre Pronchery 52*b077aed3SPierre Pronchery (my $C_comment = $comment) =~ s|^| * |msg; 53*b077aed3SPierre Pronchery $C_comment = "\n/*\n${C_comment}\n */" if $C_comment ne ''; 54*b077aed3SPierre Pronchery (my $C_name = $name) =~ s|-|_|g; 55*b077aed3SPierre Pronchery my $C_bytes_size = 2 + $oid_size; 56*b077aed3SPierre Pronchery 57*b077aed3SPierre Pronchery return <<"_____"; 58*b077aed3SPierre Pronchery$C_comment 59*b077aed3SPierre Proncheryconst unsigned char ossl_der_oid_${C_name}[DER_OID_SZ_${C_name}] = { 60*b077aed3SPierre Pronchery DER_OID_V_${C_name} 61*b077aed3SPierre Pronchery}; 62*b077aed3SPierre Pronchery_____ 63*b077aed3SPierre Pronchery} 64*b077aed3SPierre Pronchery 65*b077aed3SPierre Proncherysub _process { 66*b077aed3SPierre Pronchery my %opts = %{ pop @_ } if ref $_[$#_] eq 'HASH'; 67*b077aed3SPierre Pronchery 68*b077aed3SPierre Pronchery # To maintain input order 69*b077aed3SPierre Pronchery my @OID_names = (); 70*b077aed3SPierre Pronchery 71*b077aed3SPierre Pronchery foreach my $file (@_) { 72*b077aed3SPierre Pronchery my $input = File::Spec->catfile($opts{dir}, $file); 73*b077aed3SPierre Pronchery open my $fh, $input or die "Reading $input: $!\n"; 74*b077aed3SPierre Pronchery 75*b077aed3SPierre Pronchery my $text = join('', 76*b077aed3SPierre Pronchery map { 77*b077aed3SPierre Pronchery s|--.*(\R)$|$1|; 78*b077aed3SPierre Pronchery $_; 79*b077aed3SPierre Pronchery } <$fh>); 80*b077aed3SPierre Pronchery # print STDERR "-----BEGIN DEBUG-----\n"; 81*b077aed3SPierre Pronchery # print STDERR $text; 82*b077aed3SPierre Pronchery # print STDERR "-----END DEBUG-----\n"; 83*b077aed3SPierre Pronchery use re 'debugcolor'; 84*b077aed3SPierre Pronchery while ($text =~ m/${OID_def_re}/sg) { 85*b077aed3SPierre Pronchery my $comment = $&; 86*b077aed3SPierre Pronchery my $name = $1; 87*b077aed3SPierre Pronchery my $value = $2; 88*b077aed3SPierre Pronchery 89*b077aed3SPierre Pronchery # print STDERR "-----BEGIN DEBUG $name-----\n"; 90*b077aed3SPierre Pronchery # print STDERR $value,"\n"; 91*b077aed3SPierre Pronchery # print STDERR "-----END DEBUG $name-----\n"; 92*b077aed3SPierre Pronchery register_oid($name, $value); 93*b077aed3SPierre Pronchery push @OID_names, [ $name, $comment ]; 94*b077aed3SPierre Pronchery } 95*b077aed3SPierre Pronchery } 96*b077aed3SPierre Pronchery 97*b077aed3SPierre Pronchery return @OID_names; 98*b077aed3SPierre Pronchery} 99*b077aed3SPierre Pronchery 100*b077aed3SPierre Proncherysub process_leaves { 101*b077aed3SPierre Pronchery my %opts = %{ $_[$#_] } if ref $_[$#_] eq 'HASH'; 102*b077aed3SPierre Pronchery my @OID_names = _process @_; 103*b077aed3SPierre Pronchery 104*b077aed3SPierre Pronchery my $text = ''; 105*b077aed3SPierre Pronchery my %leaves = map { $_ => 1 } registered_oid_leaves; 106*b077aed3SPierre Pronchery foreach (grep { defined $leaves{$_->[0]} } @OID_names) { 107*b077aed3SPierre Pronchery my $lines = $opts{filter}->($_, encode_oid($_->[0])); 108*b077aed3SPierre Pronchery $text .= $lines; 109*b077aed3SPierre Pronchery } 110*b077aed3SPierre Pronchery return $text; 111*b077aed3SPierre Pronchery} 112*b077aed3SPierre Pronchery 113*b077aed3SPierre Pronchery1; 114