xref: /freebsd-src/crypto/openssl/providers/common/der/oids_to_c.pm (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
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