Update cri to b213648c5b
				
					
				
			Signed-off-by: Lantao Liu <lantaol@google.com>
This commit is contained in:
		
							
								
								
									
										29
									
								
								vendor/k8s.io/client-go/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/k8s.io/client-go/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,7 +2,7 @@ | ||||
|  | ||||
| Go clients for talking to a [kubernetes](http://kubernetes.io/) cluster. | ||||
|  | ||||
| We currently recommend using the v10.0.0 tag. See [INSTALL.md](/INSTALL.md) for | ||||
| We currently recommend using the v11.0.0 tag. See [INSTALL.md](/INSTALL.md) for | ||||
| detailed installation instructions. `go get k8s.io/client-go/...` works, but | ||||
| will build `master`, which doesn't handle the dependencies well. | ||||
|  | ||||
| @@ -92,16 +92,16 @@ We will backport bugfixes--but not new features--into older versions of | ||||
|  | ||||
| #### Compatibility matrix | ||||
|  | ||||
| |                     | Kubernetes 1.7 | Kubernetes 1.8 | Kubernetes 1.9 | Kubernetes 1.10 | Kubernetes 1.11 | Kubernetes 1.12 | Kubernetes 1.13 | | ||||
| |---------------------|----------------|----------------|----------------|-----------------|-----------------|-----------------|-----------------| | ||||
| | client-go 4.0       | ✓              | +-             | +-             | +-              | +-              | +-              | +-              | | ||||
| | client-go 5.0       | +-             | ✓              | +-             | +-              | +-              | +-              | +-              | | ||||
| | client-go 6.0       | +-             | +-             | ✓              | +-              | +-              | +-              | +-              | | ||||
| | client-go 7.0       | +-             | +-             | +-             | ✓               | +-              | +-              | +-              | | ||||
| | client-go 8.0       | +-             | +-             | +-             | +-              | ✓               | +-              | +-              | | ||||
| | client-go 9.0       | +-             | +-             | +-             | +-              | +-              | ✓               | +-              | | ||||
| | client-go 10.0      | +-             | +-             | +-             | +-              | +-              | +-              | ✓               | | ||||
| | client-go HEAD      | +-             | +-             | +-             | +-              | +-              | +-              | +-              | | ||||
| |                     | Kubernetes 1.8 | Kubernetes 1.9 | Kubernetes 1.10 | Kubernetes 1.11 | Kubernetes 1.12 | Kubernetes 1.13 | Kubernetes 1.14 | | ||||
| |---------------------|----------------|----------------|-----------------|-----------------|-----------------|-----------------|-----------------| | ||||
| | client-go 5.0       | ✓              | +-             | +-              | +-              | +-              | +-              | +-              | | ||||
| | client-go 6.0       | +-             | ✓              | +-              | +-              | +-              | +-              | +-              | | ||||
| | client-go 7.0       | +-             | +-             | ✓               | +-              | +-              | +-              | +-              | | ||||
| | client-go 8.0       | +-             | +-             | +-              | ✓               | +-              | +-              | +-              | | ||||
| | client-go 9.0       | +-             | +-             | +-              | +-              | ✓               | +-              | +-              | | ||||
| | client-go 10.0      | +-             | +-             | +-              | +-              | +-              | ✓               | +-              | | ||||
| | client-go 11.0      | +-             | +-             | +-              | +-              | +-              | +-              | ✓               | | ||||
| | client-go HEAD      | +-             | +-             | +-              | +-              | +-              | +-              | +-              | | ||||
|  | ||||
| Key: | ||||
|  | ||||
| @@ -130,9 +130,10 @@ between client-go versions. | ||||
| | client-go 5.0  | Kubernetes main repo, 1.8 branch     | = -                           | | ||||
| | client-go 6.0  | Kubernetes main repo, 1.9 branch     | = -                           | | ||||
| | client-go 7.0  | Kubernetes main repo, 1.10 branch    | = -                           | | ||||
| | client-go 8.0  | Kubernetes main repo, 1.11 branch    | ✓                             | | ||||
| | client-go 8.0  | Kubernetes main repo, 1.11 branch    | =-                            | | ||||
| | client-go 9.0  | Kubernetes main repo, 1.12 branch    | ✓                             | | ||||
| | client-go 10.0 | Kubernetes main repo, 1.13 branch    | ✓                             | | ||||
| | client-go 11.0 | Kubernetes main repo, 1.14 branch    | ✓                             | | ||||
| | client-go HEAD | Kubernetes main repo, master branch  | ✓                             | | ||||
|  | ||||
| Key: | ||||
| @@ -187,9 +188,7 @@ refer to the out-of-cluster [example](examples/out-of-cluster-client-configurati | ||||
|  | ||||
| ### Dependency management | ||||
|  | ||||
| If your application depends on a package that client-go depends on, and you let the Go compiler find the dependency in `GOPATH`, you will end up with duplicated dependencies: one copy from the `GOPATH`, and one from the vendor folder of client-go. This will cause unexpected runtime error like flag redefinition, since the go compiler ends up importing both packages separately, even if they are exactly the same thing. If this happens, you can either | ||||
| * run `godep restore` ([godep](https://github.com/tools/godep)) in the client-go/ folder, then remove the vendor folder of client-go. Then the packages in your GOPATH will be the only copy | ||||
| * or run `godep save` in your application folder to flatten all dependencies. | ||||
| For details on how to correctly use a dependency management for installing client-go, please see [INSTALL.md](INSTALL.md). | ||||
|  | ||||
| ### Contributing code | ||||
| Please send pull requests against the client packages in the Kubernetes main [repository](https://github.com/kubernetes/kubernetes). Changes in the staging area will be published to this repository every day. | ||||
|   | ||||
							
								
								
									
										42
									
								
								vendor/k8s.io/client-go/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								vendor/k8s.io/client-go/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| // This is a generated file. Do not edit directly. | ||||
|  | ||||
| module k8s.io/client-go | ||||
|  | ||||
| go 1.12 | ||||
|  | ||||
| require ( | ||||
| 	github.com/Azure/go-autorest v11.1.2+incompatible | ||||
| 	github.com/davecgh/go-spew v1.1.1 | ||||
| 	github.com/dgrijalva/jwt-go v0.0.0-20160705203006-01aeca54ebda // indirect | ||||
| 	github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550 | ||||
| 	github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415 | ||||
| 	github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 | ||||
| 	github.com/golang/protobuf v1.2.0 | ||||
| 	github.com/google/btree v0.0.0-20160524151835-7d79101e329e // indirect | ||||
| 	github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf | ||||
| 	github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d | ||||
| 	github.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8 | ||||
| 	github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7 | ||||
| 	github.com/imdario/mergo v0.3.5 | ||||
| 	github.com/peterbourgon/diskv v2.0.1+incompatible | ||||
| 	github.com/spf13/pflag v1.0.1 | ||||
| 	github.com/stretchr/testify v1.2.2 | ||||
| 	golang.org/x/crypto v0.0.0-20181025213731-e84da0312774 | ||||
| 	golang.org/x/net v0.0.0-20190206173232-65e2d4e15006 | ||||
| 	golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a | ||||
| 	golang.org/x/time v0.0.0-20161028155119-f51c12702a4d | ||||
| 	google.golang.org/appengine v1.5.0 // indirect | ||||
| 	k8s.io/api v0.0.0-20190620084959-7cf5895f2711 | ||||
| 	k8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719 | ||||
| 	k8s.io/klog v0.3.1 | ||||
| 	k8s.io/utils v0.0.0-20190221042446-c2654d5206da | ||||
| 	sigs.k8s.io/yaml v1.1.0 | ||||
| ) | ||||
|  | ||||
| replace ( | ||||
| 	golang.org/x/sync => golang.org/x/sync v0.0.0-20181108010431-42b317875d0f | ||||
| 	golang.org/x/sys => golang.org/x/sys v0.0.0-20190209173611-3b5209105503 | ||||
| 	golang.org/x/tools => golang.org/x/tools v0.0.0-20190313210603-aa82965741a9 | ||||
| 	k8s.io/api => k8s.io/api v0.0.0-20190620084959-7cf5895f2711 | ||||
| 	k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719 | ||||
| ) | ||||
							
								
								
									
										16
									
								
								vendor/k8s.io/client-go/rest/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/k8s.io/client-go/rest/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -487,7 +487,7 @@ func AddUserAgent(config *Config, userAgent string) *Config { | ||||
| 	return config | ||||
| } | ||||
|  | ||||
| // AnonymousClientConfig returns a copy of the given config with all user credentials (cert/key, bearer token, and username/password) removed | ||||
| // AnonymousClientConfig returns a copy of the given config with all user credentials (cert/key, bearer token, and username/password) and custom transports (WrapTransport, Transport) removed | ||||
| func AnonymousClientConfig(config *Config) *Config { | ||||
| 	// copy only known safe fields | ||||
| 	return &Config{ | ||||
| @@ -500,14 +500,12 @@ func AnonymousClientConfig(config *Config) *Config { | ||||
| 			CAFile:     config.TLSClientConfig.CAFile, | ||||
| 			CAData:     config.TLSClientConfig.CAData, | ||||
| 		}, | ||||
| 		RateLimiter:   config.RateLimiter, | ||||
| 		UserAgent:     config.UserAgent, | ||||
| 		Transport:     config.Transport, | ||||
| 		WrapTransport: config.WrapTransport, | ||||
| 		QPS:           config.QPS, | ||||
| 		Burst:         config.Burst, | ||||
| 		Timeout:       config.Timeout, | ||||
| 		Dial:          config.Dial, | ||||
| 		RateLimiter: config.RateLimiter, | ||||
| 		UserAgent:   config.UserAgent, | ||||
| 		QPS:         config.QPS, | ||||
| 		Burst:       config.Burst, | ||||
| 		Timeout:     config.Timeout, | ||||
| 		Dial:        config.Dial, | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										15
									
								
								vendor/k8s.io/client-go/rest/request.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/k8s.io/client-go/rest/request.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -592,10 +592,15 @@ func (r *Request) WatchWithSpecificDecoders(wrapperDecoderFn func(io.ReadCloser) | ||||
| 		if result := r.transformResponse(resp, req); result.err != nil { | ||||
| 			return nil, result.err | ||||
| 		} | ||||
| 		return nil, fmt.Errorf("for request '%+v', got status: %v", url, resp.StatusCode) | ||||
| 		return nil, fmt.Errorf("for request %s, got status: %v", url, resp.StatusCode) | ||||
| 	} | ||||
| 	wrapperDecoder := wrapperDecoderFn(resp.Body) | ||||
| 	return watch.NewStreamWatcher(restclientwatch.NewDecoder(wrapperDecoder, embeddedDecoder)), nil | ||||
| 	return watch.NewStreamWatcher( | ||||
| 		restclientwatch.NewDecoder(wrapperDecoder, embeddedDecoder), | ||||
| 		// use 500 to indicate that the cause of the error is unknown - other error codes | ||||
| 		// are more specific to HTTP interactions, and set a reason | ||||
| 		errors.NewClientErrorReporter(http.StatusInternalServerError, r.verb, "ClientWatchDecoding"), | ||||
| 	), nil | ||||
| } | ||||
|  | ||||
| // updateURLMetrics is a convenience function for pushing metrics. | ||||
| @@ -845,13 +850,13 @@ func (r *Request) transformResponse(resp *http.Response, req *http.Request) Resu | ||||
| 			// 3. Apiserver closes connection. | ||||
| 			// 4. client-go should catch this and return an error. | ||||
| 			klog.V(2).Infof("Stream error %#v when reading response body, may be caused by closed connection.", err) | ||||
| 			streamErr := fmt.Errorf("Stream error %#v when reading response body, may be caused by closed connection. Please retry.", err) | ||||
| 			streamErr := fmt.Errorf("Stream error when reading response body, may be caused by closed connection. Please retry. Original error: %v", err) | ||||
| 			return Result{ | ||||
| 				err: streamErr, | ||||
| 			} | ||||
| 		default: | ||||
| 			klog.Errorf("Unexpected error when reading response body: %#v", err) | ||||
| 			unexpectedErr := fmt.Errorf("Unexpected error %#v when reading response body. Please retry.", err) | ||||
| 			klog.Errorf("Unexpected error when reading response body: %v", err) | ||||
| 			unexpectedErr := fmt.Errorf("Unexpected error when reading response body. Please retry. Original error: %v", err) | ||||
| 			return Result{ | ||||
| 				err: unexpectedErr, | ||||
| 			} | ||||
|   | ||||
							
								
								
									
										7
									
								
								vendor/k8s.io/client-go/rest/transport.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/k8s.io/client-go/rest/transport.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -74,9 +74,10 @@ func (c *Config) TransportConfig() (*transport.Config, error) { | ||||
| 			KeyFile:    c.KeyFile, | ||||
| 			KeyData:    c.KeyData, | ||||
| 		}, | ||||
| 		Username:    c.Username, | ||||
| 		Password:    c.Password, | ||||
| 		BearerToken: c.BearerToken, | ||||
| 		Username:        c.Username, | ||||
| 		Password:        c.Password, | ||||
| 		BearerToken:     c.BearerToken, | ||||
| 		BearerTokenFile: c.BearerTokenFile, | ||||
| 		Impersonate: transport.ImpersonationConfig{ | ||||
| 			UserName: c.Impersonate.UserName, | ||||
| 			Groups:   c.Impersonate.Groups, | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/k8s.io/client-go/rest/watch/decoder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/k8s.io/client-go/rest/watch/decoder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -54,7 +54,7 @@ func (d *Decoder) Decode() (watch.EventType, runtime.Object, error) { | ||||
| 		return "", nil, fmt.Errorf("unable to decode to metav1.Event") | ||||
| 	} | ||||
| 	switch got.Type { | ||||
| 	case string(watch.Added), string(watch.Modified), string(watch.Deleted), string(watch.Error): | ||||
| 	case string(watch.Added), string(watch.Modified), string(watch.Deleted), string(watch.Error), string(watch.Bookmark): | ||||
| 	default: | ||||
| 		return "", nil, fmt.Errorf("got invalid watch event type: %v", got.Type) | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										9
									
								
								vendor/k8s.io/client-go/transport/token_source.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/k8s.io/client-go/transport/token_source.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -59,6 +59,15 @@ func NewCachedFileTokenSource(path string) oauth2.TokenSource { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // NewCachedTokenSource returns a oauth2.TokenSource reads a token from a | ||||
| // designed TokenSource. The ts would provide the source of token. | ||||
| func NewCachedTokenSource(ts oauth2.TokenSource) oauth2.TokenSource { | ||||
| 	return &cachingTokenSource{ | ||||
| 		now:  time.Now, | ||||
| 		base: ts, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type tokenSourceTransport struct { | ||||
| 	base http.RoundTripper | ||||
| 	ort  http.RoundTripper | ||||
|   | ||||
							
								
								
									
										29
									
								
								vendor/k8s.io/client-go/util/cert/cert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/k8s.io/client-go/util/cert/cert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -19,8 +19,6 @@ package cert | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"crypto" | ||||
| 	"crypto/ecdsa" | ||||
| 	"crypto/elliptic" | ||||
| 	cryptorand "crypto/rand" | ||||
| 	"crypto/rsa" | ||||
| 	"crypto/x509" | ||||
| @@ -33,11 +31,11 @@ import ( | ||||
| 	"path" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"k8s.io/client-go/util/keyutil" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	duration365d = time.Hour * 24 * 365 | ||||
| ) | ||||
| const duration365d = time.Hour * 24 * 365 | ||||
|  | ||||
| // Config contains the basic fields required for creating a certificate | ||||
| type Config struct { | ||||
| @@ -78,25 +76,6 @@ func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, erro | ||||
| 	return x509.ParseCertificate(certDERBytes) | ||||
| } | ||||
|  | ||||
| // MakeEllipticPrivateKeyPEM creates an ECDSA private key | ||||
| func MakeEllipticPrivateKeyPEM() ([]byte, error) { | ||||
| 	privateKey, err := ecdsa.GenerateKey(elliptic.P256(), cryptorand.Reader) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	derBytes, err := x509.MarshalECPrivateKey(privateKey) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	privateKeyPemBlock := &pem.Block{ | ||||
| 		Type:  ECPrivateKeyBlockType, | ||||
| 		Bytes: derBytes, | ||||
| 	} | ||||
| 	return pem.EncodeToMemory(privateKeyPemBlock), nil | ||||
| } | ||||
|  | ||||
| // GenerateSelfSignedCertKey creates a self-signed certificate and key for the given host. | ||||
| // Host may be an IP or a DNS name | ||||
| // You may also specify additional subject alt names (either ip or dns names) for the certificate. | ||||
| @@ -202,7 +181,7 @@ func GenerateSelfSignedCertKeyWithFixtures(host string, alternateIPs []net.IP, a | ||||
|  | ||||
| 	// Generate key | ||||
| 	keyBuffer := bytes.Buffer{} | ||||
| 	if err := pem.Encode(&keyBuffer, &pem.Block{Type: RSAPrivateKeyBlockType, Bytes: x509.MarshalPKCS1PrivateKey(priv)}); err != nil { | ||||
| 	if err := pem.Encode(&keyBuffer, &pem.Block{Type: keyutil.RSAPrivateKeyBlockType, Bytes: x509.MarshalPKCS1PrivateKey(priv)}); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
|   | ||||
							
								
								
									
										95
									
								
								vendor/k8s.io/client-go/util/cert/io.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										95
									
								
								vendor/k8s.io/client-go/util/cert/io.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -17,11 +17,7 @@ limitations under the License. | ||||
| package cert | ||||
|  | ||||
| import ( | ||||
| 	"crypto" | ||||
| 	"crypto/ecdsa" | ||||
| 	"crypto/rsa" | ||||
| 	"crypto/x509" | ||||
| 	"encoding/pem" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| @@ -73,60 +69,6 @@ func WriteCert(certPath string, data []byte) error { | ||||
| 	return ioutil.WriteFile(certPath, data, os.FileMode(0644)) | ||||
| } | ||||
|  | ||||
| // WriteKey writes the pem-encoded key data to keyPath. | ||||
| // The key file will be created with file mode 0600. | ||||
| // If the key file already exists, it will be overwritten. | ||||
| // The parent directory of the keyPath will be created as needed with file mode 0755. | ||||
| func WriteKey(keyPath string, data []byte) error { | ||||
| 	if err := os.MkdirAll(filepath.Dir(keyPath), os.FileMode(0755)); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return ioutil.WriteFile(keyPath, data, os.FileMode(0600)) | ||||
| } | ||||
|  | ||||
| // LoadOrGenerateKeyFile looks for a key in the file at the given path. If it | ||||
| // can't find one, it will generate a new key and store it there. | ||||
| func LoadOrGenerateKeyFile(keyPath string) (data []byte, wasGenerated bool, err error) { | ||||
| 	loadedData, err := ioutil.ReadFile(keyPath) | ||||
| 	// Call verifyKeyData to ensure the file wasn't empty/corrupt. | ||||
| 	if err == nil && verifyKeyData(loadedData) { | ||||
| 		return loadedData, false, err | ||||
| 	} | ||||
| 	if !os.IsNotExist(err) { | ||||
| 		return nil, false, fmt.Errorf("error loading key from %s: %v", keyPath, err) | ||||
| 	} | ||||
|  | ||||
| 	generatedData, err := MakeEllipticPrivateKeyPEM() | ||||
| 	if err != nil { | ||||
| 		return nil, false, fmt.Errorf("error generating key: %v", err) | ||||
| 	} | ||||
| 	if err := WriteKey(keyPath, generatedData); err != nil { | ||||
| 		return nil, false, fmt.Errorf("error writing key to %s: %v", keyPath, err) | ||||
| 	} | ||||
| 	return generatedData, true, nil | ||||
| } | ||||
|  | ||||
| // MarshalPrivateKeyToPEM converts a known private key type of RSA or ECDSA to | ||||
| // a PEM encoded block or returns an error. | ||||
| func MarshalPrivateKeyToPEM(privateKey crypto.PrivateKey) ([]byte, error) { | ||||
| 	switch t := privateKey.(type) { | ||||
| 	case *ecdsa.PrivateKey: | ||||
| 		derBytes, err := x509.MarshalECPrivateKey(t) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		privateKeyPemBlock := &pem.Block{ | ||||
| 			Type:  ECPrivateKeyBlockType, | ||||
| 			Bytes: derBytes, | ||||
| 		} | ||||
| 		return pem.EncodeToMemory(privateKeyPemBlock), nil | ||||
| 	case *rsa.PrivateKey: | ||||
| 		return EncodePrivateKeyPEM(t), nil | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("private key is not a recognized type: %T", privateKey) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // NewPool returns an x509.CertPool containing the certificates in the given PEM-encoded file. | ||||
| // Returns an error if the file could not be read, a certificate could not be parsed, or if the file does not contain any certificates | ||||
| func NewPool(filename string) (*x509.CertPool, error) { | ||||
| @@ -154,40 +96,3 @@ func CertsFromFile(file string) ([]*x509.Certificate, error) { | ||||
| 	} | ||||
| 	return certs, nil | ||||
| } | ||||
|  | ||||
| // PrivateKeyFromFile returns the private key in rsa.PrivateKey or ecdsa.PrivateKey format from a given PEM-encoded file. | ||||
| // Returns an error if the file could not be read or if the private key could not be parsed. | ||||
| func PrivateKeyFromFile(file string) (interface{}, error) { | ||||
| 	data, err := ioutil.ReadFile(file) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	key, err := ParsePrivateKeyPEM(data) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error reading private key file %s: %v", file, err) | ||||
| 	} | ||||
| 	return key, nil | ||||
| } | ||||
|  | ||||
| // PublicKeysFromFile returns the public keys in rsa.PublicKey or ecdsa.PublicKey format from a given PEM-encoded file. | ||||
| // Reads public keys from both public and private key files. | ||||
| func PublicKeysFromFile(file string) ([]interface{}, error) { | ||||
| 	data, err := ioutil.ReadFile(file) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	keys, err := ParsePublicKeysPEM(data) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error reading public key file %s: %v", file, err) | ||||
| 	} | ||||
| 	return keys, nil | ||||
| } | ||||
|  | ||||
| // verifyKeyData returns true if the provided data appears to be a valid private key. | ||||
| func verifyKeyData(data []byte) bool { | ||||
| 	if len(data) == 0 { | ||||
| 		return false | ||||
| 	} | ||||
| 	_, err := ParsePrivateKeyPEM(data) | ||||
| 	return err == nil | ||||
| } | ||||
|   | ||||
							
								
								
									
										189
									
								
								vendor/k8s.io/client-go/util/cert/pem.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										189
									
								
								vendor/k8s.io/client-go/util/cert/pem.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -17,113 +17,18 @@ limitations under the License. | ||||
| package cert | ||||
|  | ||||
| import ( | ||||
| 	"crypto/ecdsa" | ||||
| 	"crypto/rsa" | ||||
| 	"crypto/x509" | ||||
| 	"encoding/pem" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
|  | ||||
| 	// ECPrivateKeyBlockType is a possible value for pem.Block.Type. | ||||
| 	ECPrivateKeyBlockType = "EC PRIVATE KEY" | ||||
| 	// RSAPrivateKeyBlockType is a possible value for pem.Block.Type. | ||||
| 	RSAPrivateKeyBlockType = "RSA PRIVATE KEY" | ||||
| 	// CertificateRequestBlockType is a possible value for pem.Block.Type. | ||||
| 	CertificateRequestBlockType = "CERTIFICATE REQUEST" | ||||
| 	// CertificateBlockType is a possible value for pem.Block.Type. | ||||
| 	CertificateBlockType = "CERTIFICATE" | ||||
| 	// PrivateKeyBlockType is a possible value for pem.Block.Type. | ||||
| 	PrivateKeyBlockType = "PRIVATE KEY" | ||||
| 	// CertificateRequestBlockType is a possible value for pem.Block.Type. | ||||
| 	CertificateRequestBlockType = "CERTIFICATE REQUEST" | ||||
| ) | ||||
|  | ||||
| // ParsePrivateKeyPEM returns a private key parsed from a PEM block in the supplied data. | ||||
| // Recognizes PEM blocks for "EC PRIVATE KEY", "RSA PRIVATE KEY", or "PRIVATE KEY" | ||||
| func ParsePrivateKeyPEM(keyData []byte) (interface{}, error) { | ||||
| 	var privateKeyPemBlock *pem.Block | ||||
| 	for { | ||||
| 		privateKeyPemBlock, keyData = pem.Decode(keyData) | ||||
| 		if privateKeyPemBlock == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		switch privateKeyPemBlock.Type { | ||||
| 		case ECPrivateKeyBlockType: | ||||
| 			// ECDSA Private Key in ASN.1 format | ||||
| 			if key, err := x509.ParseECPrivateKey(privateKeyPemBlock.Bytes); err == nil { | ||||
| 				return key, nil | ||||
| 			} | ||||
| 		case RSAPrivateKeyBlockType: | ||||
| 			// RSA Private Key in PKCS#1 format | ||||
| 			if key, err := x509.ParsePKCS1PrivateKey(privateKeyPemBlock.Bytes); err == nil { | ||||
| 				return key, nil | ||||
| 			} | ||||
| 		case PrivateKeyBlockType: | ||||
| 			// RSA or ECDSA Private Key in unencrypted PKCS#8 format | ||||
| 			if key, err := x509.ParsePKCS8PrivateKey(privateKeyPemBlock.Bytes); err == nil { | ||||
| 				return key, nil | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// tolerate non-key PEM blocks for compatibility with things like "EC PARAMETERS" blocks | ||||
| 		// originally, only the first PEM block was parsed and expected to be a key block | ||||
| 	} | ||||
|  | ||||
| 	// we read all the PEM blocks and didn't recognize one | ||||
| 	return nil, fmt.Errorf("data does not contain a valid RSA or ECDSA private key") | ||||
| } | ||||
|  | ||||
| // ParsePublicKeysPEM is a helper function for reading an array of rsa.PublicKey or ecdsa.PublicKey from a PEM-encoded byte array. | ||||
| // Reads public keys from both public and private key files. | ||||
| func ParsePublicKeysPEM(keyData []byte) ([]interface{}, error) { | ||||
| 	var block *pem.Block | ||||
| 	keys := []interface{}{} | ||||
| 	for { | ||||
| 		// read the next block | ||||
| 		block, keyData = pem.Decode(keyData) | ||||
| 		if block == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		// test block against parsing functions | ||||
| 		if privateKey, err := parseRSAPrivateKey(block.Bytes); err == nil { | ||||
| 			keys = append(keys, &privateKey.PublicKey) | ||||
| 			continue | ||||
| 		} | ||||
| 		if publicKey, err := parseRSAPublicKey(block.Bytes); err == nil { | ||||
| 			keys = append(keys, publicKey) | ||||
| 			continue | ||||
| 		} | ||||
| 		if privateKey, err := parseECPrivateKey(block.Bytes); err == nil { | ||||
| 			keys = append(keys, &privateKey.PublicKey) | ||||
| 			continue | ||||
| 		} | ||||
| 		if publicKey, err := parseECPublicKey(block.Bytes); err == nil { | ||||
| 			keys = append(keys, publicKey) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// tolerate non-key PEM blocks for backwards compatibility | ||||
| 		// originally, only the first PEM block was parsed and expected to be a key block | ||||
| 	} | ||||
|  | ||||
| 	if len(keys) == 0 { | ||||
| 		return nil, fmt.Errorf("data does not contain any valid RSA or ECDSA public keys") | ||||
| 	} | ||||
| 	return keys, nil | ||||
| } | ||||
|  | ||||
| // EncodePrivateKeyPEM returns PEM-encoded private key data | ||||
| func EncodePrivateKeyPEM(key *rsa.PrivateKey) []byte { | ||||
| 	block := pem.Block{ | ||||
| 		Type:  RSAPrivateKeyBlockType, | ||||
| 		Bytes: x509.MarshalPKCS1PrivateKey(key), | ||||
| 	} | ||||
| 	return pem.EncodeToMemory(&block) | ||||
| } | ||||
|  | ||||
| // ParseCertsPEM returns the x509.Certificates contained in the given PEM-encoded byte array | ||||
| // Returns an error if a certificate could not be parsed, or if the data does not contain any certificates | ||||
| func ParseCertsPEM(pemCerts []byte) ([]*x509.Certificate, error) { | ||||
| @@ -154,93 +59,3 @@ func ParseCertsPEM(pemCerts []byte) ([]*x509.Certificate, error) { | ||||
| 	} | ||||
| 	return certs, nil | ||||
| } | ||||
|  | ||||
| // parseRSAPublicKey parses a single RSA public key from the provided data | ||||
| func parseRSAPublicKey(data []byte) (*rsa.PublicKey, error) { | ||||
| 	var err error | ||||
|  | ||||
| 	// Parse the key | ||||
| 	var parsedKey interface{} | ||||
| 	if parsedKey, err = x509.ParsePKIXPublicKey(data); err != nil { | ||||
| 		if cert, err := x509.ParseCertificate(data); err == nil { | ||||
| 			parsedKey = cert.PublicKey | ||||
| 		} else { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Test if parsed key is an RSA Public Key | ||||
| 	var pubKey *rsa.PublicKey | ||||
| 	var ok bool | ||||
| 	if pubKey, ok = parsedKey.(*rsa.PublicKey); !ok { | ||||
| 		return nil, fmt.Errorf("data doesn't contain valid RSA Public Key") | ||||
| 	} | ||||
|  | ||||
| 	return pubKey, nil | ||||
| } | ||||
|  | ||||
| // parseRSAPrivateKey parses a single RSA private key from the provided data | ||||
| func parseRSAPrivateKey(data []byte) (*rsa.PrivateKey, error) { | ||||
| 	var err error | ||||
|  | ||||
| 	// Parse the key | ||||
| 	var parsedKey interface{} | ||||
| 	if parsedKey, err = x509.ParsePKCS1PrivateKey(data); err != nil { | ||||
| 		if parsedKey, err = x509.ParsePKCS8PrivateKey(data); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Test if parsed key is an RSA Private Key | ||||
| 	var privKey *rsa.PrivateKey | ||||
| 	var ok bool | ||||
| 	if privKey, ok = parsedKey.(*rsa.PrivateKey); !ok { | ||||
| 		return nil, fmt.Errorf("data doesn't contain valid RSA Private Key") | ||||
| 	} | ||||
|  | ||||
| 	return privKey, nil | ||||
| } | ||||
|  | ||||
| // parseECPublicKey parses a single ECDSA public key from the provided data | ||||
| func parseECPublicKey(data []byte) (*ecdsa.PublicKey, error) { | ||||
| 	var err error | ||||
|  | ||||
| 	// Parse the key | ||||
| 	var parsedKey interface{} | ||||
| 	if parsedKey, err = x509.ParsePKIXPublicKey(data); err != nil { | ||||
| 		if cert, err := x509.ParseCertificate(data); err == nil { | ||||
| 			parsedKey = cert.PublicKey | ||||
| 		} else { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Test if parsed key is an ECDSA Public Key | ||||
| 	var pubKey *ecdsa.PublicKey | ||||
| 	var ok bool | ||||
| 	if pubKey, ok = parsedKey.(*ecdsa.PublicKey); !ok { | ||||
| 		return nil, fmt.Errorf("data doesn't contain valid ECDSA Public Key") | ||||
| 	} | ||||
|  | ||||
| 	return pubKey, nil | ||||
| } | ||||
|  | ||||
| // parseECPrivateKey parses a single ECDSA private key from the provided data | ||||
| func parseECPrivateKey(data []byte) (*ecdsa.PrivateKey, error) { | ||||
| 	var err error | ||||
|  | ||||
| 	// Parse the key | ||||
| 	var parsedKey interface{} | ||||
| 	if parsedKey, err = x509.ParseECPrivateKey(data); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// Test if parsed key is an ECDSA Private Key | ||||
| 	var privKey *ecdsa.PrivateKey | ||||
| 	var ok bool | ||||
| 	if privKey, ok = parsedKey.(*ecdsa.PrivateKey); !ok { | ||||
| 		return nil, fmt.Errorf("data doesn't contain valid ECDSA Private Key") | ||||
| 	} | ||||
|  | ||||
| 	return privKey, nil | ||||
| } | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/k8s.io/client-go/util/flowcontrol/backoff.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/k8s.io/client-go/util/flowcontrol/backoff.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -99,7 +99,7 @@ func (p *Backoff) IsInBackOffSince(id string, eventTime time.Time) bool { | ||||
| 	if hasExpired(eventTime, entry.lastUpdate, p.maxDuration) { | ||||
| 		return false | ||||
| 	} | ||||
| 	return p.Clock.Now().Sub(eventTime) < entry.backoff | ||||
| 	return p.Clock.Since(eventTime) < entry.backoff | ||||
| } | ||||
|  | ||||
| // Returns True if time since lastupdate is less than the current backoff window. | ||||
|   | ||||
							
								
								
									
										323
									
								
								vendor/k8s.io/client-go/util/keyutil/key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										323
									
								
								vendor/k8s.io/client-go/util/keyutil/key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,323 @@ | ||||
| /* | ||||
| Copyright 2018 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 keyutil contains utilities for managing public/private key pairs. | ||||
| package keyutil | ||||
|  | ||||
| import ( | ||||
| 	"crypto" | ||||
| 	"crypto/ecdsa" | ||||
| 	"crypto/elliptic" | ||||
| 	cryptorand "crypto/rand" | ||||
| 	"crypto/rsa" | ||||
| 	"crypto/x509" | ||||
| 	"encoding/pem" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// ECPrivateKeyBlockType is a possible value for pem.Block.Type. | ||||
| 	ECPrivateKeyBlockType = "EC PRIVATE KEY" | ||||
| 	// RSAPrivateKeyBlockType is a possible value for pem.Block.Type. | ||||
| 	RSAPrivateKeyBlockType = "RSA PRIVATE KEY" | ||||
| 	// PrivateKeyBlockType is a possible value for pem.Block.Type. | ||||
| 	PrivateKeyBlockType = "PRIVATE KEY" | ||||
| 	// PublicKeyBlockType is a possible value for pem.Block.Type. | ||||
| 	PublicKeyBlockType = "PUBLIC KEY" | ||||
| ) | ||||
|  | ||||
| // MakeEllipticPrivateKeyPEM creates an ECDSA private key | ||||
| func MakeEllipticPrivateKeyPEM() ([]byte, error) { | ||||
| 	privateKey, err := ecdsa.GenerateKey(elliptic.P256(), cryptorand.Reader) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	derBytes, err := x509.MarshalECPrivateKey(privateKey) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	privateKeyPemBlock := &pem.Block{ | ||||
| 		Type:  ECPrivateKeyBlockType, | ||||
| 		Bytes: derBytes, | ||||
| 	} | ||||
| 	return pem.EncodeToMemory(privateKeyPemBlock), nil | ||||
| } | ||||
|  | ||||
| // WriteKey writes the pem-encoded key data to keyPath. | ||||
| // The key file will be created with file mode 0600. | ||||
| // If the key file already exists, it will be overwritten. | ||||
| // The parent directory of the keyPath will be created as needed with file mode 0755. | ||||
| func WriteKey(keyPath string, data []byte) error { | ||||
| 	if err := os.MkdirAll(filepath.Dir(keyPath), os.FileMode(0755)); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return ioutil.WriteFile(keyPath, data, os.FileMode(0600)) | ||||
| } | ||||
|  | ||||
| // LoadOrGenerateKeyFile looks for a key in the file at the given path. If it | ||||
| // can't find one, it will generate a new key and store it there. | ||||
| func LoadOrGenerateKeyFile(keyPath string) (data []byte, wasGenerated bool, err error) { | ||||
| 	loadedData, err := ioutil.ReadFile(keyPath) | ||||
| 	// Call verifyKeyData to ensure the file wasn't empty/corrupt. | ||||
| 	if err == nil && verifyKeyData(loadedData) { | ||||
| 		return loadedData, false, err | ||||
| 	} | ||||
| 	if !os.IsNotExist(err) { | ||||
| 		return nil, false, fmt.Errorf("error loading key from %s: %v", keyPath, err) | ||||
| 	} | ||||
|  | ||||
| 	generatedData, err := MakeEllipticPrivateKeyPEM() | ||||
| 	if err != nil { | ||||
| 		return nil, false, fmt.Errorf("error generating key: %v", err) | ||||
| 	} | ||||
| 	if err := WriteKey(keyPath, generatedData); err != nil { | ||||
| 		return nil, false, fmt.Errorf("error writing key to %s: %v", keyPath, err) | ||||
| 	} | ||||
| 	return generatedData, true, nil | ||||
| } | ||||
|  | ||||
| // MarshalPrivateKeyToPEM converts a known private key type of RSA or ECDSA to | ||||
| // a PEM encoded block or returns an error. | ||||
| func MarshalPrivateKeyToPEM(privateKey crypto.PrivateKey) ([]byte, error) { | ||||
| 	switch t := privateKey.(type) { | ||||
| 	case *ecdsa.PrivateKey: | ||||
| 		derBytes, err := x509.MarshalECPrivateKey(t) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		block := &pem.Block{ | ||||
| 			Type:  ECPrivateKeyBlockType, | ||||
| 			Bytes: derBytes, | ||||
| 		} | ||||
| 		return pem.EncodeToMemory(block), nil | ||||
| 	case *rsa.PrivateKey: | ||||
| 		block := &pem.Block{ | ||||
| 			Type:  RSAPrivateKeyBlockType, | ||||
| 			Bytes: x509.MarshalPKCS1PrivateKey(t), | ||||
| 		} | ||||
| 		return pem.EncodeToMemory(block), nil | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("private key is not a recognized type: %T", privateKey) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // PrivateKeyFromFile returns the private key in rsa.PrivateKey or ecdsa.PrivateKey format from a given PEM-encoded file. | ||||
| // Returns an error if the file could not be read or if the private key could not be parsed. | ||||
| func PrivateKeyFromFile(file string) (interface{}, error) { | ||||
| 	data, err := ioutil.ReadFile(file) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	key, err := ParsePrivateKeyPEM(data) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error reading private key file %s: %v", file, err) | ||||
| 	} | ||||
| 	return key, nil | ||||
| } | ||||
|  | ||||
| // PublicKeysFromFile returns the public keys in rsa.PublicKey or ecdsa.PublicKey format from a given PEM-encoded file. | ||||
| // Reads public keys from both public and private key files. | ||||
| func PublicKeysFromFile(file string) ([]interface{}, error) { | ||||
| 	data, err := ioutil.ReadFile(file) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	keys, err := ParsePublicKeysPEM(data) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("error reading public key file %s: %v", file, err) | ||||
| 	} | ||||
| 	return keys, nil | ||||
| } | ||||
|  | ||||
| // verifyKeyData returns true if the provided data appears to be a valid private key. | ||||
| func verifyKeyData(data []byte) bool { | ||||
| 	if len(data) == 0 { | ||||
| 		return false | ||||
| 	} | ||||
| 	_, err := ParsePrivateKeyPEM(data) | ||||
| 	return err == nil | ||||
| } | ||||
|  | ||||
| // ParsePrivateKeyPEM returns a private key parsed from a PEM block in the supplied data. | ||||
| // Recognizes PEM blocks for "EC PRIVATE KEY", "RSA PRIVATE KEY", or "PRIVATE KEY" | ||||
| func ParsePrivateKeyPEM(keyData []byte) (interface{}, error) { | ||||
| 	var privateKeyPemBlock *pem.Block | ||||
| 	for { | ||||
| 		privateKeyPemBlock, keyData = pem.Decode(keyData) | ||||
| 		if privateKeyPemBlock == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		switch privateKeyPemBlock.Type { | ||||
| 		case ECPrivateKeyBlockType: | ||||
| 			// ECDSA Private Key in ASN.1 format | ||||
| 			if key, err := x509.ParseECPrivateKey(privateKeyPemBlock.Bytes); err == nil { | ||||
| 				return key, nil | ||||
| 			} | ||||
| 		case RSAPrivateKeyBlockType: | ||||
| 			// RSA Private Key in PKCS#1 format | ||||
| 			if key, err := x509.ParsePKCS1PrivateKey(privateKeyPemBlock.Bytes); err == nil { | ||||
| 				return key, nil | ||||
| 			} | ||||
| 		case PrivateKeyBlockType: | ||||
| 			// RSA or ECDSA Private Key in unencrypted PKCS#8 format | ||||
| 			if key, err := x509.ParsePKCS8PrivateKey(privateKeyPemBlock.Bytes); err == nil { | ||||
| 				return key, nil | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// tolerate non-key PEM blocks for compatibility with things like "EC PARAMETERS" blocks | ||||
| 		// originally, only the first PEM block was parsed and expected to be a key block | ||||
| 	} | ||||
|  | ||||
| 	// we read all the PEM blocks and didn't recognize one | ||||
| 	return nil, fmt.Errorf("data does not contain a valid RSA or ECDSA private key") | ||||
| } | ||||
|  | ||||
| // ParsePublicKeysPEM is a helper function for reading an array of rsa.PublicKey or ecdsa.PublicKey from a PEM-encoded byte array. | ||||
| // Reads public keys from both public and private key files. | ||||
| func ParsePublicKeysPEM(keyData []byte) ([]interface{}, error) { | ||||
| 	var block *pem.Block | ||||
| 	keys := []interface{}{} | ||||
| 	for { | ||||
| 		// read the next block | ||||
| 		block, keyData = pem.Decode(keyData) | ||||
| 		if block == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		// test block against parsing functions | ||||
| 		if privateKey, err := parseRSAPrivateKey(block.Bytes); err == nil { | ||||
| 			keys = append(keys, &privateKey.PublicKey) | ||||
| 			continue | ||||
| 		} | ||||
| 		if publicKey, err := parseRSAPublicKey(block.Bytes); err == nil { | ||||
| 			keys = append(keys, publicKey) | ||||
| 			continue | ||||
| 		} | ||||
| 		if privateKey, err := parseECPrivateKey(block.Bytes); err == nil { | ||||
| 			keys = append(keys, &privateKey.PublicKey) | ||||
| 			continue | ||||
| 		} | ||||
| 		if publicKey, err := parseECPublicKey(block.Bytes); err == nil { | ||||
| 			keys = append(keys, publicKey) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// tolerate non-key PEM blocks for backwards compatibility | ||||
| 		// originally, only the first PEM block was parsed and expected to be a key block | ||||
| 	} | ||||
|  | ||||
| 	if len(keys) == 0 { | ||||
| 		return nil, fmt.Errorf("data does not contain any valid RSA or ECDSA public keys") | ||||
| 	} | ||||
| 	return keys, nil | ||||
| } | ||||
|  | ||||
| // parseRSAPublicKey parses a single RSA public key from the provided data | ||||
| func parseRSAPublicKey(data []byte) (*rsa.PublicKey, error) { | ||||
| 	var err error | ||||
|  | ||||
| 	// Parse the key | ||||
| 	var parsedKey interface{} | ||||
| 	if parsedKey, err = x509.ParsePKIXPublicKey(data); err != nil { | ||||
| 		if cert, err := x509.ParseCertificate(data); err == nil { | ||||
| 			parsedKey = cert.PublicKey | ||||
| 		} else { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Test if parsed key is an RSA Public Key | ||||
| 	var pubKey *rsa.PublicKey | ||||
| 	var ok bool | ||||
| 	if pubKey, ok = parsedKey.(*rsa.PublicKey); !ok { | ||||
| 		return nil, fmt.Errorf("data doesn't contain valid RSA Public Key") | ||||
| 	} | ||||
|  | ||||
| 	return pubKey, nil | ||||
| } | ||||
|  | ||||
| // parseRSAPrivateKey parses a single RSA private key from the provided data | ||||
| func parseRSAPrivateKey(data []byte) (*rsa.PrivateKey, error) { | ||||
| 	var err error | ||||
|  | ||||
| 	// Parse the key | ||||
| 	var parsedKey interface{} | ||||
| 	if parsedKey, err = x509.ParsePKCS1PrivateKey(data); err != nil { | ||||
| 		if parsedKey, err = x509.ParsePKCS8PrivateKey(data); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Test if parsed key is an RSA Private Key | ||||
| 	var privKey *rsa.PrivateKey | ||||
| 	var ok bool | ||||
| 	if privKey, ok = parsedKey.(*rsa.PrivateKey); !ok { | ||||
| 		return nil, fmt.Errorf("data doesn't contain valid RSA Private Key") | ||||
| 	} | ||||
|  | ||||
| 	return privKey, nil | ||||
| } | ||||
|  | ||||
| // parseECPublicKey parses a single ECDSA public key from the provided data | ||||
| func parseECPublicKey(data []byte) (*ecdsa.PublicKey, error) { | ||||
| 	var err error | ||||
|  | ||||
| 	// Parse the key | ||||
| 	var parsedKey interface{} | ||||
| 	if parsedKey, err = x509.ParsePKIXPublicKey(data); err != nil { | ||||
| 		if cert, err := x509.ParseCertificate(data); err == nil { | ||||
| 			parsedKey = cert.PublicKey | ||||
| 		} else { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Test if parsed key is an ECDSA Public Key | ||||
| 	var pubKey *ecdsa.PublicKey | ||||
| 	var ok bool | ||||
| 	if pubKey, ok = parsedKey.(*ecdsa.PublicKey); !ok { | ||||
| 		return nil, fmt.Errorf("data doesn't contain valid ECDSA Public Key") | ||||
| 	} | ||||
|  | ||||
| 	return pubKey, nil | ||||
| } | ||||
|  | ||||
| // parseECPrivateKey parses a single ECDSA private key from the provided data | ||||
| func parseECPrivateKey(data []byte) (*ecdsa.PrivateKey, error) { | ||||
| 	var err error | ||||
|  | ||||
| 	// Parse the key | ||||
| 	var parsedKey interface{} | ||||
| 	if parsedKey, err = x509.ParseECPrivateKey(data); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// Test if parsed key is an ECDSA Private Key | ||||
| 	var privKey *ecdsa.PrivateKey | ||||
| 	var ok bool | ||||
| 	if privKey, ok = parsedKey.(*ecdsa.PrivateKey); !ok { | ||||
| 		return nil, fmt.Errorf("data doesn't contain valid ECDSA Private Key") | ||||
| 	} | ||||
|  | ||||
| 	return privKey, nil | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Lantao Liu
					Lantao Liu