xref: /aosp_15_r20/external/boringssl/src/crypto/obj/objects.go (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1*8fb009dcSAndroid Build Coastguard Worker// Copyright (c) 2016, Google Inc.
2*8fb009dcSAndroid Build Coastguard Worker//
3*8fb009dcSAndroid Build Coastguard Worker// Permission to use, copy, modify, and/or distribute this software for any
4*8fb009dcSAndroid Build Coastguard Worker// purpose with or without fee is hereby granted, provided that the above
5*8fb009dcSAndroid Build Coastguard Worker// copyright notice and this permission notice appear in all copies.
6*8fb009dcSAndroid Build Coastguard Worker//
7*8fb009dcSAndroid Build Coastguard Worker// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8*8fb009dcSAndroid Build Coastguard Worker// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9*8fb009dcSAndroid Build Coastguard Worker// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10*8fb009dcSAndroid Build Coastguard Worker// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11*8fb009dcSAndroid Build Coastguard Worker// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12*8fb009dcSAndroid Build Coastguard Worker// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13*8fb009dcSAndroid Build Coastguard Worker// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14*8fb009dcSAndroid Build Coastguard Worker
15*8fb009dcSAndroid Build Coastguard Worker//go:build ignore
16*8fb009dcSAndroid Build Coastguard Worker
17*8fb009dcSAndroid Build Coastguard Workerpackage main
18*8fb009dcSAndroid Build Coastguard Worker
19*8fb009dcSAndroid Build Coastguard Workerimport (
20*8fb009dcSAndroid Build Coastguard Worker	"bufio"
21*8fb009dcSAndroid Build Coastguard Worker	"bytes"
22*8fb009dcSAndroid Build Coastguard Worker	"errors"
23*8fb009dcSAndroid Build Coastguard Worker	"fmt"
24*8fb009dcSAndroid Build Coastguard Worker	"os"
25*8fb009dcSAndroid Build Coastguard Worker	"os/exec"
26*8fb009dcSAndroid Build Coastguard Worker	"sort"
27*8fb009dcSAndroid Build Coastguard Worker	"strconv"
28*8fb009dcSAndroid Build Coastguard Worker	"strings"
29*8fb009dcSAndroid Build Coastguard Worker)
30*8fb009dcSAndroid Build Coastguard Worker
31*8fb009dcSAndroid Build Coastguard Workerfunc sanitizeName(in string) string {
32*8fb009dcSAndroid Build Coastguard Worker	in = strings.Replace(in, "-", "_", -1)
33*8fb009dcSAndroid Build Coastguard Worker	in = strings.Replace(in, ".", "_", -1)
34*8fb009dcSAndroid Build Coastguard Worker	in = strings.Replace(in, " ", "_", -1)
35*8fb009dcSAndroid Build Coastguard Worker	return in
36*8fb009dcSAndroid Build Coastguard Worker}
37*8fb009dcSAndroid Build Coastguard Worker
38*8fb009dcSAndroid Build Coastguard Workertype object struct {
39*8fb009dcSAndroid Build Coastguard Worker	name string
40*8fb009dcSAndroid Build Coastguard Worker	// shortName and longName are the short and long names, respectively. If
41*8fb009dcSAndroid Build Coastguard Worker	// one is missing, it takes the value of the other, but the
42*8fb009dcSAndroid Build Coastguard Worker	// corresponding SN_foo or LN_foo macro is not defined.
43*8fb009dcSAndroid Build Coastguard Worker	shortName, longName       string
44*8fb009dcSAndroid Build Coastguard Worker	hasShortName, hasLongName bool
45*8fb009dcSAndroid Build Coastguard Worker	oid                       []int
46*8fb009dcSAndroid Build Coastguard Worker	encoded                   []byte
47*8fb009dcSAndroid Build Coastguard Worker}
48*8fb009dcSAndroid Build Coastguard Worker
49*8fb009dcSAndroid Build Coastguard Workertype objects struct {
50*8fb009dcSAndroid Build Coastguard Worker	// byNID is the list of all objects, indexed by nid.
51*8fb009dcSAndroid Build Coastguard Worker	byNID []object
52*8fb009dcSAndroid Build Coastguard Worker	// nameToNID is a map from object name to nid.
53*8fb009dcSAndroid Build Coastguard Worker	nameToNID map[string]int
54*8fb009dcSAndroid Build Coastguard Worker}
55*8fb009dcSAndroid Build Coastguard Worker
56*8fb009dcSAndroid Build Coastguard Workerfunc readNumbers(path string) (nameToNID map[string]int, numNIDs int, err error) {
57*8fb009dcSAndroid Build Coastguard Worker	in, err := os.Open(path)
58*8fb009dcSAndroid Build Coastguard Worker	if err != nil {
59*8fb009dcSAndroid Build Coastguard Worker		return nil, 0, err
60*8fb009dcSAndroid Build Coastguard Worker	}
61*8fb009dcSAndroid Build Coastguard Worker	defer in.Close()
62*8fb009dcSAndroid Build Coastguard Worker
63*8fb009dcSAndroid Build Coastguard Worker	nameToNID = make(map[string]int)
64*8fb009dcSAndroid Build Coastguard Worker	nidsSeen := make(map[int]struct{})
65*8fb009dcSAndroid Build Coastguard Worker
66*8fb009dcSAndroid Build Coastguard Worker	// Reserve NID 0 for NID_undef.
67*8fb009dcSAndroid Build Coastguard Worker	numNIDs = 1
68*8fb009dcSAndroid Build Coastguard Worker	nameToNID["undef"] = 0
69*8fb009dcSAndroid Build Coastguard Worker	nidsSeen[0] = struct{}{}
70*8fb009dcSAndroid Build Coastguard Worker
71*8fb009dcSAndroid Build Coastguard Worker	var lineNo int
72*8fb009dcSAndroid Build Coastguard Worker	scanner := bufio.NewScanner(in)
73*8fb009dcSAndroid Build Coastguard Worker	for scanner.Scan() {
74*8fb009dcSAndroid Build Coastguard Worker		line := scanner.Text()
75*8fb009dcSAndroid Build Coastguard Worker		lineNo++
76*8fb009dcSAndroid Build Coastguard Worker		withLine := func(err error) error {
77*8fb009dcSAndroid Build Coastguard Worker			return fmt.Errorf("%s:%d: %s", path, lineNo, err)
78*8fb009dcSAndroid Build Coastguard Worker		}
79*8fb009dcSAndroid Build Coastguard Worker
80*8fb009dcSAndroid Build Coastguard Worker		fields := strings.Fields(line)
81*8fb009dcSAndroid Build Coastguard Worker		if len(fields) == 0 {
82*8fb009dcSAndroid Build Coastguard Worker			// Skip blank lines.
83*8fb009dcSAndroid Build Coastguard Worker			continue
84*8fb009dcSAndroid Build Coastguard Worker		}
85*8fb009dcSAndroid Build Coastguard Worker
86*8fb009dcSAndroid Build Coastguard Worker		// Each line is a name and a nid, separated by space.
87*8fb009dcSAndroid Build Coastguard Worker		if len(fields) != 2 {
88*8fb009dcSAndroid Build Coastguard Worker			return nil, 0, withLine(errors.New("syntax error"))
89*8fb009dcSAndroid Build Coastguard Worker		}
90*8fb009dcSAndroid Build Coastguard Worker		name := fields[0]
91*8fb009dcSAndroid Build Coastguard Worker		nid, err := strconv.Atoi(fields[1])
92*8fb009dcSAndroid Build Coastguard Worker		if err != nil {
93*8fb009dcSAndroid Build Coastguard Worker			return nil, 0, withLine(err)
94*8fb009dcSAndroid Build Coastguard Worker		}
95*8fb009dcSAndroid Build Coastguard Worker		if nid < 0 {
96*8fb009dcSAndroid Build Coastguard Worker			return nil, 0, withLine(errors.New("invalid NID"))
97*8fb009dcSAndroid Build Coastguard Worker		}
98*8fb009dcSAndroid Build Coastguard Worker
99*8fb009dcSAndroid Build Coastguard Worker		// NID_undef is implicitly defined.
100*8fb009dcSAndroid Build Coastguard Worker		if name == "undef" && nid == 0 {
101*8fb009dcSAndroid Build Coastguard Worker			continue
102*8fb009dcSAndroid Build Coastguard Worker		}
103*8fb009dcSAndroid Build Coastguard Worker
104*8fb009dcSAndroid Build Coastguard Worker		// Forbid duplicates.
105*8fb009dcSAndroid Build Coastguard Worker		if _, ok := nameToNID[name]; ok {
106*8fb009dcSAndroid Build Coastguard Worker			return nil, 0, withLine(fmt.Errorf("duplicate name %q", name))
107*8fb009dcSAndroid Build Coastguard Worker		}
108*8fb009dcSAndroid Build Coastguard Worker		if _, ok := nidsSeen[nid]; ok {
109*8fb009dcSAndroid Build Coastguard Worker			return nil, 0, withLine(fmt.Errorf("duplicate NID %d", nid))
110*8fb009dcSAndroid Build Coastguard Worker		}
111*8fb009dcSAndroid Build Coastguard Worker
112*8fb009dcSAndroid Build Coastguard Worker		nameToNID[name] = nid
113*8fb009dcSAndroid Build Coastguard Worker		nidsSeen[nid] = struct{}{}
114*8fb009dcSAndroid Build Coastguard Worker
115*8fb009dcSAndroid Build Coastguard Worker		if nid >= numNIDs {
116*8fb009dcSAndroid Build Coastguard Worker			numNIDs = nid + 1
117*8fb009dcSAndroid Build Coastguard Worker		}
118*8fb009dcSAndroid Build Coastguard Worker	}
119*8fb009dcSAndroid Build Coastguard Worker	if err := scanner.Err(); err != nil {
120*8fb009dcSAndroid Build Coastguard Worker		return nil, 0, fmt.Errorf("error reading %s: %s", path, err)
121*8fb009dcSAndroid Build Coastguard Worker	}
122*8fb009dcSAndroid Build Coastguard Worker
123*8fb009dcSAndroid Build Coastguard Worker	return nameToNID, numNIDs, nil
124*8fb009dcSAndroid Build Coastguard Worker}
125*8fb009dcSAndroid Build Coastguard Worker
126*8fb009dcSAndroid Build Coastguard Workerfunc parseOID(aliases map[string][]int, in []string) (oid []int, err error) {
127*8fb009dcSAndroid Build Coastguard Worker	if len(in) == 0 {
128*8fb009dcSAndroid Build Coastguard Worker		return
129*8fb009dcSAndroid Build Coastguard Worker	}
130*8fb009dcSAndroid Build Coastguard Worker
131*8fb009dcSAndroid Build Coastguard Worker	// The first entry may be a reference to a previous alias.
132*8fb009dcSAndroid Build Coastguard Worker	if alias, ok := aliases[sanitizeName(in[0])]; ok {
133*8fb009dcSAndroid Build Coastguard Worker		in = in[1:]
134*8fb009dcSAndroid Build Coastguard Worker		oid = append(oid, alias...)
135*8fb009dcSAndroid Build Coastguard Worker	}
136*8fb009dcSAndroid Build Coastguard Worker
137*8fb009dcSAndroid Build Coastguard Worker	for _, c := range in {
138*8fb009dcSAndroid Build Coastguard Worker		val, err := strconv.Atoi(c)
139*8fb009dcSAndroid Build Coastguard Worker		if err != nil {
140*8fb009dcSAndroid Build Coastguard Worker			return nil, err
141*8fb009dcSAndroid Build Coastguard Worker		}
142*8fb009dcSAndroid Build Coastguard Worker		if val < 0 {
143*8fb009dcSAndroid Build Coastguard Worker			return nil, fmt.Errorf("negative component")
144*8fb009dcSAndroid Build Coastguard Worker		}
145*8fb009dcSAndroid Build Coastguard Worker		oid = append(oid, val)
146*8fb009dcSAndroid Build Coastguard Worker	}
147*8fb009dcSAndroid Build Coastguard Worker	return
148*8fb009dcSAndroid Build Coastguard Worker}
149*8fb009dcSAndroid Build Coastguard Worker
150*8fb009dcSAndroid Build Coastguard Workerfunc appendBase128(dst []byte, value int) []byte {
151*8fb009dcSAndroid Build Coastguard Worker	// Zero is encoded with one, not zero bytes.
152*8fb009dcSAndroid Build Coastguard Worker	if value == 0 {
153*8fb009dcSAndroid Build Coastguard Worker		return append(dst, 0)
154*8fb009dcSAndroid Build Coastguard Worker	}
155*8fb009dcSAndroid Build Coastguard Worker
156*8fb009dcSAndroid Build Coastguard Worker	// Count how many bytes are needed.
157*8fb009dcSAndroid Build Coastguard Worker	var l int
158*8fb009dcSAndroid Build Coastguard Worker	for n := value; n != 0; n >>= 7 {
159*8fb009dcSAndroid Build Coastguard Worker		l++
160*8fb009dcSAndroid Build Coastguard Worker	}
161*8fb009dcSAndroid Build Coastguard Worker	for ; l > 0; l-- {
162*8fb009dcSAndroid Build Coastguard Worker		b := byte(value>>uint(7*(l-1))) & 0x7f
163*8fb009dcSAndroid Build Coastguard Worker		if l > 1 {
164*8fb009dcSAndroid Build Coastguard Worker			b |= 0x80
165*8fb009dcSAndroid Build Coastguard Worker		}
166*8fb009dcSAndroid Build Coastguard Worker		dst = append(dst, b)
167*8fb009dcSAndroid Build Coastguard Worker	}
168*8fb009dcSAndroid Build Coastguard Worker	return dst
169*8fb009dcSAndroid Build Coastguard Worker}
170*8fb009dcSAndroid Build Coastguard Worker
171*8fb009dcSAndroid Build Coastguard Workerfunc encodeOID(oid []int) []byte {
172*8fb009dcSAndroid Build Coastguard Worker	if len(oid) < 2 {
173*8fb009dcSAndroid Build Coastguard Worker		return nil
174*8fb009dcSAndroid Build Coastguard Worker	}
175*8fb009dcSAndroid Build Coastguard Worker
176*8fb009dcSAndroid Build Coastguard Worker	var der []byte
177*8fb009dcSAndroid Build Coastguard Worker	der = appendBase128(der, 40*oid[0]+oid[1])
178*8fb009dcSAndroid Build Coastguard Worker	for _, value := range oid[2:] {
179*8fb009dcSAndroid Build Coastguard Worker		der = appendBase128(der, value)
180*8fb009dcSAndroid Build Coastguard Worker	}
181*8fb009dcSAndroid Build Coastguard Worker	return der
182*8fb009dcSAndroid Build Coastguard Worker}
183*8fb009dcSAndroid Build Coastguard Worker
184*8fb009dcSAndroid Build Coastguard Workerfunc readObjects(numPath, objectsPath string) (*objects, error) {
185*8fb009dcSAndroid Build Coastguard Worker	nameToNID, numNIDs, err := readNumbers(numPath)
186*8fb009dcSAndroid Build Coastguard Worker	if err != nil {
187*8fb009dcSAndroid Build Coastguard Worker		return nil, err
188*8fb009dcSAndroid Build Coastguard Worker	}
189*8fb009dcSAndroid Build Coastguard Worker
190*8fb009dcSAndroid Build Coastguard Worker	in, err := os.Open(objectsPath)
191*8fb009dcSAndroid Build Coastguard Worker	if err != nil {
192*8fb009dcSAndroid Build Coastguard Worker		return nil, err
193*8fb009dcSAndroid Build Coastguard Worker	}
194*8fb009dcSAndroid Build Coastguard Worker	defer in.Close()
195*8fb009dcSAndroid Build Coastguard Worker
196*8fb009dcSAndroid Build Coastguard Worker	// Implicitly define NID_undef.
197*8fb009dcSAndroid Build Coastguard Worker	objs := &objects{
198*8fb009dcSAndroid Build Coastguard Worker		byNID:     make([]object, numNIDs),
199*8fb009dcSAndroid Build Coastguard Worker		nameToNID: make(map[string]int),
200*8fb009dcSAndroid Build Coastguard Worker	}
201*8fb009dcSAndroid Build Coastguard Worker
202*8fb009dcSAndroid Build Coastguard Worker	objs.byNID[0] = object{
203*8fb009dcSAndroid Build Coastguard Worker		name:         "undef",
204*8fb009dcSAndroid Build Coastguard Worker		shortName:    "UNDEF",
205*8fb009dcSAndroid Build Coastguard Worker		longName:     "undefined",
206*8fb009dcSAndroid Build Coastguard Worker		hasShortName: true,
207*8fb009dcSAndroid Build Coastguard Worker		hasLongName:  true,
208*8fb009dcSAndroid Build Coastguard Worker	}
209*8fb009dcSAndroid Build Coastguard Worker	objs.nameToNID["undef"] = 0
210*8fb009dcSAndroid Build Coastguard Worker
211*8fb009dcSAndroid Build Coastguard Worker	var module, nextName string
212*8fb009dcSAndroid Build Coastguard Worker	var lineNo int
213*8fb009dcSAndroid Build Coastguard Worker	longNamesSeen := make(map[string]struct{})
214*8fb009dcSAndroid Build Coastguard Worker	shortNamesSeen := make(map[string]struct{})
215*8fb009dcSAndroid Build Coastguard Worker	aliases := make(map[string][]int)
216*8fb009dcSAndroid Build Coastguard Worker	scanner := bufio.NewScanner(in)
217*8fb009dcSAndroid Build Coastguard Worker	for scanner.Scan() {
218*8fb009dcSAndroid Build Coastguard Worker		line := scanner.Text()
219*8fb009dcSAndroid Build Coastguard Worker		lineNo++
220*8fb009dcSAndroid Build Coastguard Worker		withLine := func(err error) error {
221*8fb009dcSAndroid Build Coastguard Worker			return fmt.Errorf("%s:%d: %s", objectsPath, lineNo, err)
222*8fb009dcSAndroid Build Coastguard Worker		}
223*8fb009dcSAndroid Build Coastguard Worker
224*8fb009dcSAndroid Build Coastguard Worker		// Remove comments.
225*8fb009dcSAndroid Build Coastguard Worker		idx := strings.IndexRune(line, '#')
226*8fb009dcSAndroid Build Coastguard Worker		if idx >= 0 {
227*8fb009dcSAndroid Build Coastguard Worker			line = line[:idx]
228*8fb009dcSAndroid Build Coastguard Worker		}
229*8fb009dcSAndroid Build Coastguard Worker
230*8fb009dcSAndroid Build Coastguard Worker		// Skip empty lines.
231*8fb009dcSAndroid Build Coastguard Worker		line = strings.TrimSpace(line)
232*8fb009dcSAndroid Build Coastguard Worker		if len(line) == 0 {
233*8fb009dcSAndroid Build Coastguard Worker			continue
234*8fb009dcSAndroid Build Coastguard Worker		}
235*8fb009dcSAndroid Build Coastguard Worker
236*8fb009dcSAndroid Build Coastguard Worker		if line[0] == '!' {
237*8fb009dcSAndroid Build Coastguard Worker			args := strings.Fields(line)
238*8fb009dcSAndroid Build Coastguard Worker			switch args[0] {
239*8fb009dcSAndroid Build Coastguard Worker			case "!module":
240*8fb009dcSAndroid Build Coastguard Worker				if len(args) != 2 {
241*8fb009dcSAndroid Build Coastguard Worker					return nil, withLine(errors.New("too many arguments"))
242*8fb009dcSAndroid Build Coastguard Worker				}
243*8fb009dcSAndroid Build Coastguard Worker				module = sanitizeName(args[1]) + "_"
244*8fb009dcSAndroid Build Coastguard Worker			case "!global":
245*8fb009dcSAndroid Build Coastguard Worker				module = ""
246*8fb009dcSAndroid Build Coastguard Worker			case "!Cname":
247*8fb009dcSAndroid Build Coastguard Worker				// !Cname directives override the name for the
248*8fb009dcSAndroid Build Coastguard Worker				// next object.
249*8fb009dcSAndroid Build Coastguard Worker				if len(args) != 2 {
250*8fb009dcSAndroid Build Coastguard Worker					return nil, withLine(errors.New("too many arguments"))
251*8fb009dcSAndroid Build Coastguard Worker				}
252*8fb009dcSAndroid Build Coastguard Worker				nextName = sanitizeName(args[1])
253*8fb009dcSAndroid Build Coastguard Worker			case "!Alias":
254*8fb009dcSAndroid Build Coastguard Worker				// !Alias directives define an alias for an OID
255*8fb009dcSAndroid Build Coastguard Worker				// without emitting an object.
256*8fb009dcSAndroid Build Coastguard Worker				if len(nextName) != 0 {
257*8fb009dcSAndroid Build Coastguard Worker					return nil, withLine(errors.New("!Cname directives may not modify !Alias directives."))
258*8fb009dcSAndroid Build Coastguard Worker				}
259*8fb009dcSAndroid Build Coastguard Worker				if len(args) < 3 {
260*8fb009dcSAndroid Build Coastguard Worker					return nil, withLine(errors.New("not enough arguments"))
261*8fb009dcSAndroid Build Coastguard Worker				}
262*8fb009dcSAndroid Build Coastguard Worker				aliasName := module + sanitizeName(args[1])
263*8fb009dcSAndroid Build Coastguard Worker				oid, err := parseOID(aliases, args[2:])
264*8fb009dcSAndroid Build Coastguard Worker				if err != nil {
265*8fb009dcSAndroid Build Coastguard Worker					return nil, withLine(err)
266*8fb009dcSAndroid Build Coastguard Worker				}
267*8fb009dcSAndroid Build Coastguard Worker				if _, ok := aliases[aliasName]; ok {
268*8fb009dcSAndroid Build Coastguard Worker					return nil, withLine(fmt.Errorf("duplicate name '%s'", aliasName))
269*8fb009dcSAndroid Build Coastguard Worker				}
270*8fb009dcSAndroid Build Coastguard Worker				aliases[aliasName] = oid
271*8fb009dcSAndroid Build Coastguard Worker			default:
272*8fb009dcSAndroid Build Coastguard Worker				return nil, withLine(fmt.Errorf("unknown directive '%s'", args[0]))
273*8fb009dcSAndroid Build Coastguard Worker			}
274*8fb009dcSAndroid Build Coastguard Worker			continue
275*8fb009dcSAndroid Build Coastguard Worker		}
276*8fb009dcSAndroid Build Coastguard Worker
277*8fb009dcSAndroid Build Coastguard Worker		fields := strings.Split(line, ":")
278*8fb009dcSAndroid Build Coastguard Worker		if len(fields) < 2 || len(fields) > 3 {
279*8fb009dcSAndroid Build Coastguard Worker			return nil, withLine(errors.New("invalid field count"))
280*8fb009dcSAndroid Build Coastguard Worker		}
281*8fb009dcSAndroid Build Coastguard Worker
282*8fb009dcSAndroid Build Coastguard Worker		obj := object{name: nextName}
283*8fb009dcSAndroid Build Coastguard Worker		nextName = ""
284*8fb009dcSAndroid Build Coastguard Worker
285*8fb009dcSAndroid Build Coastguard Worker		var err error
286*8fb009dcSAndroid Build Coastguard Worker		obj.oid, err = parseOID(aliases, strings.Fields(fields[0]))
287*8fb009dcSAndroid Build Coastguard Worker		if err != nil {
288*8fb009dcSAndroid Build Coastguard Worker			return nil, withLine(err)
289*8fb009dcSAndroid Build Coastguard Worker		}
290*8fb009dcSAndroid Build Coastguard Worker		obj.encoded = encodeOID(obj.oid)
291*8fb009dcSAndroid Build Coastguard Worker
292*8fb009dcSAndroid Build Coastguard Worker		obj.shortName = strings.TrimSpace(fields[1])
293*8fb009dcSAndroid Build Coastguard Worker		if len(fields) == 3 {
294*8fb009dcSAndroid Build Coastguard Worker			obj.longName = strings.TrimSpace(fields[2])
295*8fb009dcSAndroid Build Coastguard Worker		}
296*8fb009dcSAndroid Build Coastguard Worker
297*8fb009dcSAndroid Build Coastguard Worker		// Long and short names default to each other if missing.
298*8fb009dcSAndroid Build Coastguard Worker		if len(obj.shortName) == 0 {
299*8fb009dcSAndroid Build Coastguard Worker			obj.shortName = obj.longName
300*8fb009dcSAndroid Build Coastguard Worker		} else {
301*8fb009dcSAndroid Build Coastguard Worker			obj.hasShortName = true
302*8fb009dcSAndroid Build Coastguard Worker		}
303*8fb009dcSAndroid Build Coastguard Worker		if len(obj.longName) == 0 {
304*8fb009dcSAndroid Build Coastguard Worker			obj.longName = obj.shortName
305*8fb009dcSAndroid Build Coastguard Worker		} else {
306*8fb009dcSAndroid Build Coastguard Worker			obj.hasLongName = true
307*8fb009dcSAndroid Build Coastguard Worker		}
308*8fb009dcSAndroid Build Coastguard Worker		if len(obj.shortName) == 0 || len(obj.longName) == 0 {
309*8fb009dcSAndroid Build Coastguard Worker			return nil, withLine(errors.New("object with no name"))
310*8fb009dcSAndroid Build Coastguard Worker		}
311*8fb009dcSAndroid Build Coastguard Worker
312*8fb009dcSAndroid Build Coastguard Worker		// If not already specified, prefer the long name if it has no
313*8fb009dcSAndroid Build Coastguard Worker		// spaces, otherwise the short name.
314*8fb009dcSAndroid Build Coastguard Worker		if len(obj.name) == 0 && strings.IndexRune(obj.longName, ' ') < 0 {
315*8fb009dcSAndroid Build Coastguard Worker			obj.name = sanitizeName(obj.longName)
316*8fb009dcSAndroid Build Coastguard Worker		}
317*8fb009dcSAndroid Build Coastguard Worker		if len(obj.name) == 0 {
318*8fb009dcSAndroid Build Coastguard Worker			obj.name = sanitizeName(obj.shortName)
319*8fb009dcSAndroid Build Coastguard Worker		}
320*8fb009dcSAndroid Build Coastguard Worker		obj.name = module + obj.name
321*8fb009dcSAndroid Build Coastguard Worker
322*8fb009dcSAndroid Build Coastguard Worker		// Check for duplicate names.
323*8fb009dcSAndroid Build Coastguard Worker		if _, ok := aliases[obj.name]; ok {
324*8fb009dcSAndroid Build Coastguard Worker			return nil, withLine(fmt.Errorf("duplicate name '%s'", obj.name))
325*8fb009dcSAndroid Build Coastguard Worker		}
326*8fb009dcSAndroid Build Coastguard Worker		if _, ok := shortNamesSeen[obj.shortName]; ok && len(obj.shortName) > 0 {
327*8fb009dcSAndroid Build Coastguard Worker			return nil, withLine(fmt.Errorf("duplicate short name '%s'", obj.shortName))
328*8fb009dcSAndroid Build Coastguard Worker		}
329*8fb009dcSAndroid Build Coastguard Worker		if _, ok := longNamesSeen[obj.longName]; ok && len(obj.longName) > 0 {
330*8fb009dcSAndroid Build Coastguard Worker			return nil, withLine(fmt.Errorf("duplicate long name '%s'", obj.longName))
331*8fb009dcSAndroid Build Coastguard Worker		}
332*8fb009dcSAndroid Build Coastguard Worker
333*8fb009dcSAndroid Build Coastguard Worker		// Allocate a NID.
334*8fb009dcSAndroid Build Coastguard Worker		nid, ok := nameToNID[obj.name]
335*8fb009dcSAndroid Build Coastguard Worker		if !ok {
336*8fb009dcSAndroid Build Coastguard Worker			nid = len(objs.byNID)
337*8fb009dcSAndroid Build Coastguard Worker			objs.byNID = append(objs.byNID, object{})
338*8fb009dcSAndroid Build Coastguard Worker		}
339*8fb009dcSAndroid Build Coastguard Worker
340*8fb009dcSAndroid Build Coastguard Worker		objs.byNID[nid] = obj
341*8fb009dcSAndroid Build Coastguard Worker		objs.nameToNID[obj.name] = nid
342*8fb009dcSAndroid Build Coastguard Worker
343*8fb009dcSAndroid Build Coastguard Worker		longNamesSeen[obj.longName] = struct{}{}
344*8fb009dcSAndroid Build Coastguard Worker		shortNamesSeen[obj.shortName] = struct{}{}
345*8fb009dcSAndroid Build Coastguard Worker		aliases[obj.name] = obj.oid
346*8fb009dcSAndroid Build Coastguard Worker	}
347*8fb009dcSAndroid Build Coastguard Worker	if err := scanner.Err(); err != nil {
348*8fb009dcSAndroid Build Coastguard Worker		return nil, err
349*8fb009dcSAndroid Build Coastguard Worker	}
350*8fb009dcSAndroid Build Coastguard Worker
351*8fb009dcSAndroid Build Coastguard Worker	// The kNIDsIn*Order constants assume each NID fits in a uint16_t.
352*8fb009dcSAndroid Build Coastguard Worker	if len(objs.byNID) > 0xffff {
353*8fb009dcSAndroid Build Coastguard Worker		return nil, errors.New("too many NIDs allocated")
354*8fb009dcSAndroid Build Coastguard Worker	}
355*8fb009dcSAndroid Build Coastguard Worker
356*8fb009dcSAndroid Build Coastguard Worker	return objs, nil
357*8fb009dcSAndroid Build Coastguard Worker}
358*8fb009dcSAndroid Build Coastguard Worker
359*8fb009dcSAndroid Build Coastguard Workerfunc writeNumbers(path string, objs *objects) error {
360*8fb009dcSAndroid Build Coastguard Worker	out, err := os.Create(path)
361*8fb009dcSAndroid Build Coastguard Worker	if err != nil {
362*8fb009dcSAndroid Build Coastguard Worker		return err
363*8fb009dcSAndroid Build Coastguard Worker	}
364*8fb009dcSAndroid Build Coastguard Worker	defer out.Close()
365*8fb009dcSAndroid Build Coastguard Worker
366*8fb009dcSAndroid Build Coastguard Worker	for nid, obj := range objs.byNID {
367*8fb009dcSAndroid Build Coastguard Worker		if len(obj.name) == 0 {
368*8fb009dcSAndroid Build Coastguard Worker			continue
369*8fb009dcSAndroid Build Coastguard Worker		}
370*8fb009dcSAndroid Build Coastguard Worker		if _, err := fmt.Fprintf(out, "%s\t\t%d\n", obj.name, nid); err != nil {
371*8fb009dcSAndroid Build Coastguard Worker			return err
372*8fb009dcSAndroid Build Coastguard Worker		}
373*8fb009dcSAndroid Build Coastguard Worker	}
374*8fb009dcSAndroid Build Coastguard Worker	return nil
375*8fb009dcSAndroid Build Coastguard Worker}
376*8fb009dcSAndroid Build Coastguard Worker
377*8fb009dcSAndroid Build Coastguard Workerfunc clangFormat(input string) (string, error) {
378*8fb009dcSAndroid Build Coastguard Worker	var b bytes.Buffer
379*8fb009dcSAndroid Build Coastguard Worker	cmd := exec.Command("clang-format")
380*8fb009dcSAndroid Build Coastguard Worker	cmd.Stdin = strings.NewReader(input)
381*8fb009dcSAndroid Build Coastguard Worker	cmd.Stdout = &b
382*8fb009dcSAndroid Build Coastguard Worker	cmd.Stderr = os.Stderr
383*8fb009dcSAndroid Build Coastguard Worker	if err := cmd.Run(); err != nil {
384*8fb009dcSAndroid Build Coastguard Worker		return "", err
385*8fb009dcSAndroid Build Coastguard Worker	}
386*8fb009dcSAndroid Build Coastguard Worker	return b.String(), nil
387*8fb009dcSAndroid Build Coastguard Worker}
388*8fb009dcSAndroid Build Coastguard Worker
389*8fb009dcSAndroid Build Coastguard Workerfunc writeHeader(path string, objs *objects) error {
390*8fb009dcSAndroid Build Coastguard Worker	var b bytes.Buffer
391*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, `/* Copyright (C) 1995-1997 Eric Young ([email protected])
392*8fb009dcSAndroid Build Coastguard Worker * All rights reserved.
393*8fb009dcSAndroid Build Coastguard Worker *
394*8fb009dcSAndroid Build Coastguard Worker * This package is an SSL implementation written
395*8fb009dcSAndroid Build Coastguard Worker * by Eric Young ([email protected]).
396*8fb009dcSAndroid Build Coastguard Worker * The implementation was written so as to conform with Netscapes SSL.
397*8fb009dcSAndroid Build Coastguard Worker *
398*8fb009dcSAndroid Build Coastguard Worker * This library is free for commercial and non-commercial use as long as
399*8fb009dcSAndroid Build Coastguard Worker * the following conditions are aheared to.  The following conditions
400*8fb009dcSAndroid Build Coastguard Worker * apply to all code found in this distribution, be it the RC4, RSA,
401*8fb009dcSAndroid Build Coastguard Worker * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
402*8fb009dcSAndroid Build Coastguard Worker * included with this distribution is covered by the same copyright terms
403*8fb009dcSAndroid Build Coastguard Worker * except that the holder is Tim Hudson ([email protected]).
404*8fb009dcSAndroid Build Coastguard Worker *
405*8fb009dcSAndroid Build Coastguard Worker * Copyright remains Eric Young's, and as such any Copyright notices in
406*8fb009dcSAndroid Build Coastguard Worker * the code are not to be removed.
407*8fb009dcSAndroid Build Coastguard Worker * If this package is used in a product, Eric Young should be given attribution
408*8fb009dcSAndroid Build Coastguard Worker * as the author of the parts of the library used.
409*8fb009dcSAndroid Build Coastguard Worker * This can be in the form of a textual message at program startup or
410*8fb009dcSAndroid Build Coastguard Worker * in documentation (online or textual) provided with the package.
411*8fb009dcSAndroid Build Coastguard Worker *
412*8fb009dcSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
413*8fb009dcSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
414*8fb009dcSAndroid Build Coastguard Worker * are met:
415*8fb009dcSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the copyright
416*8fb009dcSAndroid Build Coastguard Worker *    notice, this list of conditions and the following disclaimer.
417*8fb009dcSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
418*8fb009dcSAndroid Build Coastguard Worker *    notice, this list of conditions and the following disclaimer in the
419*8fb009dcSAndroid Build Coastguard Worker *    documentation and/or other materials provided with the distribution.
420*8fb009dcSAndroid Build Coastguard Worker * 3. All advertising materials mentioning features or use of this software
421*8fb009dcSAndroid Build Coastguard Worker *    must display the following acknowledgement:
422*8fb009dcSAndroid Build Coastguard Worker *    "This product includes cryptographic software written by
423*8fb009dcSAndroid Build Coastguard Worker *     Eric Young ([email protected])"
424*8fb009dcSAndroid Build Coastguard Worker *    The word 'cryptographic' can be left out if the rouines from the library
425*8fb009dcSAndroid Build Coastguard Worker *    being used are not cryptographic related :-).
426*8fb009dcSAndroid Build Coastguard Worker * 4. If you include any Windows specific code (or a derivative thereof) from
427*8fb009dcSAndroid Build Coastguard Worker *    the apps directory (application code) you must include an acknowledgement:
428*8fb009dcSAndroid Build Coastguard Worker *    "This product includes software written by Tim Hudson ([email protected])"
429*8fb009dcSAndroid Build Coastguard Worker *
430*8fb009dcSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG `+"``"+`AS IS'' AND
431*8fb009dcSAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
432*8fb009dcSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
433*8fb009dcSAndroid Build Coastguard Worker * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
434*8fb009dcSAndroid Build Coastguard Worker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
435*8fb009dcSAndroid Build Coastguard Worker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
436*8fb009dcSAndroid Build Coastguard Worker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
437*8fb009dcSAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
438*8fb009dcSAndroid Build Coastguard Worker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
439*8fb009dcSAndroid Build Coastguard Worker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
440*8fb009dcSAndroid Build Coastguard Worker * SUCH DAMAGE.
441*8fb009dcSAndroid Build Coastguard Worker *
442*8fb009dcSAndroid Build Coastguard Worker * The licence and distribution terms for any publically available version or
443*8fb009dcSAndroid Build Coastguard Worker * derivative of this code cannot be changed.  i.e. this code cannot simply be
444*8fb009dcSAndroid Build Coastguard Worker * copied and put under another distribution licence
445*8fb009dcSAndroid Build Coastguard Worker * [including the GNU Public Licence.] */
446*8fb009dcSAndroid Build Coastguard Worker
447*8fb009dcSAndroid Build Coastguard Worker/* This file is generated by crypto/obj/objects.go. */
448*8fb009dcSAndroid Build Coastguard Worker
449*8fb009dcSAndroid Build Coastguard Worker#ifndef OPENSSL_HEADER_NID_H
450*8fb009dcSAndroid Build Coastguard Worker#define OPENSSL_HEADER_NID_H
451*8fb009dcSAndroid Build Coastguard Worker
452*8fb009dcSAndroid Build Coastguard Worker#include <openssl/base.h>
453*8fb009dcSAndroid Build Coastguard Worker
454*8fb009dcSAndroid Build Coastguard Worker#if defined(__cplusplus)
455*8fb009dcSAndroid Build Coastguard Workerextern "C" {
456*8fb009dcSAndroid Build Coastguard Worker#endif
457*8fb009dcSAndroid Build Coastguard Worker
458*8fb009dcSAndroid Build Coastguard Worker
459*8fb009dcSAndroid Build Coastguard Worker/* The nid library provides numbered values for ASN.1 object identifiers and
460*8fb009dcSAndroid Build Coastguard Worker * other symbols. These values are used by other libraries to identify
461*8fb009dcSAndroid Build Coastguard Worker * cryptographic primitives.
462*8fb009dcSAndroid Build Coastguard Worker *
463*8fb009dcSAndroid Build Coastguard Worker * A separate objects library, obj.h, provides functions for converting between
464*8fb009dcSAndroid Build Coastguard Worker * nids and object identifiers. However it depends on large internal tables with
465*8fb009dcSAndroid Build Coastguard Worker * the encodings of every nid defined. Consumers concerned with binary size
466*8fb009dcSAndroid Build Coastguard Worker * should instead embed the encodings of the few consumed OIDs and compare
467*8fb009dcSAndroid Build Coastguard Worker * against those.
468*8fb009dcSAndroid Build Coastguard Worker *
469*8fb009dcSAndroid Build Coastguard Worker * These values should not be used outside of a single process; they are not
470*8fb009dcSAndroid Build Coastguard Worker * stable identifiers. */
471*8fb009dcSAndroid Build Coastguard Worker
472*8fb009dcSAndroid Build Coastguard Worker
473*8fb009dcSAndroid Build Coastguard Worker`)
474*8fb009dcSAndroid Build Coastguard Worker
475*8fb009dcSAndroid Build Coastguard Worker	for nid, obj := range objs.byNID {
476*8fb009dcSAndroid Build Coastguard Worker		if len(obj.name) == 0 {
477*8fb009dcSAndroid Build Coastguard Worker			continue
478*8fb009dcSAndroid Build Coastguard Worker		}
479*8fb009dcSAndroid Build Coastguard Worker
480*8fb009dcSAndroid Build Coastguard Worker		if obj.hasShortName {
481*8fb009dcSAndroid Build Coastguard Worker			fmt.Fprintf(&b, "#define SN_%s \"%s\"\n", obj.name, obj.shortName)
482*8fb009dcSAndroid Build Coastguard Worker		}
483*8fb009dcSAndroid Build Coastguard Worker		if obj.hasLongName {
484*8fb009dcSAndroid Build Coastguard Worker			fmt.Fprintf(&b, "#define LN_%s \"%s\"\n", obj.name, obj.longName)
485*8fb009dcSAndroid Build Coastguard Worker		}
486*8fb009dcSAndroid Build Coastguard Worker		fmt.Fprintf(&b, "#define NID_%s %d\n", obj.name, nid)
487*8fb009dcSAndroid Build Coastguard Worker
488*8fb009dcSAndroid Build Coastguard Worker		// Although NID_undef does not have an OID, OpenSSL emits
489*8fb009dcSAndroid Build Coastguard Worker		// OBJ_undef as if it were zero.
490*8fb009dcSAndroid Build Coastguard Worker		oid := obj.oid
491*8fb009dcSAndroid Build Coastguard Worker		if nid == 0 {
492*8fb009dcSAndroid Build Coastguard Worker			oid = []int{0}
493*8fb009dcSAndroid Build Coastguard Worker		}
494*8fb009dcSAndroid Build Coastguard Worker		if len(oid) != 0 {
495*8fb009dcSAndroid Build Coastguard Worker			var oidStr string
496*8fb009dcSAndroid Build Coastguard Worker			for _, val := range oid {
497*8fb009dcSAndroid Build Coastguard Worker				if len(oidStr) != 0 {
498*8fb009dcSAndroid Build Coastguard Worker					oidStr += ","
499*8fb009dcSAndroid Build Coastguard Worker				}
500*8fb009dcSAndroid Build Coastguard Worker				oidStr += fmt.Sprintf("%dL", val)
501*8fb009dcSAndroid Build Coastguard Worker			}
502*8fb009dcSAndroid Build Coastguard Worker
503*8fb009dcSAndroid Build Coastguard Worker			fmt.Fprintf(&b, "#define OBJ_%s %s\n", obj.name, oidStr)
504*8fb009dcSAndroid Build Coastguard Worker		}
505*8fb009dcSAndroid Build Coastguard Worker
506*8fb009dcSAndroid Build Coastguard Worker		fmt.Fprintf(&b, "\n")
507*8fb009dcSAndroid Build Coastguard Worker	}
508*8fb009dcSAndroid Build Coastguard Worker
509*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, `
510*8fb009dcSAndroid Build Coastguard Worker#if defined(__cplusplus)
511*8fb009dcSAndroid Build Coastguard Worker}  /* extern C */
512*8fb009dcSAndroid Build Coastguard Worker#endif
513*8fb009dcSAndroid Build Coastguard Worker
514*8fb009dcSAndroid Build Coastguard Worker#endif  /* OPENSSL_HEADER_NID_H */
515*8fb009dcSAndroid Build Coastguard Worker`)
516*8fb009dcSAndroid Build Coastguard Worker
517*8fb009dcSAndroid Build Coastguard Worker	formatted, err := clangFormat(b.String())
518*8fb009dcSAndroid Build Coastguard Worker	if err != nil {
519*8fb009dcSAndroid Build Coastguard Worker		return err
520*8fb009dcSAndroid Build Coastguard Worker	}
521*8fb009dcSAndroid Build Coastguard Worker
522*8fb009dcSAndroid Build Coastguard Worker	return os.WriteFile(path, []byte(formatted), 0666)
523*8fb009dcSAndroid Build Coastguard Worker}
524*8fb009dcSAndroid Build Coastguard Worker
525*8fb009dcSAndroid Build Coastguard Workerfunc sortNIDs(nids []int, objs *objects, cmp func(a, b object) bool) {
526*8fb009dcSAndroid Build Coastguard Worker	sort.Slice(nids, func(i, j int) bool { return cmp(objs.byNID[nids[i]], objs.byNID[nids[j]]) })
527*8fb009dcSAndroid Build Coastguard Worker}
528*8fb009dcSAndroid Build Coastguard Worker
529*8fb009dcSAndroid Build Coastguard Workerfunc writeData(path string, objs *objects) error {
530*8fb009dcSAndroid Build Coastguard Worker	var b bytes.Buffer
531*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, `/* Copyright (C) 1995-1997 Eric Young ([email protected])
532*8fb009dcSAndroid Build Coastguard Worker * All rights reserved.
533*8fb009dcSAndroid Build Coastguard Worker *
534*8fb009dcSAndroid Build Coastguard Worker * This package is an SSL implementation written
535*8fb009dcSAndroid Build Coastguard Worker * by Eric Young ([email protected]).
536*8fb009dcSAndroid Build Coastguard Worker * The implementation was written so as to conform with Netscapes SSL.
537*8fb009dcSAndroid Build Coastguard Worker *
538*8fb009dcSAndroid Build Coastguard Worker * This library is free for commercial and non-commercial use as long as
539*8fb009dcSAndroid Build Coastguard Worker * the following conditions are aheared to.  The following conditions
540*8fb009dcSAndroid Build Coastguard Worker * apply to all code found in this distribution, be it the RC4, RSA,
541*8fb009dcSAndroid Build Coastguard Worker * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
542*8fb009dcSAndroid Build Coastguard Worker * included with this distribution is covered by the same copyright terms
543*8fb009dcSAndroid Build Coastguard Worker * except that the holder is Tim Hudson ([email protected]).
544*8fb009dcSAndroid Build Coastguard Worker *
545*8fb009dcSAndroid Build Coastguard Worker * Copyright remains Eric Young's, and as such any Copyright notices in
546*8fb009dcSAndroid Build Coastguard Worker * the code are not to be removed.
547*8fb009dcSAndroid Build Coastguard Worker * If this package is used in a product, Eric Young should be given attribution
548*8fb009dcSAndroid Build Coastguard Worker * as the author of the parts of the library used.
549*8fb009dcSAndroid Build Coastguard Worker * This can be in the form of a textual message at program startup or
550*8fb009dcSAndroid Build Coastguard Worker * in documentation (online or textual) provided with the package.
551*8fb009dcSAndroid Build Coastguard Worker *
552*8fb009dcSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
553*8fb009dcSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
554*8fb009dcSAndroid Build Coastguard Worker * are met:
555*8fb009dcSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the copyright
556*8fb009dcSAndroid Build Coastguard Worker *    notice, this list of conditions and the following disclaimer.
557*8fb009dcSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
558*8fb009dcSAndroid Build Coastguard Worker *    notice, this list of conditions and the following disclaimer in the
559*8fb009dcSAndroid Build Coastguard Worker *    documentation and/or other materials provided with the distribution.
560*8fb009dcSAndroid Build Coastguard Worker * 3. All advertising materials mentioning features or use of this software
561*8fb009dcSAndroid Build Coastguard Worker *    must display the following acknowledgement:
562*8fb009dcSAndroid Build Coastguard Worker *    "This product includes cryptographic software written by
563*8fb009dcSAndroid Build Coastguard Worker *     Eric Young ([email protected])"
564*8fb009dcSAndroid Build Coastguard Worker *    The word 'cryptographic' can be left out if the rouines from the library
565*8fb009dcSAndroid Build Coastguard Worker *    being used are not cryptographic related :-).
566*8fb009dcSAndroid Build Coastguard Worker * 4. If you include any Windows specific code (or a derivative thereof) from
567*8fb009dcSAndroid Build Coastguard Worker *    the apps directory (application code) you must include an acknowledgement:
568*8fb009dcSAndroid Build Coastguard Worker *    "This product includes software written by Tim Hudson ([email protected])"
569*8fb009dcSAndroid Build Coastguard Worker *
570*8fb009dcSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG `+"``"+`AS IS'' AND
571*8fb009dcSAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
572*8fb009dcSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
573*8fb009dcSAndroid Build Coastguard Worker * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
574*8fb009dcSAndroid Build Coastguard Worker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
575*8fb009dcSAndroid Build Coastguard Worker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
576*8fb009dcSAndroid Build Coastguard Worker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
577*8fb009dcSAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
578*8fb009dcSAndroid Build Coastguard Worker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
579*8fb009dcSAndroid Build Coastguard Worker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
580*8fb009dcSAndroid Build Coastguard Worker * SUCH DAMAGE.
581*8fb009dcSAndroid Build Coastguard Worker *
582*8fb009dcSAndroid Build Coastguard Worker * The licence and distribution terms for any publically available version or
583*8fb009dcSAndroid Build Coastguard Worker * derivative of this code cannot be changed.  i.e. this code cannot simply be
584*8fb009dcSAndroid Build Coastguard Worker * copied and put under another distribution licence
585*8fb009dcSAndroid Build Coastguard Worker * [including the GNU Public Licence.] */
586*8fb009dcSAndroid Build Coastguard Worker
587*8fb009dcSAndroid Build Coastguard Worker/* This file is generated by crypto/obj/objects.go. */
588*8fb009dcSAndroid Build Coastguard Worker
589*8fb009dcSAndroid Build Coastguard Worker
590*8fb009dcSAndroid Build Coastguard Worker`)
591*8fb009dcSAndroid Build Coastguard Worker
592*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, "#define NUM_NID %d\n", len(objs.byNID))
593*8fb009dcSAndroid Build Coastguard Worker
594*8fb009dcSAndroid Build Coastguard Worker	// Emit each object's DER encoding, concatenated, and save the offsets.
595*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, "\nstatic const uint8_t kObjectData[] = {\n")
596*8fb009dcSAndroid Build Coastguard Worker	offsets := make([]int, len(objs.byNID))
597*8fb009dcSAndroid Build Coastguard Worker	var nextOffset int
598*8fb009dcSAndroid Build Coastguard Worker	for nid, obj := range objs.byNID {
599*8fb009dcSAndroid Build Coastguard Worker		if len(obj.name) == 0 || len(obj.encoded) == 0 {
600*8fb009dcSAndroid Build Coastguard Worker			offsets[nid] = -1
601*8fb009dcSAndroid Build Coastguard Worker			continue
602*8fb009dcSAndroid Build Coastguard Worker		}
603*8fb009dcSAndroid Build Coastguard Worker
604*8fb009dcSAndroid Build Coastguard Worker		offsets[nid] = nextOffset
605*8fb009dcSAndroid Build Coastguard Worker		nextOffset += len(obj.encoded)
606*8fb009dcSAndroid Build Coastguard Worker		fmt.Fprintf(&b, "/* NID_%s */\n", obj.name)
607*8fb009dcSAndroid Build Coastguard Worker		for _, val := range obj.encoded {
608*8fb009dcSAndroid Build Coastguard Worker			fmt.Fprintf(&b, "0x%02x, ", val)
609*8fb009dcSAndroid Build Coastguard Worker		}
610*8fb009dcSAndroid Build Coastguard Worker		fmt.Fprintf(&b, "\n")
611*8fb009dcSAndroid Build Coastguard Worker	}
612*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, "};\n")
613*8fb009dcSAndroid Build Coastguard Worker
614*8fb009dcSAndroid Build Coastguard Worker	// Emit an ASN1_OBJECT for each object.
615*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, "\nstatic const ASN1_OBJECT kObjects[NUM_NID] = {\n")
616*8fb009dcSAndroid Build Coastguard Worker	for nid, obj := range objs.byNID {
617*8fb009dcSAndroid Build Coastguard Worker		// Skip the entry for NID_undef. It is stored separately, so that
618*8fb009dcSAndroid Build Coastguard Worker		// OBJ_get_undef avoids pulling in the table.
619*8fb009dcSAndroid Build Coastguard Worker		if nid == 0 {
620*8fb009dcSAndroid Build Coastguard Worker			continue
621*8fb009dcSAndroid Build Coastguard Worker		}
622*8fb009dcSAndroid Build Coastguard Worker
623*8fb009dcSAndroid Build Coastguard Worker		if len(obj.name) == 0 {
624*8fb009dcSAndroid Build Coastguard Worker			fmt.Fprintf(&b, "{NULL, NULL, NID_undef, 0, NULL, 0},\n")
625*8fb009dcSAndroid Build Coastguard Worker			continue
626*8fb009dcSAndroid Build Coastguard Worker		}
627*8fb009dcSAndroid Build Coastguard Worker
628*8fb009dcSAndroid Build Coastguard Worker		fmt.Fprintf(&b, "{\"%s\", \"%s\", NID_%s, ", obj.shortName, obj.longName, obj.name)
629*8fb009dcSAndroid Build Coastguard Worker		if offset := offsets[nid]; offset >= 0 {
630*8fb009dcSAndroid Build Coastguard Worker			fmt.Fprintf(&b, "%d, &kObjectData[%d], 0},\n", len(obj.encoded), offset)
631*8fb009dcSAndroid Build Coastguard Worker		} else {
632*8fb009dcSAndroid Build Coastguard Worker			fmt.Fprintf(&b, "0, NULL, 0},\n")
633*8fb009dcSAndroid Build Coastguard Worker		}
634*8fb009dcSAndroid Build Coastguard Worker	}
635*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, "};\n")
636*8fb009dcSAndroid Build Coastguard Worker
637*8fb009dcSAndroid Build Coastguard Worker	// Emit a list of NIDs sorted by short name.
638*8fb009dcSAndroid Build Coastguard Worker	var nids []int
639*8fb009dcSAndroid Build Coastguard Worker	for nid, obj := range objs.byNID {
640*8fb009dcSAndroid Build Coastguard Worker		if len(obj.name) == 0 || len(obj.shortName) == 0 {
641*8fb009dcSAndroid Build Coastguard Worker			continue
642*8fb009dcSAndroid Build Coastguard Worker		}
643*8fb009dcSAndroid Build Coastguard Worker		nids = append(nids, nid)
644*8fb009dcSAndroid Build Coastguard Worker	}
645*8fb009dcSAndroid Build Coastguard Worker	sortNIDs(nids, objs, func(a, b object) bool { return a.shortName < b.shortName })
646*8fb009dcSAndroid Build Coastguard Worker
647*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, "\nstatic const uint16_t kNIDsInShortNameOrder[] = {\n")
648*8fb009dcSAndroid Build Coastguard Worker	for _, nid := range nids {
649*8fb009dcSAndroid Build Coastguard Worker		// Including NID_undef in the table does not do anything. Whether OBJ_sn2nid
650*8fb009dcSAndroid Build Coastguard Worker		// finds the object or not, it will return NID_undef.
651*8fb009dcSAndroid Build Coastguard Worker		if nid != 0 {
652*8fb009dcSAndroid Build Coastguard Worker			fmt.Fprintf(&b, "%d /* %s */,\n", nid, objs.byNID[nid].shortName)
653*8fb009dcSAndroid Build Coastguard Worker		}
654*8fb009dcSAndroid Build Coastguard Worker	}
655*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, "};\n")
656*8fb009dcSAndroid Build Coastguard Worker
657*8fb009dcSAndroid Build Coastguard Worker	// Emit a list of NIDs sorted by long name.
658*8fb009dcSAndroid Build Coastguard Worker	nids = nil
659*8fb009dcSAndroid Build Coastguard Worker	for nid, obj := range objs.byNID {
660*8fb009dcSAndroid Build Coastguard Worker		if len(obj.name) == 0 || len(obj.longName) == 0 {
661*8fb009dcSAndroid Build Coastguard Worker			continue
662*8fb009dcSAndroid Build Coastguard Worker		}
663*8fb009dcSAndroid Build Coastguard Worker		nids = append(nids, nid)
664*8fb009dcSAndroid Build Coastguard Worker	}
665*8fb009dcSAndroid Build Coastguard Worker	sortNIDs(nids, objs, func(a, b object) bool { return a.longName < b.longName })
666*8fb009dcSAndroid Build Coastguard Worker
667*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, "\nstatic const uint16_t kNIDsInLongNameOrder[] = {\n")
668*8fb009dcSAndroid Build Coastguard Worker	for _, nid := range nids {
669*8fb009dcSAndroid Build Coastguard Worker		// Including NID_undef in the table does not do anything. Whether OBJ_ln2nid
670*8fb009dcSAndroid Build Coastguard Worker		// finds the object or not, it will return NID_undef.
671*8fb009dcSAndroid Build Coastguard Worker		if nid != 0 {
672*8fb009dcSAndroid Build Coastguard Worker			fmt.Fprintf(&b, "%d /* %s */,\n", nid, objs.byNID[nid].longName)
673*8fb009dcSAndroid Build Coastguard Worker		}
674*8fb009dcSAndroid Build Coastguard Worker	}
675*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, "};\n")
676*8fb009dcSAndroid Build Coastguard Worker
677*8fb009dcSAndroid Build Coastguard Worker	// Emit a list of NIDs sorted by OID.
678*8fb009dcSAndroid Build Coastguard Worker	nids = nil
679*8fb009dcSAndroid Build Coastguard Worker	for nid, obj := range objs.byNID {
680*8fb009dcSAndroid Build Coastguard Worker		if len(obj.name) == 0 || len(obj.encoded) == 0 {
681*8fb009dcSAndroid Build Coastguard Worker			continue
682*8fb009dcSAndroid Build Coastguard Worker		}
683*8fb009dcSAndroid Build Coastguard Worker		nids = append(nids, nid)
684*8fb009dcSAndroid Build Coastguard Worker	}
685*8fb009dcSAndroid Build Coastguard Worker	sortNIDs(nids, objs, func(a, b object) bool {
686*8fb009dcSAndroid Build Coastguard Worker		// This comparison must match the definition of |obj_cmp|.
687*8fb009dcSAndroid Build Coastguard Worker		if len(a.encoded) < len(b.encoded) {
688*8fb009dcSAndroid Build Coastguard Worker			return true
689*8fb009dcSAndroid Build Coastguard Worker		}
690*8fb009dcSAndroid Build Coastguard Worker		if len(a.encoded) > len(b.encoded) {
691*8fb009dcSAndroid Build Coastguard Worker			return false
692*8fb009dcSAndroid Build Coastguard Worker		}
693*8fb009dcSAndroid Build Coastguard Worker		return bytes.Compare(a.encoded, b.encoded) < 0
694*8fb009dcSAndroid Build Coastguard Worker	})
695*8fb009dcSAndroid Build Coastguard Worker
696*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, "\nstatic const uint16_t kNIDsInOIDOrder[] = {\n")
697*8fb009dcSAndroid Build Coastguard Worker	for _, nid := range nids {
698*8fb009dcSAndroid Build Coastguard Worker		obj := objs.byNID[nid]
699*8fb009dcSAndroid Build Coastguard Worker		fmt.Fprintf(&b, "%d /* ", nid)
700*8fb009dcSAndroid Build Coastguard Worker		for i, c := range obj.oid {
701*8fb009dcSAndroid Build Coastguard Worker			if i > 0 {
702*8fb009dcSAndroid Build Coastguard Worker				fmt.Fprintf(&b, ".")
703*8fb009dcSAndroid Build Coastguard Worker			}
704*8fb009dcSAndroid Build Coastguard Worker			fmt.Fprintf(&b, "%d", c)
705*8fb009dcSAndroid Build Coastguard Worker		}
706*8fb009dcSAndroid Build Coastguard Worker		fmt.Fprintf(&b, " (OBJ_%s) */,\n", obj.name)
707*8fb009dcSAndroid Build Coastguard Worker	}
708*8fb009dcSAndroid Build Coastguard Worker	fmt.Fprintf(&b, "};\n")
709*8fb009dcSAndroid Build Coastguard Worker
710*8fb009dcSAndroid Build Coastguard Worker	formatted, err := clangFormat(b.String())
711*8fb009dcSAndroid Build Coastguard Worker	if err != nil {
712*8fb009dcSAndroid Build Coastguard Worker		return err
713*8fb009dcSAndroid Build Coastguard Worker	}
714*8fb009dcSAndroid Build Coastguard Worker
715*8fb009dcSAndroid Build Coastguard Worker	return os.WriteFile(path, []byte(formatted), 0666)
716*8fb009dcSAndroid Build Coastguard Worker}
717*8fb009dcSAndroid Build Coastguard Worker
718*8fb009dcSAndroid Build Coastguard Workerfunc main() {
719*8fb009dcSAndroid Build Coastguard Worker	objs, err := readObjects("obj_mac.num", "objects.txt")
720*8fb009dcSAndroid Build Coastguard Worker	if err != nil {
721*8fb009dcSAndroid Build Coastguard Worker		fmt.Fprintf(os.Stderr, "Error reading objects: %s\n", err)
722*8fb009dcSAndroid Build Coastguard Worker		os.Exit(1)
723*8fb009dcSAndroid Build Coastguard Worker	}
724*8fb009dcSAndroid Build Coastguard Worker
725*8fb009dcSAndroid Build Coastguard Worker	if err := writeNumbers("obj_mac.num", objs); err != nil {
726*8fb009dcSAndroid Build Coastguard Worker		fmt.Fprintf(os.Stderr, "Error writing numbers: %s\n", err)
727*8fb009dcSAndroid Build Coastguard Worker		os.Exit(1)
728*8fb009dcSAndroid Build Coastguard Worker	}
729*8fb009dcSAndroid Build Coastguard Worker
730*8fb009dcSAndroid Build Coastguard Worker	if err := writeHeader("../../include/openssl/nid.h", objs); err != nil {
731*8fb009dcSAndroid Build Coastguard Worker		fmt.Fprintf(os.Stderr, "Error writing header: %s\n", err)
732*8fb009dcSAndroid Build Coastguard Worker		os.Exit(1)
733*8fb009dcSAndroid Build Coastguard Worker	}
734*8fb009dcSAndroid Build Coastguard Worker
735*8fb009dcSAndroid Build Coastguard Worker	if err := writeData("obj_dat.h", objs); err != nil {
736*8fb009dcSAndroid Build Coastguard Worker		fmt.Fprintf(os.Stderr, "Error writing data: %s\n", err)
737*8fb009dcSAndroid Build Coastguard Worker		os.Exit(1)
738*8fb009dcSAndroid Build Coastguard Worker	}
739*8fb009dcSAndroid Build Coastguard Worker}
740