code: func RecoverCompact(curve *KoblitzCurve, signature,
  	hash []byte) (*PublicKey, bool, error) {
  	bitlen := (curve.BitSize + 7) / 8
  	if len(signature) != 1+bitlen*2 {
  		return nil, false, errors.New("invalid compact signature size")
  	}
  
  	iteration := int((signature[0] - 27) & ^byte(4))
  
  	// format is <header byte><bitlen R><bitlen S>
  	sig := &Signature{
  		R: new(big.Int).SetBytes(signature[1 : bitlen+1]),
  		S: new(big.Int).SetBytes(signature[bitlen+1:]),
  	}
  	// The iteration used here was encoded
  	key, err := recoverKeyFromSignature(curve, sig, hash, iteration, false)
  	if err != nil {
  		return nil, false, err
  	}
  
  	return key, ((signature[0] - 27) & 4) == 4, nil
  }
docs: // RecoverCompact verifies the compact signature "signature" of "hash" for the
  // Koblitz curve in "curve". If the signature matches then the recovered public
  // key will be returned as well as a boolen if the original key was compressed
  // or not, else an error will be returned.