github.com/adnan-c/fabric_e2e_couchdb@v0.6.1-preview.0.20170228180935-21ce6b23cf91/bccsp/utils/keys_test.go (about)

     1  package utils
     2  
     3  import (
     4  	"crypto/ecdsa"
     5  	"crypto/elliptic"
     6  	"crypto/rand"
     7  	"testing"
     8  )
     9  
    10  func TestECDSAKeys(t *testing.T) {
    11  	key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
    12  	if err != nil {
    13  		t.Fatalf("Failed generating ECDSA key [%s]", err)
    14  	}
    15  
    16  	// Private Key DER format
    17  	der, err := PrivateKeyToDER(key)
    18  	if err != nil {
    19  		t.Fatalf("Failed converting private key to DER [%s]", err)
    20  	}
    21  	keyFromDER, err := DERToPrivateKey(der)
    22  	if err != nil {
    23  		t.Fatalf("Failed converting DER to private key [%s]", err)
    24  	}
    25  	ecdsaKeyFromDer := keyFromDER.(*ecdsa.PrivateKey)
    26  	// TODO: check the curve
    27  	if key.D.Cmp(ecdsaKeyFromDer.D) != 0 {
    28  		t.Fatal("Failed converting DER to private key. Invalid D.")
    29  	}
    30  	if key.X.Cmp(ecdsaKeyFromDer.X) != 0 {
    31  		t.Fatal("Failed converting DER to private key. Invalid X coordinate.")
    32  	}
    33  	if key.Y.Cmp(ecdsaKeyFromDer.Y) != 0 {
    34  		t.Fatal("Failed converting DER to private key. Invalid Y coordinate.")
    35  	}
    36  
    37  	// Private Key PEM format
    38  	pem, err := PrivateKeyToPEM(key, nil)
    39  	if err != nil {
    40  		t.Fatalf("Failed converting private key to PEM [%s]", err)
    41  	}
    42  	keyFromPEM, err := PEMtoPrivateKey(pem, nil)
    43  	if err != nil {
    44  		t.Fatalf("Failed converting DER to private key [%s]", err)
    45  	}
    46  	ecdsaKeyFromPEM := keyFromPEM.(*ecdsa.PrivateKey)
    47  	// TODO: check the curve
    48  	if key.D.Cmp(ecdsaKeyFromPEM.D) != 0 {
    49  		t.Fatal("Failed converting PEM to private key. Invalid D.")
    50  	}
    51  	if key.X.Cmp(ecdsaKeyFromPEM.X) != 0 {
    52  		t.Fatal("Failed converting PEM to private key. Invalid X coordinate.")
    53  	}
    54  	if key.Y.Cmp(ecdsaKeyFromPEM.Y) != 0 {
    55  		t.Fatal("Failed converting PEM to private key. Invalid Y coordinate.")
    56  	}
    57  
    58  	// Nil Private Key <-> PEM
    59  	_, err = PrivateKeyToPEM(nil, nil)
    60  	if err == nil {
    61  		t.Fatal("PublicKeyToPEM should fail on nil")
    62  	}
    63  
    64  	_, err = PEMtoPrivateKey(nil, nil)
    65  	if err == nil {
    66  		t.Fatal("PEMtoPublicKey should fail on nil")
    67  	}
    68  
    69  	_, err = PEMtoPrivateKey([]byte{0, 1, 3, 4}, nil)
    70  	if err == nil {
    71  		t.Fatal("PEMtoPublicKey should fail invalid PEM")
    72  	}
    73  
    74  	_, err = DERToPrivateKey(nil)
    75  	if err == nil {
    76  		t.Fatal("DERToPrivateKey should fail on nil")
    77  	}
    78  
    79  	_, err = DERToPrivateKey([]byte{0, 1, 3, 4})
    80  	if err == nil {
    81  		t.Fatal("DERToPrivateKey should fail on invalid DER")
    82  	}
    83  
    84  	_, err = PrivateKeyToDER(nil)
    85  	if err == nil {
    86  		t.Fatal("DERToPrivateKey should fail on nil")
    87  	}
    88  
    89  	// Private Key Encrypted PEM format
    90  	encPEM, err := PrivateKeyToPEM(key, []byte("passwd"))
    91  	if err != nil {
    92  		t.Fatalf("Failed converting private key to encrypted PEM [%s]", err)
    93  	}
    94  	encKeyFromPEM, err := PEMtoPrivateKey(encPEM, []byte("passwd"))
    95  	if err != nil {
    96  		t.Fatalf("Failed converting DER to private key [%s]", err)
    97  	}
    98  	ecdsaKeyFromEncPEM := encKeyFromPEM.(*ecdsa.PrivateKey)
    99  	// TODO: check the curve
   100  	if key.D.Cmp(ecdsaKeyFromEncPEM.D) != 0 {
   101  		t.Fatal("Failed converting encrypted PEM to private key. Invalid D.")
   102  	}
   103  	if key.X.Cmp(ecdsaKeyFromEncPEM.X) != 0 {
   104  		t.Fatal("Failed converting encrypted PEM to private key. Invalid X coordinate.")
   105  	}
   106  	if key.Y.Cmp(ecdsaKeyFromEncPEM.Y) != 0 {
   107  		t.Fatal("Failed converting encrypted PEM to private key. Invalid Y coordinate.")
   108  	}
   109  
   110  	// Public Key PEM format
   111  	pem, err = PublicKeyToPEM(&key.PublicKey, nil)
   112  	if err != nil {
   113  		t.Fatalf("Failed converting public key to PEM [%s]", err)
   114  	}
   115  	keyFromPEM, err = PEMtoPublicKey(pem, nil)
   116  	if err != nil {
   117  		t.Fatalf("Failed converting DER to public key [%s]", err)
   118  	}
   119  	ecdsaPkFromPEM := keyFromPEM.(*ecdsa.PublicKey)
   120  	// TODO: check the curve
   121  	if key.X.Cmp(ecdsaPkFromPEM.X) != 0 {
   122  		t.Fatal("Failed converting PEM to private key. Invalid X coordinate.")
   123  	}
   124  	if key.Y.Cmp(ecdsaPkFromPEM.Y) != 0 {
   125  		t.Fatal("Failed converting PEM to private key. Invalid Y coordinate.")
   126  	}
   127  
   128  	// Nil Public Key <-> PEM
   129  	_, err = PublicKeyToPEM(nil, nil)
   130  	if err == nil {
   131  		t.Fatal("PublicKeyToPEM should fail on nil")
   132  	}
   133  
   134  	_, err = PEMtoPublicKey(nil, nil)
   135  	if err == nil {
   136  		t.Fatal("PEMtoPublicKey should fail on nil")
   137  	}
   138  
   139  	_, err = PEMtoPublicKey([]byte{0, 1, 3, 4}, nil)
   140  	if err == nil {
   141  		t.Fatal("PEMtoPublicKey should fail on invalid PEM")
   142  	}
   143  
   144  	// Public Key Encrypted PEM format
   145  	encPEM, err = PublicKeyToPEM(&key.PublicKey, []byte("passwd"))
   146  	if err != nil {
   147  		t.Fatalf("Failed converting private key to encrypted PEM [%s]", err)
   148  	}
   149  	pkFromEncPEM, err := PEMtoPublicKey(encPEM, []byte("passwd"))
   150  	if err != nil {
   151  		t.Fatalf("Failed converting DER to private key [%s]", err)
   152  	}
   153  	ecdsaPkFromEncPEM := pkFromEncPEM.(*ecdsa.PublicKey)
   154  	// TODO: check the curve
   155  	if key.X.Cmp(ecdsaPkFromEncPEM.X) != 0 {
   156  		t.Fatal("Failed converting encrypted PEM to private key. Invalid X coordinate.")
   157  	}
   158  	if key.Y.Cmp(ecdsaPkFromEncPEM.Y) != 0 {
   159  		t.Fatal("Failed converting encrypted PEM to private key. Invalid Y coordinate.")
   160  	}
   161  
   162  	_, err = PEMtoPublicKey(encPEM, []byte("passw"))
   163  	if err == nil {
   164  		t.Fatal("PEMtoPublicKey should fail on wrong password")
   165  	}
   166  
   167  	_, err = PEMtoPublicKey(encPEM, []byte("passw"))
   168  	if err == nil {
   169  		t.Fatal("PEMtoPublicKey should fail on nil password")
   170  	}
   171  
   172  	_, err = PEMtoPublicKey(nil, []byte("passwd"))
   173  	if err == nil {
   174  		t.Fatal("PEMtoPublicKey should fail on nil PEM")
   175  	}
   176  
   177  	_, err = PEMtoPublicKey([]byte{0, 1, 3, 4}, []byte("passwd"))
   178  	if err == nil {
   179  		t.Fatal("PEMtoPublicKey should fail on invalid PEM")
   180  	}
   181  
   182  	_, err = PEMtoPublicKey(nil, []byte("passw"))
   183  	if err == nil {
   184  		t.Fatal("PEMtoPublicKey should fail on nil PEM and wrong password")
   185  	}
   186  }