224 lines
7.9 KiB
Go
224 lines
7.9 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package msp
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/hyperledger/fabric-protos-go/msp"
|
|
)
|
|
|
|
// IdentityDeserializer is implemented by both MSPManger and MSP
|
|
type IdentityDeserializer interface {
|
|
// DeserializeIdentity deserializes an identity.
|
|
// Deserialization will fail if the identity is associated to
|
|
// an msp that is different from this one that is performing
|
|
// the deserialization.
|
|
DeserializeIdentity(serializedIdentity []byte) (Identity, error)
|
|
|
|
// IsWellFormed checks if the given identity can be deserialized into its provider-specific form
|
|
IsWellFormed(identity *msp.SerializedIdentity) error
|
|
}
|
|
|
|
// Membership service provider APIs for Hyperledger Fabric:
|
|
//
|
|
// By "membership service provider" we refer to an abstract component of the
|
|
// system that would provide (anonymous) credentials to clients, and peers for
|
|
// them to participate in Hyperledger/fabric network. Clients use these
|
|
// credentials to authenticate their transactions, and peers use these credentials
|
|
// to authenticate transaction processing results (endorsements). While
|
|
// strongly connected to the transaction processing components of the systems,
|
|
// this interface aims to have membership services components defined, in such
|
|
// a way such that alternate implementations of this can be smoothly plugged in
|
|
// without modifying the core of transaction processing components of the system.
|
|
//
|
|
// This file includes Membership service provider interface that covers the
|
|
// needs of a peer membership service provider interface.
|
|
|
|
// MSPManager is an interface defining a manager of one or more MSPs. This
|
|
// essentially acts as a mediator to MSP calls and routes MSP related calls
|
|
// to the appropriate MSP.
|
|
// This object is immutable, it is initialized once and never changed.
|
|
type MSPManager interface {
|
|
|
|
// IdentityDeserializer interface needs to be implemented by MSPManager
|
|
IdentityDeserializer
|
|
|
|
// Setup the MSP manager instance according to configuration information
|
|
Setup(msps []MSP) error
|
|
|
|
// GetMSPs Provides a list of Membership Service providers
|
|
GetMSPs() (map[string]MSP, error)
|
|
}
|
|
|
|
// MSP is the minimal Membership Service Provider Interface to be implemented
|
|
// to accommodate peer functionality
|
|
type MSP interface {
|
|
|
|
// IdentityDeserializer interface needs to be implemented by MSP
|
|
IdentityDeserializer
|
|
|
|
// Setup the MSP instance according to configuration information
|
|
Setup(config *msp.MSPConfig) error
|
|
|
|
// GetVersion returns the version of this MSP
|
|
GetVersion() MSPVersion
|
|
|
|
// GetType returns the provider type
|
|
GetType() ProviderType
|
|
|
|
// GetIdentifier returns the provider identifier
|
|
GetIdentifier() (string, error)
|
|
|
|
// GetDefaultSigningIdentity returns the default signing identity
|
|
GetDefaultSigningIdentity() (SigningIdentity, error)
|
|
|
|
// GetTLSRootCerts returns the TLS root certificates for this MSP
|
|
GetTLSRootCerts() [][]byte
|
|
|
|
// GetTLSIntermediateCerts returns the TLS intermediate root certificates for this MSP
|
|
GetTLSIntermediateCerts() [][]byte
|
|
|
|
// Validate checks whether the supplied identity is valid
|
|
Validate(id Identity) error
|
|
|
|
// SatisfiesPrincipal checks whether the identity matches
|
|
// the description supplied in MSPPrincipal. The check may
|
|
// involve a byte-by-byte comparison (if the principal is
|
|
// a serialized identity) or may require MSP validation
|
|
SatisfiesPrincipal(id Identity, principal *msp.MSPPrincipal) error
|
|
}
|
|
|
|
// OUIdentifier represents an organizational unit and
|
|
// its related chain of trust identifier.
|
|
type OUIdentifier struct {
|
|
// CertifiersIdentifier is the hash of certificates chain of trust
|
|
// related to this organizational unit
|
|
CertifiersIdentifier []byte
|
|
// OrganizationUnitIdentifier defines the organizational unit under the
|
|
// MSP identified with MSPIdentifier
|
|
OrganizationalUnitIdentifier string
|
|
}
|
|
|
|
// From this point on, there are interfaces that are shared within the peer and client API
|
|
// of the membership service provider.
|
|
|
|
// Identity interface defining operations associated to a "certificate".
|
|
// That is, the public part of the identity could be thought to be a certificate,
|
|
// and offers solely signature verification capabilities. This is to be used
|
|
// at the peer side when verifying certificates that transactions are signed
|
|
// with, and verifying signatures that correspond to these certificates.///
|
|
type Identity interface {
|
|
|
|
// ExpiresAt returns the time at which the Identity expires.
|
|
// If the returned time is the zero value, it implies
|
|
// the Identity does not expire, or that its expiration
|
|
// time is unknown
|
|
ExpiresAt() time.Time
|
|
|
|
// GetIdentifier returns the identifier of that identity
|
|
GetIdentifier() *IdentityIdentifier
|
|
|
|
// GetMSPIdentifier returns the MSP Id for this instance
|
|
GetMSPIdentifier() string
|
|
|
|
// Validate uses the rules that govern this identity to validate it.
|
|
// E.g., if it is a fabric TCert implemented as identity, validate
|
|
// will check the TCert signature against the assumed root certificate
|
|
// authority.
|
|
Validate() error
|
|
|
|
// GetOrganizationalUnits returns zero or more organization units or
|
|
// divisions this identity is related to as long as this is public
|
|
// information. Certain MSP implementations may use attributes
|
|
// that are publicly associated to this identity, or the identifier of
|
|
// the root certificate authority that has provided signatures on this
|
|
// certificate.
|
|
// Examples:
|
|
// - if the identity is an x.509 certificate, this function returns one
|
|
// or more string which is encoded in the Subject's Distinguished Name
|
|
// of the type OU
|
|
// TODO: For X.509 based identities, check if we need a dedicated type
|
|
// for OU where the Certificate OU is properly namespaced by the
|
|
// signer's identity
|
|
GetOrganizationalUnits() []*OUIdentifier
|
|
|
|
// Anonymous returns true if this is an anonymous identity, false otherwise
|
|
Anonymous() bool
|
|
|
|
// Verify a signature over some message using this identity as reference
|
|
Verify(msg []byte, sig []byte) error
|
|
|
|
// Serialize converts an identity to bytes
|
|
Serialize() ([]byte, error)
|
|
|
|
// SatisfiesPrincipal checks whether this instance matches
|
|
// the description supplied in MSPPrincipal. The check may
|
|
// involve a byte-by-byte comparison (if the principal is
|
|
// a serialized identity) or may require MSP validation
|
|
SatisfiesPrincipal(principal *msp.MSPPrincipal) error
|
|
}
|
|
|
|
// SigningIdentity is an extension of Identity to cover signing capabilities.
|
|
// E.g., signing identity should be requested in the case of a client who wishes
|
|
// to sign transactions, or fabric endorser who wishes to sign proposal
|
|
// processing outcomes.
|
|
type SigningIdentity interface {
|
|
|
|
// Extends Identity
|
|
Identity
|
|
|
|
// Sign the message
|
|
Sign(msg []byte) ([]byte, error)
|
|
|
|
// GetPublicVersion returns the public parts of this identity
|
|
GetPublicVersion() Identity
|
|
}
|
|
|
|
// IdentityIdentifier is a holder for the identifier of a specific
|
|
// identity, naturally namespaced, by its provider identifier.
|
|
type IdentityIdentifier struct {
|
|
|
|
// The identifier of the associated membership service provider
|
|
Mspid string
|
|
|
|
// The identifier for an identity within a provider
|
|
Id string
|
|
}
|
|
|
|
// ProviderType indicates the type of an identity provider
|
|
type ProviderType int
|
|
|
|
// The ProviderType of a member relative to the member API
|
|
const (
|
|
FABRIC ProviderType = iota // MSP is of FABRIC type
|
|
IDEMIX // MSP is of IDEMIX type
|
|
OTHER // MSP is of OTHER TYPE
|
|
|
|
// NOTE: as new types are added to this set,
|
|
// the mspTypes map below must be extended
|
|
)
|
|
|
|
var mspTypeStrings = map[ProviderType]string{
|
|
FABRIC: "bccsp",
|
|
IDEMIX: "idemix",
|
|
}
|
|
|
|
var Options = map[string]NewOpts{
|
|
ProviderTypeToString(FABRIC): &BCCSPNewOpts{NewBaseOpts: NewBaseOpts{Version: MSPv1_4_3}},
|
|
ProviderTypeToString(IDEMIX): &IdemixNewOpts{NewBaseOpts: NewBaseOpts{Version: MSPv1_1}},
|
|
}
|
|
|
|
// ProviderTypeToString returns a string that represents the ProviderType integer
|
|
func ProviderTypeToString(id ProviderType) string {
|
|
if res, found := mspTypeStrings[id]; found {
|
|
return res
|
|
}
|
|
|
|
return ""
|
|
}
|