| /* |
| * |
| * Copyright 2021 Google LLC |
| * |
| * 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 |
| * |
| * https://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 s2a |
| |
| import ( |
| "context" |
| "errors" |
| |
| commonpb "github.com/google/s2a-go/internal/proto/common_go_proto" |
| "google.golang.org/grpc/credentials" |
| "google.golang.org/grpc/peer" |
| ) |
| |
| // AuthInfo exposes security information from the S2A to the application. |
| type AuthInfo interface { |
| // AuthType returns the authentication type. |
| AuthType() string |
| // ApplicationProtocol returns the application protocol, e.g. "grpc". |
| ApplicationProtocol() string |
| // TLSVersion returns the TLS version negotiated during the handshake. |
| TLSVersion() commonpb.TLSVersion |
| // Ciphersuite returns the ciphersuite negotiated during the handshake. |
| Ciphersuite() commonpb.Ciphersuite |
| // PeerIdentity returns the authenticated identity of the peer. |
| PeerIdentity() *commonpb.Identity |
| // LocalIdentity returns the local identity of the application used during |
| // session setup. |
| LocalIdentity() *commonpb.Identity |
| // PeerCertFingerprint returns the SHA256 hash of the peer certificate used in |
| // the S2A handshake. |
| PeerCertFingerprint() []byte |
| // LocalCertFingerprint returns the SHA256 hash of the local certificate used |
| // in the S2A handshake. |
| LocalCertFingerprint() []byte |
| // IsHandshakeResumed returns true if a cached session was used to resume |
| // the handshake. |
| IsHandshakeResumed() bool |
| // SecurityLevel returns the security level of the connection. |
| SecurityLevel() credentials.SecurityLevel |
| } |
| |
| // AuthInfoFromPeer extracts the authinfo.S2AAuthInfo object from the given |
| // peer, if it exists. This API should be used by gRPC clients after |
| // obtaining a peer object using the grpc.Peer() CallOption. |
| func AuthInfoFromPeer(p *peer.Peer) (AuthInfo, error) { |
| s2aAuthInfo, ok := p.AuthInfo.(AuthInfo) |
| if !ok { |
| return nil, errors.New("no S2AAuthInfo found in Peer") |
| } |
| return s2aAuthInfo, nil |
| } |
| |
| // AuthInfoFromContext extracts the authinfo.S2AAuthInfo object from the given |
| // context, if it exists. This API should be used by gRPC server RPC handlers |
| // to get information about the peer. On the client-side, use the grpc.Peer() |
| // CallOption and the AuthInfoFromPeer function. |
| func AuthInfoFromContext(ctx context.Context) (AuthInfo, error) { |
| p, ok := peer.FromContext(ctx) |
| if !ok { |
| return nil, errors.New("no Peer found in Context") |
| } |
| return AuthInfoFromPeer(p) |
| } |