package pki import ( "crypto/sha256" "github.com/dedis/kyber" "github.com/harmony-one/harmony/crypto" "github.com/harmony-one/harmony/log" ) // GetAddressFromPublicKey returns address given a public key. func GetAddressFromPublicKey(pubKey kyber.Point) [20]byte { bytes, err := pubKey.MarshalBinary() if err != nil { log.Error("Failed to serialize challenge") } address := [20]byte{} hash := sha256.Sum256(bytes) copy(address[:], hash[12:]) return address } // GetAddressFromPrivateKey returns address given a private key. func GetAddressFromPrivateKey(priKey kyber.Scalar) [20]byte { return GetAddressFromPublicKey(GetPublicKeyFromScalar(priKey)) } // GetAddressFromPrivateKeyBytes returns address from private key in bytes. func GetAddressFromPrivateKeyBytes(priKey [32]byte) [20]byte { return GetAddressFromPublicKey(GetPublicKeyFromScalar(crypto.Ed25519Curve.Scalar().SetBytes(priKey[:]))) } // GetAddressFromInt is the temporary helper function for benchmark use func GetAddressFromInt(value int) [20]byte { return GetAddressFromPublicKey(GetPublicKeyFromScalar(GetPrivateKeyScalarFromInt(value))) } // GetPrivateKeyScalarFromInt return private key scalar. func GetPrivateKeyScalarFromInt(value int) kyber.Scalar { return crypto.Ed25519Curve.Scalar().SetInt64(int64(value)) } // GetPrivateKeyFromInt returns private key in bytes given an interger. func GetPrivateKeyFromInt(value int) [32]byte { priKey, err := crypto.Ed25519Curve.Scalar().SetInt64(int64(value)).MarshalBinary() priKeyBytes := [32]byte{} if err == nil { copy(priKeyBytes[:], priKey[:]) } return priKeyBytes } // GetPublicKeyFromPrivateKey return public key from private key. func GetPublicKeyFromPrivateKey(priKey [32]byte) kyber.Point { suite := crypto.Ed25519Curve scalar := suite.Scalar() scalar.UnmarshalBinary(priKey[:]) return suite.Point().Mul(scalar, nil) } // GetPublicKeyFromScalar is the same as GetPublicKeyFromPrivateKey, but it directly works on kyber.Scalar object. func GetPublicKeyFromScalar(priKey kyber.Scalar) kyber.Point { return crypto.Ed25519Curve.Point().Mul(priKey, nil) } // GetBytesFromPublicKey converts public key point to bytes func GetBytesFromPublicKey(pubKey kyber.Point) [32]byte { bytes, err := pubKey.MarshalBinary() result := [32]byte{} if err == nil { copy(result[:], bytes) } return result }