package v4a
import (
)
type Credentials struct {
Context string
PrivateKey *ecdsa.PrivateKey
SessionToken string
CanExpire bool
Expires time.Time
}
func ( Credentials) () bool {
if .CanExpire {
return !.Expires.After(sdk.NowTime())
}
return false
}
func ( Credentials) () bool {
return len(.Context) > 0 && .PrivateKey != nil
}
type SymmetricCredentialAdaptor struct {
SymmetricProvider aws.CredentialsProvider
asymmetric atomic.Value
m sync.Mutex
}
func ( *SymmetricCredentialAdaptor) ( context.Context) (aws.Credentials, error) {
, := .retrieveFromSymmetricProvider()
if != nil {
return aws.Credentials{},
}
if := .getCreds(); == nil {
return , nil
}
.m.Lock()
defer .m.Unlock()
:= .getCreds()
if == nil {
return , nil
}
if .Context != .AccessKeyID {
.asymmetric.Store((*Credentials)(nil))
}
return , nil
}
func ( *SymmetricCredentialAdaptor) ( context.Context) (Credentials, error) {
if := .getCreds(); != nil {
return *, nil
}
.m.Lock()
defer .m.Unlock()
if := .getCreds(); != nil {
return *, nil
}
, := .retrieveFromSymmetricProvider()
if != nil {
return Credentials{}, fmt.Errorf("failed to retrieve symmetric credentials: %v", )
}
, := deriveKeyFromAccessKeyPair(.AccessKeyID, .SecretAccessKey)
if != nil {
return Credentials{}, fmt.Errorf("failed to derive assymetric key from credentials")
}
:= Credentials{
Context: .AccessKeyID,
PrivateKey: ,
SessionToken: .SessionToken,
CanExpire: .CanExpire,
Expires: .Expires,
}
.asymmetric.Store(&)
return , nil
}
func ( *SymmetricCredentialAdaptor) () *Credentials {
:= .asymmetric.Load()
if == nil {
return nil
}
:= .(*Credentials)
if != nil && .HasKeys() && !.Expired() {
return
}
return nil
}
func ( *SymmetricCredentialAdaptor) ( context.Context) (aws.Credentials, error) {
, := .SymmetricProvider.Retrieve()
if != nil {
return aws.Credentials{},
}
return , nil
}
type CredentialsProvider interface {
RetrievePrivateKey(context.Context) (Credentials, error)
}