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