github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/bccsp/sw/new.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package sw
     8  
     9  import (
    10  	"crypto/elliptic"
    11  	"crypto/sha256"
    12  	"crypto/sha512"
    13  	"reflect"
    14  
    15  	"github.com/hechain20/hechain/bccsp"
    16  	"github.com/pkg/errors"
    17  	"golang.org/x/crypto/sha3"
    18  )
    19  
    20  // NewDefaultSecurityLevel returns a new instance of the software-based BCCSP
    21  // at security level 256, hash family SHA2 and using FolderBasedKeyStore as KeyStore.
    22  func NewDefaultSecurityLevel(keyStorePath string) (bccsp.BCCSP, error) {
    23  	ks := &fileBasedKeyStore{}
    24  	if err := ks.Init(nil, keyStorePath, false); err != nil {
    25  		return nil, errors.Wrapf(err, "Failed initializing key store at [%v]", keyStorePath)
    26  	}
    27  
    28  	return NewWithParams(256, "SHA2", ks)
    29  }
    30  
    31  // NewDefaultSecurityLevel returns a new instance of the software-based BCCSP
    32  // at security level 256, hash family SHA2 and using the passed KeyStore.
    33  func NewDefaultSecurityLevelWithKeystore(keyStore bccsp.KeyStore) (bccsp.BCCSP, error) {
    34  	return NewWithParams(256, "SHA2", keyStore)
    35  }
    36  
    37  // NewWithParams returns a new instance of the software-based BCCSP
    38  // set at the passed security level, hash family and KeyStore.
    39  func NewWithParams(securityLevel int, hashFamily string, keyStore bccsp.KeyStore) (bccsp.BCCSP, error) {
    40  	// Init config
    41  	conf := &config{}
    42  	err := conf.setSecurityLevel(securityLevel, hashFamily)
    43  	if err != nil {
    44  		return nil, errors.Wrapf(err, "Failed initializing configuration at [%v,%v]", securityLevel, hashFamily)
    45  	}
    46  
    47  	swbccsp, err := New(keyStore)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	// Notice that errors are ignored here because some test will fail if one
    53  	// of the following call fails.
    54  
    55  	// Set the Encryptors
    56  	swbccsp.AddWrapper(reflect.TypeOf(&aesPrivateKey{}), &aescbcpkcs7Encryptor{})
    57  
    58  	// Set the Decryptors
    59  	swbccsp.AddWrapper(reflect.TypeOf(&aesPrivateKey{}), &aescbcpkcs7Decryptor{})
    60  
    61  	// Set the Signers
    62  	swbccsp.AddWrapper(reflect.TypeOf(&ecdsaPrivateKey{}), &ecdsaSigner{})
    63  
    64  	// Set the Verifiers
    65  	swbccsp.AddWrapper(reflect.TypeOf(&ecdsaPrivateKey{}), &ecdsaPrivateKeyVerifier{})
    66  	swbccsp.AddWrapper(reflect.TypeOf(&ecdsaPublicKey{}), &ecdsaPublicKeyKeyVerifier{})
    67  
    68  	// Set the Hashers
    69  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.SHAOpts{}), &hasher{hash: conf.hashFunction})
    70  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.SHA256Opts{}), &hasher{hash: sha256.New})
    71  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.SHA384Opts{}), &hasher{hash: sha512.New384})
    72  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.SHA3_256Opts{}), &hasher{hash: sha3.New256})
    73  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.SHA3_384Opts{}), &hasher{hash: sha3.New384})
    74  
    75  	// Set the key generators
    76  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.ECDSAKeyGenOpts{}), &ecdsaKeyGenerator{curve: conf.ellipticCurve})
    77  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.ECDSAP256KeyGenOpts{}), &ecdsaKeyGenerator{curve: elliptic.P256()})
    78  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.ECDSAP384KeyGenOpts{}), &ecdsaKeyGenerator{curve: elliptic.P384()})
    79  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.AESKeyGenOpts{}), &aesKeyGenerator{length: conf.aesBitLength})
    80  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.AES256KeyGenOpts{}), &aesKeyGenerator{length: 32})
    81  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.AES192KeyGenOpts{}), &aesKeyGenerator{length: 24})
    82  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.AES128KeyGenOpts{}), &aesKeyGenerator{length: 16})
    83  
    84  	// Set the key deriver
    85  	swbccsp.AddWrapper(reflect.TypeOf(&ecdsaPrivateKey{}), &ecdsaPrivateKeyKeyDeriver{})
    86  	swbccsp.AddWrapper(reflect.TypeOf(&ecdsaPublicKey{}), &ecdsaPublicKeyKeyDeriver{})
    87  	swbccsp.AddWrapper(reflect.TypeOf(&aesPrivateKey{}), &aesPrivateKeyKeyDeriver{conf: conf})
    88  
    89  	// Set the key importers
    90  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.AES256ImportKeyOpts{}), &aes256ImportKeyOptsKeyImporter{})
    91  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.HMACImportKeyOpts{}), &hmacImportKeyOptsKeyImporter{})
    92  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.ECDSAPKIXPublicKeyImportOpts{}), &ecdsaPKIXPublicKeyImportOptsKeyImporter{})
    93  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.ECDSAPrivateKeyImportOpts{}), &ecdsaPrivateKeyImportOptsKeyImporter{})
    94  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.ECDSAGoPublicKeyImportOpts{}), &ecdsaGoPublicKeyImportOptsKeyImporter{})
    95  	swbccsp.AddWrapper(reflect.TypeOf(&bccsp.X509PublicKeyImportOpts{}), &x509PublicKeyImportOptsKeyImporter{bccsp: swbccsp})
    96  
    97  	return swbccsp, nil
    98  }