1e1051a39Sopenharmony_ci#! /usr/bin/env perl 2e1051a39Sopenharmony_ci# Copyright 1998-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci# 4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci# this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci 9e1051a39Sopenharmony_ciuse strict; 10e1051a39Sopenharmony_ciuse FindBin; 11e1051a39Sopenharmony_ciuse lib "$FindBin::Bin/../../util/perl"; 12e1051a39Sopenharmony_ciuse OpenSSL::copyright; 13e1051a39Sopenharmony_ci 14e1051a39Sopenharmony_cimy %xref_tbl; 15e1051a39Sopenharmony_cimy %oid_tbl; 16e1051a39Sopenharmony_ci 17e1051a39Sopenharmony_cimy ($mac_file, $xref_file) = @ARGV; 18e1051a39Sopenharmony_ci 19e1051a39Sopenharmony_ci# The year the output file is generated. 20e1051a39Sopenharmony_cimy $YEAR = OpenSSL::copyright::latest(($0, $mac_file, $xref_file)); 21e1051a39Sopenharmony_ci 22e1051a39Sopenharmony_ciopen(IN, $mac_file) || die "Can't open $mac_file, $!\n"; 23e1051a39Sopenharmony_ci 24e1051a39Sopenharmony_ci# Read in OID nid values for a lookup table. 25e1051a39Sopenharmony_ci 26e1051a39Sopenharmony_ciwhile (<IN>) 27e1051a39Sopenharmony_ci { 28e1051a39Sopenharmony_ci s|\R$||; # Better chomp 29e1051a39Sopenharmony_ci my ($name, $num) = /^(\S+)\s+(\S+)$/; 30e1051a39Sopenharmony_ci $oid_tbl{$name} = $num; 31e1051a39Sopenharmony_ci } 32e1051a39Sopenharmony_ciclose IN; 33e1051a39Sopenharmony_ci 34e1051a39Sopenharmony_ciopen(IN, $xref_file) || die "Can't open $xref_file, $!\n"; 35e1051a39Sopenharmony_ci 36e1051a39Sopenharmony_cimy $ln = 1; 37e1051a39Sopenharmony_ci 38e1051a39Sopenharmony_ciwhile (<IN>) 39e1051a39Sopenharmony_ci { 40e1051a39Sopenharmony_ci s|\R$||; # Better chomp 41e1051a39Sopenharmony_ci s/#.*$//; 42e1051a39Sopenharmony_ci next if (/^\S*$/); 43e1051a39Sopenharmony_ci my ($xr, $p1, $p2) = /^(\S+)\s+(\S+)\s+(\S+)/; 44e1051a39Sopenharmony_ci check_oid($xr); 45e1051a39Sopenharmony_ci check_oid($p1); 46e1051a39Sopenharmony_ci check_oid($p2); 47e1051a39Sopenharmony_ci $xref_tbl{$xr} = [$p1, $p2, $ln]; 48e1051a39Sopenharmony_ci } 49e1051a39Sopenharmony_ci 50e1051a39Sopenharmony_cimy @xrkeys = keys %xref_tbl; 51e1051a39Sopenharmony_ci 52e1051a39Sopenharmony_cimy @srt1 = sort { $oid_tbl{$a} <=> $oid_tbl{$b}} @xrkeys; 53e1051a39Sopenharmony_ci 54e1051a39Sopenharmony_cimy $i; 55e1051a39Sopenharmony_cifor($i = 0; $i <= $#srt1; $i++) 56e1051a39Sopenharmony_ci { 57e1051a39Sopenharmony_ci $xref_tbl{$srt1[$i]}[2] = $i; 58e1051a39Sopenharmony_ci } 59e1051a39Sopenharmony_ci 60e1051a39Sopenharmony_cimy @srt2 = sort 61e1051a39Sopenharmony_ci { 62e1051a39Sopenharmony_ci my$ap1 = $oid_tbl{$xref_tbl{$a}[0]}; 63e1051a39Sopenharmony_ci my$bp1 = $oid_tbl{$xref_tbl{$b}[0]}; 64e1051a39Sopenharmony_ci return $ap1 - $bp1 if ($ap1 != $bp1); 65e1051a39Sopenharmony_ci my$ap2 = $oid_tbl{$xref_tbl{$a}[1]}; 66e1051a39Sopenharmony_ci my$bp2 = $oid_tbl{$xref_tbl{$b}[1]}; 67e1051a39Sopenharmony_ci 68e1051a39Sopenharmony_ci return $ap2 - $bp2; 69e1051a39Sopenharmony_ci } @xrkeys; 70e1051a39Sopenharmony_ci 71e1051a39Sopenharmony_cimy $pname = $0; 72e1051a39Sopenharmony_ci$pname =~ s|.*/||; 73e1051a39Sopenharmony_ci 74e1051a39Sopenharmony_ciprint <<EOF; 75e1051a39Sopenharmony_ci/* 76e1051a39Sopenharmony_ci * WARNING: do not edit! 77e1051a39Sopenharmony_ci * Generated by $pname 78e1051a39Sopenharmony_ci * 79e1051a39Sopenharmony_ci * Copyright 1998-$YEAR The OpenSSL Project Authors. All Rights Reserved. 80e1051a39Sopenharmony_ci * 81e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 82e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 83e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 84e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 85e1051a39Sopenharmony_ci */ 86e1051a39Sopenharmony_ci 87e1051a39Sopenharmony_ci 88e1051a39Sopenharmony_citypedef struct { 89e1051a39Sopenharmony_ci int sign_id; 90e1051a39Sopenharmony_ci int hash_id; 91e1051a39Sopenharmony_ci int pkey_id; 92e1051a39Sopenharmony_ci} nid_triple; 93e1051a39Sopenharmony_ci 94e1051a39Sopenharmony_ciDEFINE_STACK_OF(nid_triple) 95e1051a39Sopenharmony_ci 96e1051a39Sopenharmony_cistatic const nid_triple sigoid_srt[] = { 97e1051a39Sopenharmony_ciEOF 98e1051a39Sopenharmony_ci 99e1051a39Sopenharmony_ciforeach (@srt1) 100e1051a39Sopenharmony_ci { 101e1051a39Sopenharmony_ci my $xr = $_; 102e1051a39Sopenharmony_ci my ($p1, $p2) = @{$xref_tbl{$_}}; 103e1051a39Sopenharmony_ci my $o1 = " {NID_$xr, NID_$p1,"; 104e1051a39Sopenharmony_ci my $o2 = "NID_$p2},"; 105e1051a39Sopenharmony_ci if (length("$o1 $o2") < 78) 106e1051a39Sopenharmony_ci { 107e1051a39Sopenharmony_ci print "$o1 $o2\n"; 108e1051a39Sopenharmony_ci } 109e1051a39Sopenharmony_ci else 110e1051a39Sopenharmony_ci { 111e1051a39Sopenharmony_ci print "$o1\n $o2\n"; 112e1051a39Sopenharmony_ci } 113e1051a39Sopenharmony_ci } 114e1051a39Sopenharmony_ci 115e1051a39Sopenharmony_ciprint "};"; 116e1051a39Sopenharmony_ciprint <<EOF; 117e1051a39Sopenharmony_ci 118e1051a39Sopenharmony_ci 119e1051a39Sopenharmony_cistatic const nid_triple *const sigoid_srt_xref[] = { 120e1051a39Sopenharmony_ciEOF 121e1051a39Sopenharmony_ci 122e1051a39Sopenharmony_ciforeach (@srt2) 123e1051a39Sopenharmony_ci { 124e1051a39Sopenharmony_ci my ($p1, $p2, $x) = @{$xref_tbl{$_}}; 125e1051a39Sopenharmony_ci # If digest or signature algorithm is "undef" then the algorithm 126e1051a39Sopenharmony_ci # needs special handling and is excluded from the cross reference table. 127e1051a39Sopenharmony_ci next if $p1 eq "undef" || $p2 eq "undef"; 128e1051a39Sopenharmony_ci print " \&sigoid_srt\[$x\],\n"; 129e1051a39Sopenharmony_ci } 130e1051a39Sopenharmony_ci 131e1051a39Sopenharmony_ciprint "};\n"; 132e1051a39Sopenharmony_ci 133e1051a39Sopenharmony_cisub check_oid 134e1051a39Sopenharmony_ci { 135e1051a39Sopenharmony_ci my ($chk) = @_; 136e1051a39Sopenharmony_ci if (!exists $oid_tbl{$chk}) 137e1051a39Sopenharmony_ci { 138e1051a39Sopenharmony_ci die "Can't find \"$chk\"\n"; 139e1051a39Sopenharmony_ci } 140e1051a39Sopenharmony_ci } 141