package codec import ( "math/big" "testing" "github.com/stretchr/testify/assert" ) func TestDiffieHellman(t *testing.T) { key1, err := GenerateKey() assert.Nil(t, err) key2, err := GenerateKey() assert.Nil(t, err) pubKey1, err := ComputeKey(key1.PubKey, key2.PriKey) assert.Nil(t, err) pubKey2, err := ComputeKey(key2.PubKey, key1.PriKey) assert.Nil(t, err) assert.Equal(t, pubKey1, pubKey2) } func TestDiffieHellman1024(t *testing.T) { old := p p, _ = new(big.Int).SetString("F488FD584E49DBCD20B49DE49107366B336C380D451D0F7C88B31C7C5B2D8EF6F3C923C043F0A55B188D8EBB558CB85D38D334FD7C175743A31D186CDE33212CB52AFF3CE1B1294018118D7C84A70A72D686C40319C807297ACA950CD9969FABD00A509B0246D3083D66A45D419F9C7CBD894B221926BAABA25EC355E92F78C7", 16) defer func() { p = old }() key1, err := GenerateKey() assert.Nil(t, err) key2, err := GenerateKey() assert.Nil(t, err) pubKey1, err := ComputeKey(key1.PubKey, key2.PriKey) assert.Nil(t, err) pubKey2, err := ComputeKey(key2.PubKey, key1.PriKey) assert.Nil(t, err) assert.Equal(t, pubKey1, pubKey2) } func TestDiffieHellmanMiddleManAttack(t *testing.T) { key1, err := GenerateKey() assert.Nil(t, err) keyMiddle, err := GenerateKey() assert.Nil(t, err) key2, err := GenerateKey() assert.Nil(t, err) const aesByteLen = 32 pubKey1, err := ComputeKey(keyMiddle.PubKey, key1.PriKey) assert.Nil(t, err) src := []byte(`hello, world!`) encryptedSrc, err := EcbEncrypt(pubKey1.Bytes()[:aesByteLen], src) assert.Nil(t, err) pubKeyMiddle, err := ComputeKey(key1.PubKey, keyMiddle.PriKey) assert.Nil(t, err) decryptedSrc, err := EcbDecrypt(pubKeyMiddle.Bytes()[:aesByteLen], encryptedSrc) assert.Nil(t, err) assert.Equal(t, string(src), string(decryptedSrc)) pubKeyMiddle, err = ComputeKey(key2.PubKey, keyMiddle.PriKey) assert.Nil(t, err) encryptedSrc, err = EcbEncrypt(pubKeyMiddle.Bytes()[:aesByteLen], decryptedSrc) assert.Nil(t, err) pubKey2, err := ComputeKey(keyMiddle.PubKey, key2.PriKey) assert.Nil(t, err) decryptedSrc, err = EcbDecrypt(pubKey2.Bytes()[:aesByteLen], encryptedSrc) assert.Nil(t, err) assert.Equal(t, string(src), string(decryptedSrc)) } func TestKeyBytes(t *testing.T) { var empty DhKey assert.Equal(t, 0, len(empty.Bytes())) key, err := GenerateKey() assert.Nil(t, err) assert.True(t, len(key.Bytes()) > 0) } func TestDHOnErrors(t *testing.T) { key, err := GenerateKey() assert.Nil(t, err) assert.NotEmpty(t, key.Bytes()) _, err = ComputeKey(key.PubKey, key.PriKey) assert.NoError(t, err) _, err = ComputeKey(nil, key.PriKey) assert.Error(t, err) _, err = ComputeKey(key.PubKey, nil) assert.Error(t, err) assert.NotNil(t, NewPublicKey([]byte(""))) }