mirror of https://github.com/kubernetes/kops.git
				
				
				
			
		
			
				
	
	
		
			157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
/*
 | 
						|
Copyright 2019 The Kubernetes Authors.
 | 
						|
 | 
						|
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 pki
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"crypto/x509"
 | 
						|
	"crypto/x509/pkix"
 | 
						|
	"fmt"
 | 
						|
	"sort"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"k8s.io/klog"
 | 
						|
)
 | 
						|
 | 
						|
func PkixNameToString(name *pkix.Name) string {
 | 
						|
	seq := name.ToRDNSequence()
 | 
						|
	var s bytes.Buffer
 | 
						|
	for _, rdnSet := range seq {
 | 
						|
		for _, rdn := range rdnSet {
 | 
						|
			if s.Len() != 0 {
 | 
						|
				s.WriteString(",")
 | 
						|
			}
 | 
						|
			key := ""
 | 
						|
			t := rdn.Type
 | 
						|
			if len(t) == 4 && t[0] == 2 && t[1] == 5 && t[2] == 4 {
 | 
						|
				switch t[3] {
 | 
						|
				case 3:
 | 
						|
					key = "cn"
 | 
						|
				case 5:
 | 
						|
					key = "serial"
 | 
						|
				case 6:
 | 
						|
					key = "c"
 | 
						|
				case 7:
 | 
						|
					key = "l"
 | 
						|
				case 10:
 | 
						|
					key = "o"
 | 
						|
				case 11:
 | 
						|
					key = "ou"
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if key == "" {
 | 
						|
				key = t.String()
 | 
						|
			}
 | 
						|
			s.WriteString(fmt.Sprintf("%v=%v", key, rdn.Value))
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return s.String()
 | 
						|
}
 | 
						|
 | 
						|
var keyUsageStrings = map[x509.KeyUsage]string{
 | 
						|
	x509.KeyUsageDigitalSignature:  "KeyUsageDigitalSignature",
 | 
						|
	x509.KeyUsageContentCommitment: "KeyUsageContentCommitment",
 | 
						|
	x509.KeyUsageKeyEncipherment:   "KeyUsageKeyEncipherment",
 | 
						|
	x509.KeyUsageDataEncipherment:  "KeyUsageDataEncipherment",
 | 
						|
	x509.KeyUsageKeyAgreement:      "KeyUsageKeyAgreement",
 | 
						|
	x509.KeyUsageCertSign:          "KeyUsageCertSign",
 | 
						|
	x509.KeyUsageCRLSign:           "KeyUsageCRLSign",
 | 
						|
	x509.KeyUsageEncipherOnly:      "KeyUsageEncipherOnly",
 | 
						|
	x509.KeyUsageDecipherOnly:      "KeyUsageDecipherOnly",
 | 
						|
}
 | 
						|
 | 
						|
func keyUsageToString(u x509.KeyUsage) []string {
 | 
						|
	var usages []string
 | 
						|
 | 
						|
	for k, v := range keyUsageStrings {
 | 
						|
		if (u & k) != 0 {
 | 
						|
			usages = append(usages, v)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// TODO: Detect if there are other flags set?
 | 
						|
	return usages
 | 
						|
}
 | 
						|
 | 
						|
func parseKeyUsage(s string) (x509.KeyUsage, bool) {
 | 
						|
	for k, v := range keyUsageStrings {
 | 
						|
		if v == s {
 | 
						|
			return k, true
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return 0, false
 | 
						|
}
 | 
						|
 | 
						|
var extKeyUsageStrings = map[x509.ExtKeyUsage]string{
 | 
						|
	x509.ExtKeyUsageAny:                        "ExtKeyUsageAny",
 | 
						|
	x509.ExtKeyUsageServerAuth:                 "ExtKeyUsageServerAuth",
 | 
						|
	x509.ExtKeyUsageClientAuth:                 "ExtKeyUsageClientAuth",
 | 
						|
	x509.ExtKeyUsageCodeSigning:                "ExtKeyUsageCodeSigning",
 | 
						|
	x509.ExtKeyUsageEmailProtection:            "ExtKeyUsageEmailProtection",
 | 
						|
	x509.ExtKeyUsageIPSECEndSystem:             "ExtKeyUsageIPSECEndSystem",
 | 
						|
	x509.ExtKeyUsageIPSECTunnel:                "ExtKeyUsageIPSECTunnel",
 | 
						|
	x509.ExtKeyUsageIPSECUser:                  "ExtKeyUsageIPSECUser",
 | 
						|
	x509.ExtKeyUsageTimeStamping:               "ExtKeyUsageTimeStamping",
 | 
						|
	x509.ExtKeyUsageOCSPSigning:                "ExtKeyUsageOCSPSigning",
 | 
						|
	x509.ExtKeyUsageMicrosoftServerGatedCrypto: "ExtKeyUsageMicrosoftServerGatedCrypto",
 | 
						|
	x509.ExtKeyUsageNetscapeServerGatedCrypto:  "ExtKeyUsageNetscapeServerGatedCrypto",
 | 
						|
}
 | 
						|
 | 
						|
func extKeyUsageToString(u x509.ExtKeyUsage) string {
 | 
						|
	s := extKeyUsageStrings[u]
 | 
						|
	if s == "" {
 | 
						|
		klog.Warningf("Unhandled ExtKeyUsage: %v", u)
 | 
						|
		s = fmt.Sprintf("ExtKeyUsage:%v", u)
 | 
						|
	}
 | 
						|
	return s
 | 
						|
}
 | 
						|
 | 
						|
func parseExtKeyUsage(s string) (x509.ExtKeyUsage, bool) {
 | 
						|
	for k, v := range extKeyUsageStrings {
 | 
						|
		if v == s {
 | 
						|
			return k, true
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return 0, false
 | 
						|
}
 | 
						|
 | 
						|
// BuildTypeDescription extracts the type based on the certificate extensions
 | 
						|
func BuildTypeDescription(cert *x509.Certificate) string {
 | 
						|
	var options []string
 | 
						|
 | 
						|
	if cert.IsCA {
 | 
						|
		options = append(options, "CA")
 | 
						|
	}
 | 
						|
 | 
						|
	options = append(options, keyUsageToString(cert.KeyUsage)...)
 | 
						|
 | 
						|
	for _, extKeyUsage := range cert.ExtKeyUsage {
 | 
						|
		options = append(options, extKeyUsageToString(extKeyUsage))
 | 
						|
	}
 | 
						|
 | 
						|
	sort.Strings(options)
 | 
						|
	s := strings.Join(options, ",")
 | 
						|
 | 
						|
	for k, v := range wellKnownCertificateTypes {
 | 
						|
		if v == s {
 | 
						|
			s = k
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return s
 | 
						|
}
 |