vendor protobuf & grpc
Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
This commit is contained in:
		
							
								
								
									
										275
									
								
								vendor/google.golang.org/grpc/credentials/credentials.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										275
									
								
								vendor/google.golang.org/grpc/credentials/credentials.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -24,16 +24,12 @@ package credentials // import "google.golang.org/grpc/credentials" | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"crypto/tls" | ||||
| 	"crypto/x509" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"net" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"google.golang.org/grpc/credentials/internal" | ||||
| 	"google.golang.org/grpc/internal" | ||||
| ) | ||||
|  | ||||
| // PerRPCCredentials defines the common interface for the credentials which need to | ||||
| @@ -45,7 +41,8 @@ type PerRPCCredentials interface { | ||||
| 	// context. If a status code is returned, it will be used as the status | ||||
| 	// for the RPC. uri is the URI of the entry point for the request. | ||||
| 	// When supported by the underlying implementation, ctx can be used for | ||||
| 	// timeout and cancellation. | ||||
| 	// timeout and cancellation. Additionally, RequestInfo data will be | ||||
| 	// available via ctx to this call. | ||||
| 	// TODO(zhaoq): Define the set of the qualified keys instead of leaving | ||||
| 	// it as an arbitrary string. | ||||
| 	GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) | ||||
| @@ -54,6 +51,48 @@ type PerRPCCredentials interface { | ||||
| 	RequireTransportSecurity() bool | ||||
| } | ||||
|  | ||||
| // SecurityLevel defines the protection level on an established connection. | ||||
| // | ||||
| // This API is experimental. | ||||
| type SecurityLevel int | ||||
|  | ||||
| const ( | ||||
| 	// NoSecurity indicates a connection is insecure. | ||||
| 	// The zero SecurityLevel value is invalid for backward compatibility. | ||||
| 	NoSecurity SecurityLevel = iota + 1 | ||||
| 	// IntegrityOnly indicates a connection only provides integrity protection. | ||||
| 	IntegrityOnly | ||||
| 	// PrivacyAndIntegrity indicates a connection provides both privacy and integrity protection. | ||||
| 	PrivacyAndIntegrity | ||||
| ) | ||||
|  | ||||
| // String returns SecurityLevel in a string format. | ||||
| func (s SecurityLevel) String() string { | ||||
| 	switch s { | ||||
| 	case NoSecurity: | ||||
| 		return "NoSecurity" | ||||
| 	case IntegrityOnly: | ||||
| 		return "IntegrityOnly" | ||||
| 	case PrivacyAndIntegrity: | ||||
| 		return "PrivacyAndIntegrity" | ||||
| 	} | ||||
| 	return fmt.Sprintf("invalid SecurityLevel: %v", int(s)) | ||||
| } | ||||
|  | ||||
| // CommonAuthInfo contains authenticated information common to AuthInfo implementations. | ||||
| // It should be embedded in a struct implementing AuthInfo to provide additional information | ||||
| // about the credentials. | ||||
| // | ||||
| // This API is experimental. | ||||
| type CommonAuthInfo struct { | ||||
| 	SecurityLevel SecurityLevel | ||||
| } | ||||
|  | ||||
| // GetCommonAuthInfo returns the pointer to CommonAuthInfo struct. | ||||
| func (c *CommonAuthInfo) GetCommonAuthInfo() *CommonAuthInfo { | ||||
| 	return c | ||||
| } | ||||
|  | ||||
| // ProtocolInfo provides information regarding the gRPC wire protocol version, | ||||
| // security protocol, security protocol version in use, server name, etc. | ||||
| type ProtocolInfo struct { | ||||
| @@ -68,6 +107,8 @@ type ProtocolInfo struct { | ||||
| } | ||||
|  | ||||
| // AuthInfo defines the common interface for the auth information the users are interested in. | ||||
| // A struct that implements AuthInfo should embed CommonAuthInfo by including additional | ||||
| // information about the credentials in it. | ||||
| type AuthInfo interface { | ||||
| 	AuthType() string | ||||
| } | ||||
| @@ -82,7 +123,8 @@ type TransportCredentials interface { | ||||
| 	// ClientHandshake does the authentication handshake specified by the corresponding | ||||
| 	// authentication protocol on rawConn for clients. It returns the authenticated | ||||
| 	// connection and the corresponding auth information about the connection. | ||||
| 	// Implementations must use the provided context to implement timely cancellation. | ||||
| 	// The auth information should embed CommonAuthInfo to return additional information about | ||||
| 	// the credentials. Implementations must use the provided context to implement timely cancellation. | ||||
| 	// gRPC will try to reconnect if the error returned is a temporary error | ||||
| 	// (io.EOF, context.DeadlineExceeded or err.Temporary() == true). | ||||
| 	// If the returned error is a wrapper error, implementations should make sure that | ||||
| @@ -92,7 +134,8 @@ type TransportCredentials interface { | ||||
| 	ClientHandshake(context.Context, string, net.Conn) (net.Conn, AuthInfo, error) | ||||
| 	// ServerHandshake does the authentication handshake for servers. It returns | ||||
| 	// the authenticated connection and the corresponding auth information about | ||||
| 	// the connection. | ||||
| 	// the connection. The auth information should embed CommonAuthInfo to return additional information | ||||
| 	// about the credentials. | ||||
| 	// | ||||
| 	// If the returned net.Conn is closed, it MUST close the net.Conn provided. | ||||
| 	ServerHandshake(net.Conn) (net.Conn, AuthInfo, error) | ||||
| @@ -125,145 +168,63 @@ type Bundle interface { | ||||
| 	NewWithMode(mode string) (Bundle, error) | ||||
| } | ||||
|  | ||||
| // TLSInfo contains the auth information for a TLS authenticated connection. | ||||
| // It implements the AuthInfo interface. | ||||
| type TLSInfo struct { | ||||
| 	State tls.ConnectionState | ||||
| // RequestInfo contains request data attached to the context passed to GetRequestMetadata calls. | ||||
| // | ||||
| // This API is experimental. | ||||
| type RequestInfo struct { | ||||
| 	// The method passed to Invoke or NewStream for this RPC. (For proto methods, this has the format "/some.Service/Method") | ||||
| 	Method string | ||||
| 	// AuthInfo contains the information from a security handshake (TransportCredentials.ClientHandshake, TransportCredentials.ServerHandshake) | ||||
| 	AuthInfo AuthInfo | ||||
| } | ||||
|  | ||||
| // AuthType returns the type of TLSInfo as a string. | ||||
| func (t TLSInfo) AuthType() string { | ||||
| 	return "tls" | ||||
| // requestInfoKey is a struct to be used as the key when attaching a RequestInfo to a context object. | ||||
| type requestInfoKey struct{} | ||||
|  | ||||
| // RequestInfoFromContext extracts the RequestInfo from the context if it exists. | ||||
| // | ||||
| // This API is experimental. | ||||
| func RequestInfoFromContext(ctx context.Context) (ri RequestInfo, ok bool) { | ||||
| 	ri, ok = ctx.Value(requestInfoKey{}).(RequestInfo) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // GetSecurityValue returns security info requested by channelz. | ||||
| func (t TLSInfo) GetSecurityValue() ChannelzSecurityValue { | ||||
| 	v := &TLSChannelzSecurityValue{ | ||||
| 		StandardName: cipherSuiteLookup[t.State.CipherSuite], | ||||
| // CheckSecurityLevel checks if a connection's security level is greater than or equal to the specified one. | ||||
| // It returns success if 1) the condition is satisified or 2) AuthInfo struct does not implement GetCommonAuthInfo() method | ||||
| // or 3) CommonAuthInfo.SecurityLevel has an invalid zero value. For 2) and 3), it is for the purpose of backward-compatibility. | ||||
| // | ||||
| // This API is experimental. | ||||
| func CheckSecurityLevel(ctx context.Context, level SecurityLevel) error { | ||||
| 	type internalInfo interface { | ||||
| 		GetCommonAuthInfo() *CommonAuthInfo | ||||
| 	} | ||||
| 	// Currently there's no way to get LocalCertificate info from tls package. | ||||
| 	if len(t.State.PeerCertificates) > 0 { | ||||
| 		v.RemoteCertificate = t.State.PeerCertificates[0].Raw | ||||
| 	ri, _ := RequestInfoFromContext(ctx) | ||||
| 	if ri.AuthInfo == nil { | ||||
| 		return errors.New("unable to obtain SecurityLevel from context") | ||||
| 	} | ||||
| 	return v | ||||
| } | ||||
|  | ||||
| // tlsCreds is the credentials required for authenticating a connection using TLS. | ||||
| type tlsCreds struct { | ||||
| 	// TLS configuration | ||||
| 	config *tls.Config | ||||
| } | ||||
|  | ||||
| func (c tlsCreds) Info() ProtocolInfo { | ||||
| 	return ProtocolInfo{ | ||||
| 		SecurityProtocol: "tls", | ||||
| 		SecurityVersion:  "1.2", | ||||
| 		ServerName:       c.config.ServerName, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) { | ||||
| 	// use local cfg to avoid clobbering ServerName if using multiple endpoints | ||||
| 	cfg := cloneTLSConfig(c.config) | ||||
| 	if cfg.ServerName == "" { | ||||
| 		colonPos := strings.LastIndex(authority, ":") | ||||
| 		if colonPos == -1 { | ||||
| 			colonPos = len(authority) | ||||
| 	if ci, ok := ri.AuthInfo.(internalInfo); ok { | ||||
| 		// CommonAuthInfo.SecurityLevel has an invalid value. | ||||
| 		if ci.GetCommonAuthInfo().SecurityLevel == 0 { | ||||
| 			return nil | ||||
| 		} | ||||
| 		cfg.ServerName = authority[:colonPos] | ||||
| 	} | ||||
| 	conn := tls.Client(rawConn, cfg) | ||||
| 	errChannel := make(chan error, 1) | ||||
| 	go func() { | ||||
| 		errChannel <- conn.Handshake() | ||||
| 	}() | ||||
| 	select { | ||||
| 	case err := <-errChannel: | ||||
| 		if err != nil { | ||||
| 			return nil, nil, err | ||||
| 		if ci.GetCommonAuthInfo().SecurityLevel < level { | ||||
| 			return fmt.Errorf("requires SecurityLevel %v; connection has %v", level, ci.GetCommonAuthInfo().SecurityLevel) | ||||
| 		} | ||||
| 	case <-ctx.Done(): | ||||
| 		return nil, nil, ctx.Err() | ||||
| 	} | ||||
| 	return internal.WrapSyscallConn(rawConn, conn), TLSInfo{conn.ConnectionState()}, nil | ||||
| } | ||||
|  | ||||
| func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) { | ||||
| 	conn := tls.Server(rawConn, c.config) | ||||
| 	if err := conn.Handshake(); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	return internal.WrapSyscallConn(rawConn, conn), TLSInfo{conn.ConnectionState()}, nil | ||||
| } | ||||
|  | ||||
| func (c *tlsCreds) Clone() TransportCredentials { | ||||
| 	return NewTLS(c.config) | ||||
| } | ||||
|  | ||||
| func (c *tlsCreds) OverrideServerName(serverNameOverride string) error { | ||||
| 	c.config.ServerName = serverNameOverride | ||||
| 	// The condition is satisfied or AuthInfo struct does not implement GetCommonAuthInfo() method. | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| const alpnProtoStrH2 = "h2" | ||||
|  | ||||
| func appendH2ToNextProtos(ps []string) []string { | ||||
| 	for _, p := range ps { | ||||
| 		if p == alpnProtoStrH2 { | ||||
| 			return ps | ||||
| 		} | ||||
| func init() { | ||||
| 	internal.NewRequestInfoContext = func(ctx context.Context, ri RequestInfo) context.Context { | ||||
| 		return context.WithValue(ctx, requestInfoKey{}, ri) | ||||
| 	} | ||||
| 	ret := make([]string, 0, len(ps)+1) | ||||
| 	ret = append(ret, ps...) | ||||
| 	return append(ret, alpnProtoStrH2) | ||||
| } | ||||
|  | ||||
| // NewTLS uses c to construct a TransportCredentials based on TLS. | ||||
| func NewTLS(c *tls.Config) TransportCredentials { | ||||
| 	tc := &tlsCreds{cloneTLSConfig(c)} | ||||
| 	tc.config.NextProtos = appendH2ToNextProtos(tc.config.NextProtos) | ||||
| 	return tc | ||||
| } | ||||
|  | ||||
| // NewClientTLSFromCert constructs TLS credentials from the input certificate for client. | ||||
| // serverNameOverride is for testing only. If set to a non empty string, | ||||
| // it will override the virtual host name of authority (e.g. :authority header field) in requests. | ||||
| func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) TransportCredentials { | ||||
| 	return NewTLS(&tls.Config{ServerName: serverNameOverride, RootCAs: cp}) | ||||
| } | ||||
|  | ||||
| // NewClientTLSFromFile constructs TLS credentials from the input certificate file for client. | ||||
| // serverNameOverride is for testing only. If set to a non empty string, | ||||
| // it will override the virtual host name of authority (e.g. :authority header field) in requests. | ||||
| func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredentials, error) { | ||||
| 	b, err := ioutil.ReadFile(certFile) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	cp := x509.NewCertPool() | ||||
| 	if !cp.AppendCertsFromPEM(b) { | ||||
| 		return nil, fmt.Errorf("credentials: failed to append certificates") | ||||
| 	} | ||||
| 	return NewTLS(&tls.Config{ServerName: serverNameOverride, RootCAs: cp}), nil | ||||
| } | ||||
|  | ||||
| // NewServerTLSFromCert constructs TLS credentials from the input certificate for server. | ||||
| func NewServerTLSFromCert(cert *tls.Certificate) TransportCredentials { | ||||
| 	return NewTLS(&tls.Config{Certificates: []tls.Certificate{*cert}}) | ||||
| } | ||||
|  | ||||
| // NewServerTLSFromFile constructs TLS credentials from the input certificate file and key | ||||
| // file for server. | ||||
| func NewServerTLSFromFile(certFile, keyFile string) (TransportCredentials, error) { | ||||
| 	cert, err := tls.LoadX509KeyPair(certFile, keyFile) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return NewTLS(&tls.Config{Certificates: []tls.Certificate{cert}}), nil | ||||
| } | ||||
|  | ||||
| // ChannelzSecurityInfo defines the interface that security protocols should implement | ||||
| // in order to provide security info to channelz. | ||||
| // | ||||
| // This API is experimental. | ||||
| type ChannelzSecurityInfo interface { | ||||
| 	GetSecurityValue() ChannelzSecurityValue | ||||
| } | ||||
| @@ -271,66 +232,20 @@ type ChannelzSecurityInfo interface { | ||||
| // ChannelzSecurityValue defines the interface that GetSecurityValue() return value | ||||
| // should satisfy. This interface should only be satisfied by *TLSChannelzSecurityValue | ||||
| // and *OtherChannelzSecurityValue. | ||||
| // | ||||
| // This API is experimental. | ||||
| type ChannelzSecurityValue interface { | ||||
| 	isChannelzSecurityValue() | ||||
| } | ||||
|  | ||||
| // TLSChannelzSecurityValue defines the struct that TLS protocol should return | ||||
| // from GetSecurityValue(), containing security info like cipher and certificate used. | ||||
| type TLSChannelzSecurityValue struct { | ||||
| 	ChannelzSecurityValue | ||||
| 	StandardName      string | ||||
| 	LocalCertificate  []byte | ||||
| 	RemoteCertificate []byte | ||||
| } | ||||
|  | ||||
| // OtherChannelzSecurityValue defines the struct that non-TLS protocol should return | ||||
| // from GetSecurityValue(), which contains protocol specific security info. Note | ||||
| // the Value field will be sent to users of channelz requesting channel info, and | ||||
| // thus sensitive info should better be avoided. | ||||
| // | ||||
| // This API is experimental. | ||||
| type OtherChannelzSecurityValue struct { | ||||
| 	ChannelzSecurityValue | ||||
| 	Name  string | ||||
| 	Value proto.Message | ||||
| } | ||||
|  | ||||
| var cipherSuiteLookup = map[uint16]string{ | ||||
| 	tls.TLS_RSA_WITH_RC4_128_SHA:                "TLS_RSA_WITH_RC4_128_SHA", | ||||
| 	tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA:           "TLS_RSA_WITH_3DES_EDE_CBC_SHA", | ||||
| 	tls.TLS_RSA_WITH_AES_128_CBC_SHA:            "TLS_RSA_WITH_AES_128_CBC_SHA", | ||||
| 	tls.TLS_RSA_WITH_AES_256_CBC_SHA:            "TLS_RSA_WITH_AES_256_CBC_SHA", | ||||
| 	tls.TLS_RSA_WITH_AES_128_GCM_SHA256:         "TLS_RSA_WITH_AES_128_GCM_SHA256", | ||||
| 	tls.TLS_RSA_WITH_AES_256_GCM_SHA384:         "TLS_RSA_WITH_AES_256_GCM_SHA384", | ||||
| 	tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:        "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", | ||||
| 	tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:    "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", | ||||
| 	tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:    "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", | ||||
| 	tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA:          "TLS_ECDHE_RSA_WITH_RC4_128_SHA", | ||||
| 	tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:     "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", | ||||
| 	tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:      "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", | ||||
| 	tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:      "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", | ||||
| 	tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:   "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", | ||||
| 	tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", | ||||
| 	tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:   "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", | ||||
| 	tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384: "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", | ||||
| 	tls.TLS_FALLBACK_SCSV:                       "TLS_FALLBACK_SCSV", | ||||
| 	tls.TLS_RSA_WITH_AES_128_CBC_SHA256:         "TLS_RSA_WITH_AES_128_CBC_SHA256", | ||||
| 	tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256: "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", | ||||
| 	tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:   "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", | ||||
| 	tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305:    "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305", | ||||
| 	tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:  "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305", | ||||
| } | ||||
|  | ||||
| // cloneTLSConfig returns a shallow clone of the exported | ||||
| // fields of cfg, ignoring the unexported sync.Once, which | ||||
| // contains a mutex and must not be copied. | ||||
| // | ||||
| // If cfg is nil, a new zero tls.Config is returned. | ||||
| // | ||||
| // TODO: inline this function if possible. | ||||
| func cloneTLSConfig(cfg *tls.Config) *tls.Config { | ||||
| 	if cfg == nil { | ||||
| 		return &tls.Config{} | ||||
| 	} | ||||
|  | ||||
| 	return cfg.Clone() | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Akihiro Suda
					Akihiro Suda