github.com/pvitto98/fabric@v2.1.1+incompatible/msp/msp.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package msp
     8  
     9  import (
    10  	"time"
    11  
    12  	"github.com/hyperledger/fabric-protos-go/msp"
    13  )
    14  
    15  // IdentityDeserializer is implemented by both MSPManger and MSP
    16  type IdentityDeserializer interface {
    17  	// DeserializeIdentity deserializes an identity.
    18  	// Deserialization will fail if the identity is associated to
    19  	// an msp that is different from this one that is performing
    20  	// the deserialization.
    21  	DeserializeIdentity(serializedIdentity []byte) (Identity, error)
    22  
    23  	// IsWellFormed checks if the given identity can be deserialized into its provider-specific form
    24  	IsWellFormed(identity *msp.SerializedIdentity) error
    25  }
    26  
    27  // Membership service provider APIs for Hyperledger Fabric:
    28  //
    29  // By "membership service provider" we refer to an abstract component of the
    30  // system that would provide (anonymous) credentials to clients, and peers for
    31  // them to participate in Hyperledger/fabric network. Clients use these
    32  // credentials to authenticate their transactions, and peers use these credentials
    33  // to authenticate transaction processing results (endorsements). While
    34  // strongly connected to the transaction processing components of the systems,
    35  // this interface aims to have membership services components defined, in such
    36  // a way such that alternate implementations of this can be smoothly plugged in
    37  // without modifying the core of transaction processing components of the system.
    38  //
    39  // This file includes Membership service provider interface that covers the
    40  // needs of a peer membership service provider interface.
    41  
    42  // MSPManager is an interface defining a manager of one or more MSPs. This
    43  // essentially acts as a mediator to MSP calls and routes MSP related calls
    44  // to the appropriate MSP.
    45  // This object is immutable, it is initialized once and never changed.
    46  type MSPManager interface {
    47  
    48  	// IdentityDeserializer interface needs to be implemented by MSPManager
    49  	IdentityDeserializer
    50  
    51  	// Setup the MSP manager instance according to configuration information
    52  	Setup(msps []MSP) error
    53  
    54  	// GetMSPs Provides a list of Membership Service providers
    55  	GetMSPs() (map[string]MSP, error)
    56  }
    57  
    58  // MSP is the minimal Membership Service Provider Interface to be implemented
    59  // to accommodate peer functionality
    60  type MSP interface {
    61  
    62  	// IdentityDeserializer interface needs to be implemented by MSP
    63  	IdentityDeserializer
    64  
    65  	// Setup the MSP instance according to configuration information
    66  	Setup(config *msp.MSPConfig) error
    67  
    68  	// GetVersion returns the version of this MSP
    69  	GetVersion() MSPVersion
    70  
    71  	// GetType returns the provider type
    72  	GetType() ProviderType
    73  
    74  	// GetIdentifier returns the provider identifier
    75  	GetIdentifier() (string, error)
    76  
    77  	// GetSigningIdentity returns a signing identity corresponding to the provided identifier
    78  	GetSigningIdentity(identifier *IdentityIdentifier) (SigningIdentity, error)
    79  
    80  	// GetDefaultSigningIdentity returns the default signing identity
    81  	GetDefaultSigningIdentity() (SigningIdentity, error)
    82  
    83  	// GetTLSRootCerts returns the TLS root certificates for this MSP
    84  	GetTLSRootCerts() [][]byte
    85  
    86  	// GetTLSIntermediateCerts returns the TLS intermediate root certificates for this MSP
    87  	GetTLSIntermediateCerts() [][]byte
    88  
    89  	// Validate checks whether the supplied identity is valid
    90  	Validate(id Identity) error
    91  
    92  	// SatisfiesPrincipal checks whether the identity matches
    93  	// the description supplied in MSPPrincipal. The check may
    94  	// involve a byte-by-byte comparison (if the principal is
    95  	// a serialized identity) or may require MSP validation
    96  	SatisfiesPrincipal(id Identity, principal *msp.MSPPrincipal) error
    97  }
    98  
    99  // OUIdentifier represents an organizational unit and
   100  // its related chain of trust identifier.
   101  type OUIdentifier struct {
   102  	// CertifiersIdentifier is the hash of certificates chain of trust
   103  	// related to this organizational unit
   104  	CertifiersIdentifier []byte
   105  	// OrganizationUnitIdentifier defines the organizational unit under the
   106  	// MSP identified with MSPIdentifier
   107  	OrganizationalUnitIdentifier string
   108  }
   109  
   110  // From this point on, there are interfaces that are shared within the peer and client API
   111  // of the membership service provider.
   112  
   113  // Identity interface defining operations associated to a "certificate".
   114  // That is, the public part of the identity could be thought to be a certificate,
   115  // and offers solely signature verification capabilities. This is to be used
   116  // at the peer side when verifying certificates that transactions are signed
   117  // with, and verifying signatures that correspond to these certificates.///
   118  type Identity interface {
   119  
   120  	// ExpiresAt returns the time at which the Identity expires.
   121  	// If the returned time is the zero value, it implies
   122  	// the Identity does not expire, or that its expiration
   123  	// time is unknown
   124  	ExpiresAt() time.Time
   125  
   126  	// GetIdentifier returns the identifier of that identity
   127  	GetIdentifier() *IdentityIdentifier
   128  
   129  	// GetMSPIdentifier returns the MSP Id for this instance
   130  	GetMSPIdentifier() string
   131  
   132  	// Validate uses the rules that govern this identity to validate it.
   133  	// E.g., if it is a fabric TCert implemented as identity, validate
   134  	// will check the TCert signature against the assumed root certificate
   135  	// authority.
   136  	Validate() error
   137  
   138  	// GetOrganizationalUnits returns zero or more organization units or
   139  	// divisions this identity is related to as long as this is public
   140  	// information. Certain MSP implementations may use attributes
   141  	// that are publicly associated to this identity, or the identifier of
   142  	// the root certificate authority that has provided signatures on this
   143  	// certificate.
   144  	// Examples:
   145  	//  - if the identity is an x.509 certificate, this function returns one
   146  	//    or more string which is encoded in the Subject's Distinguished Name
   147  	//    of the type OU
   148  	// TODO: For X.509 based identities, check if we need a dedicated type
   149  	//       for OU where the Certificate OU is properly namespaced by the
   150  	//       signer's identity
   151  	GetOrganizationalUnits() []*OUIdentifier
   152  
   153  	// Anonymous returns true if this is an anonymous identity, false otherwise
   154  	Anonymous() bool
   155  
   156  	// Verify a signature over some message using this identity as reference
   157  	Verify(msg []byte, sig []byte) error
   158  
   159  	// Serialize converts an identity to bytes
   160  	Serialize() ([]byte, error)
   161  
   162  	// SatisfiesPrincipal checks whether this instance matches
   163  	// the description supplied in MSPPrincipal. The check may
   164  	// involve a byte-by-byte comparison (if the principal is
   165  	// a serialized identity) or may require MSP validation
   166  	SatisfiesPrincipal(principal *msp.MSPPrincipal) error
   167  }
   168  
   169  // SigningIdentity is an extension of Identity to cover signing capabilities.
   170  // E.g., signing identity should be requested in the case of a client who wishes
   171  // to sign transactions, or fabric endorser who wishes to sign proposal
   172  // processing outcomes.
   173  type SigningIdentity interface {
   174  
   175  	// Extends Identity
   176  	Identity
   177  
   178  	// Sign the message
   179  	Sign(msg []byte) ([]byte, error)
   180  
   181  	// GetPublicVersion returns the public parts of this identity
   182  	GetPublicVersion() Identity
   183  }
   184  
   185  // IdentityIdentifier is a holder for the identifier of a specific
   186  // identity, naturally namespaced, by its provider identifier.
   187  type IdentityIdentifier struct {
   188  
   189  	// The identifier of the associated membership service provider
   190  	Mspid string
   191  
   192  	// The identifier for an identity within a provider
   193  	Id string
   194  }
   195  
   196  // ProviderType indicates the type of an identity provider
   197  type ProviderType int
   198  
   199  // The ProviderType of a member relative to the member API
   200  const (
   201  	FABRIC ProviderType = iota // MSP is of FABRIC type
   202  	IDEMIX                     // MSP is of IDEMIX type
   203  	OTHER                      // MSP is of OTHER TYPE
   204  
   205  	// NOTE: as new types are added to this set,
   206  	// the mspTypes map below must be extended
   207  )
   208  
   209  var mspTypeStrings = map[ProviderType]string{
   210  	FABRIC: "bccsp",
   211  	IDEMIX: "idemix",
   212  }
   213  
   214  var Options = map[string]NewOpts{
   215  	ProviderTypeToString(FABRIC): &BCCSPNewOpts{NewBaseOpts: NewBaseOpts{Version: MSPv1_4_3}},
   216  	ProviderTypeToString(IDEMIX): &IdemixNewOpts{NewBaseOpts: NewBaseOpts{Version: MSPv1_1}},
   217  }
   218  
   219  // ProviderTypeToString returns a string that represents the ProviderType integer
   220  func ProviderTypeToString(id ProviderType) string {
   221  	if res, found := mspTypeStrings[id]; found {
   222  		return res
   223  	}
   224  
   225  	return ""
   226  }