// TestVariousAESKeyEncoding tests some AES <-> PEM conversions func TestVariousAESKeyEncoding(t *testing.T) { key, err := primitives.GenAESKey() if err != nil { t.Fatalf("Failed generating AES key [%s]", err) } // PEM format pem := primitives.AEStoPEM(key) keyFromPEM, err := primitives.PEMtoAES(pem, nil) if err != nil { t.Fatalf("Failed converting PEM to AES key [%s]", err) } if 0 != bytes.Compare(key, keyFromPEM) { t.Fatalf("Failed converting PEM to AES key. Keys are different [%x][%x]", key, keyFromPEM) } // Encrypted PEM format pem, err = primitives.AEStoEncryptedPEM(key, []byte("passwd")) if err != nil { t.Fatalf("Failed converting AES key to Encrypted PEM [%s]", err) } keyFromPEM, err = primitives.PEMtoAES(pem, []byte("passwd")) if err != nil { t.Fatalf("Failed converting encrypted PEM to AES key [%s]", err) } if 0 != bytes.Compare(key, keyFromPEM) { t.Fatalf("Failed converting encrypted PEM to AES key. Keys are different [%x][%x]", key, keyFromPEM) } }
// TestAESRelatedUtilFunctions tests various functions commonly used in fabric wrt AES func TestAESRelatedUtilFunctions(t *testing.T) { key, err := primitives.GenAESKey() if err != nil { t.Fatalf("Failed generating AES key [%s]", err) } for i := 1; i < 100; i++ { len, err := rand.Int(rand.Reader, big.NewInt(1024)) if err != nil { t.Fatalf("Failed generating AES key [%s]", err) } msg, err := primitives.GetRandomBytes(int(len.Int64()) + 1) if err != nil { t.Fatalf("Failed generating AES key [%s]", err) } ct, err := primitives.CBCPKCS7Encrypt(key, msg) if err != nil { t.Fatalf("Failed encrypting [%s]", err) } msg2, err := primitives.CBCPKCS7Decrypt(key, ct) if err != nil { t.Fatalf("Failed decrypting [%s]", err) } if 0 != bytes.Compare(msg, msg2) { t.Fatalf("Wrong decryption output [%x][%x]", msg, msg2) } } }
func (client *clientImpl) encryptTxVersion1_2(tx *obc.Transaction) error { // Create (PK_C,SK_C) pair ccPrivateKey, err := client.eciesSPI.NewPrivateKey(rand.Reader, primitives.GetDefaultCurve()) if err != nil { client.Errorf("Failed generate chaincode keypair: [%s]", err) return err } // Prepare message to the validators var ( stateKey []byte privBytes []byte ) switch tx.Type { case obc.Transaction_CHAINCODE_DEPLOY: // Prepare chaincode stateKey and privateKey stateKey, err = primitives.GenAESKey() if err != nil { client.Errorf("Failed creating state key: [%s]", err) return err } privBytes, err = client.eciesSPI.SerializePrivateKey(ccPrivateKey) if err != nil { client.Errorf("Failed serializing chaincode key: [%s]", err) return err } break case obc.Transaction_CHAINCODE_QUERY: // Prepare chaincode stateKey and privateKey stateKey = primitives.HMACAESTruncated(client.queryStateKey, append([]byte{6}, tx.Nonce...)) privBytes, err = client.eciesSPI.SerializePrivateKey(ccPrivateKey) if err != nil { client.Errorf("Failed serializing chaincode key: [%s]", err) return err } break case obc.Transaction_CHAINCODE_INVOKE: // Prepare chaincode stateKey and privateKey stateKey = make([]byte, 0) privBytes, err = client.eciesSPI.SerializePrivateKey(ccPrivateKey) if err != nil { client.Errorf("Failed serializing chaincode key: [%s]", err) return err } break } // Encrypt message to the validators cipher, err := client.eciesSPI.NewAsymmetricCipherFromPublicKey(client.chainPublicKey) if err != nil { client.Errorf("Failed creating new encryption scheme: [%s]", err) return err } msgToValidators, err := asn1.Marshal(chainCodeValidatorMessage1_2{privBytes, stateKey}) if err != nil { client.Errorf("Failed preparing message to the validators: [%s]", err) return err } encMsgToValidators, err := cipher.Process(msgToValidators) if err != nil { client.Errorf("Failed encrypting message to the validators: [%s]", err) return err } tx.ToValidators = encMsgToValidators // Encrypt the rest of the fields // Init with chainccode pk cipher, err = client.eciesSPI.NewAsymmetricCipherFromPublicKey(ccPrivateKey.GetPublicKey()) if err != nil { client.Errorf("Failed initiliazing encryption scheme: [%s]", err) return err } // Encrypt chaincodeID using pkC encryptedChaincodeID, err := cipher.Process(tx.ChaincodeID) if err != nil { client.Errorf("Failed encrypting chaincodeID: [%s]", err) return err } tx.ChaincodeID = encryptedChaincodeID // Encrypt payload using pkC encryptedPayload, err := cipher.Process(tx.Payload) if err != nil { client.Errorf("Failed encrypting payload: [%s]", err) return err } tx.Payload = encryptedPayload // Encrypt metadata using pkC if len(tx.Metadata) != 0 { encryptedMetadata, err := cipher.Process(tx.Metadata) if err != nil { client.Errorf("Failed encrypting metadata: [%s]", err) return err } tx.Metadata = encryptedMetadata } return nil }