1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
/*
* ZLint Copyright 2024 Regents of the University of Michigan
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package util
import (
"github.com/zmap/zcrypto/encoding/asn1"
"github.com/zmap/zcrypto/x509/pkix"
)
type empty struct{}
var nameAttributePrefix = asn1.ObjectIdentifier{2, 5, 4}
var nameAttributeLeaves = map[int]empty{
// Name attributes defined in RFC 5280 appendix A
3: {}, // id-at-commonName AttributeType ::= { id-at 3 }
4: {}, // id-at-surname AttributeType ::= { id-at 4 }
5: {}, // id-at-serialNumber AttributeType ::= { id-at 5 }
6: {}, // id-at-countryName AttributeType ::= { id-at 6 }
7: {}, // id-at-localityName AttributeType ::= { id-at 7 }
8: {}, // id-at-stateOrProvinceName AttributeType ::= { id-at 8 }
10: {}, // id-at-organizationName AttributeType ::= { id-at 10 }
11: {}, // id-at-organizationalUnitName AttributeType ::= { id-at 11 }
12: {}, // id-at-title AttributeType ::= { id-at 12 }
41: {}, // id-at-name AttributeType ::= { id-at 41 }
42: {}, // id-at-givenName AttributeType ::= { id-at 42 }
43: {}, // id-at-initials AttributeType ::= { id-at 43 }
44: {}, // id-at-generationQualifier AttributeType ::= { id-at 44 }
46: {}, // id-at-dnQualifier AttributeType ::= { id-at 46 }
// Name attributes not present in RFC 5280, but appeared in Go's crypto/x509/pkix.go
9: {}, // id-at-streetName AttributeType ::= { id-at 9 }
17: {}, // id-at-postalCodeName AttributeType ::= { id-at 17 }
}
// IsNameAttribute returns true if the given ObjectIdentifier corresponds with
// the type of any name attribute for PKIX.
func IsNameAttribute(oid asn1.ObjectIdentifier) bool {
if len(oid) != 4 {
return false
}
if !nameAttributePrefix.Equal(oid[0:3]) {
return false
}
_, ok := nameAttributeLeaves[oid[3]]
return ok
}
func NotAllNameFieldsAreEmpty(name *pkix.Name) bool {
//Return true if at least one field is non-empty
return len(name.Names) >= 1
}
|