func GenerateKeyPair() ([]byte, []byte) { var seckey []byte = randentropy.GetEntropyCSPRNG(32) var seckey_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&seckey[0])) var pubkey64 []byte = make([]byte, 64) // secp256k1_pubkey var pubkey65 []byte = make([]byte, 65) // 65 byte uncompressed pubkey pubkey64_ptr := (*C.secp256k1_pubkey)(unsafe.Pointer(&pubkey64[0])) pubkey65_ptr := (*C.uchar)(unsafe.Pointer(&pubkey65[0])) ret := C.secp256k1_ec_pubkey_create( context, pubkey64_ptr, seckey_ptr, ) if ret != C.int(1) { return GenerateKeyPair() // invalid secret, try again } var output_len C.size_t C.secp256k1_ec_pubkey_serialize( // always returns 1 context, pubkey65_ptr, &output_len, pubkey64_ptr, 0, // SECP256K1_EC_COMPRESSED ) return pubkey65, seckey }
func Pubkey_create(seckey [32]byte, compressed bool) ([]byte, bool) { comp := C.int(0) bufsize := 65 if compressed { comp = 1 bufsize = 33 } pubkey := make([]C.uchar, bufsize) pubkeylen := C.int(0) success := C.secp256k1_ec_pubkey_create(&pubkey[0], &pubkeylen, cBuf(seckey[:]), comp) return C.GoBytes(unsafe.Pointer(&pubkey[0]), pubkeylen), goBool(success) }
func GenerateKeyPair() ([]byte, []byte) { pubkey_len := C.int(65) const seckey_len = 32 var pubkey []byte = make([]byte, pubkey_len) var seckey []byte = randentropy.GetEntropyCSPRNG(seckey_len) var pubkey_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&pubkey[0])) var seckey_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&seckey[0])) ret := C.secp256k1_ec_pubkey_create( pubkey_ptr, &pubkey_len, seckey_ptr, 0) if ret != C.int(1) { return GenerateKeyPair() //invalid secret, try again } return pubkey, seckey }
func GeneratePubKey(seckey []byte) ([]byte, error) { if err := VerifySeckeyValidity(seckey); err != nil { return nil, err } var pubkey []byte = make([]byte, 64) var pubkey_ptr *C.secp256k1_pubkey = (*C.secp256k1_pubkey)(unsafe.Pointer(&pubkey[0])) var seckey_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&seckey[0])) ret := C.secp256k1_ec_pubkey_create( context, pubkey_ptr, seckey_ptr, ) if ret != C.int(1) { return nil, errors.New("Unable to generate pubkey from seckey") } return pubkey, nil }
func GenerateKeyPair() ([]byte, []byte) { pubkey_len := C.int(65) const seckey_len = 32 var pubkey []byte = make([]byte, pubkey_len) var seckey []byte = randentropy.GetEntropyCSPRNG(seckey_len) var pubkey_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&pubkey[0])) var seckey_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&seckey[0])) ret := C.secp256k1_ec_pubkey_create( pubkey_ptr, &pubkey_len, seckey_ptr, 0) // uncompressed // or, see randFieldElement at https://golang.org/src/crypto/ecdsa/ecdsa.go#61 // apparently not *every* 256 bit int is on the curve // XXX: is this the same as validating the privkey before calling create? if ret != C.int(1) { return GenerateKeyPair() //invalid secret, try again } return pubkey, seckey }