//recovers the public key from the signature //recovery of pubkey means correct signature func RecoverPubkey(msg []byte, sig []byte) []byte { if len(sig) != 65 { log.Panic() } var pubkey []byte = make([]byte, 33) var msg_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&msg[0])) var sig_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&sig[0])) var pubkey_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&pubkey[0])) var pubkeylen C.int ret := C.secp256k1_ecdsa_recover_compact( msg_ptr, C.int(len(msg)), sig_ptr, pubkey_ptr, &pubkeylen, C.int(1), C.int(sig[64]), ) if ret == 0 || int(pubkeylen) != 33 { return nil } return pubkey }
//recovers the public key from the signature //recovery of pubkey means correct signature func RecoverPubkey(msg []byte, sig []byte) ([]byte, error) { if len(sig) != 65 { return nil, errors.New("Invalid signature length") } var pubkey []byte = make([]byte, 65) var msg_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&msg[0])) var sig_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&sig[0])) var pubkey_ptr *C.uchar = (*C.uchar)(unsafe.Pointer(&pubkey[0])) var pubkeylen C.int ret := C.secp256k1_ecdsa_recover_compact( msg_ptr, sig_ptr, pubkey_ptr, &pubkeylen, C.int(0), C.int(sig[64]), ) if ret == C.int(0) { return nil, errors.New("Failed to recover public key") } else if pubkeylen != C.int(65) { return nil, errors.New("Impossible Error: Invalid recovered public key length") } else { return pubkey, nil } return nil, errors.New("Impossible Error: func RecoverPubkey has reached an unreachable state") }