// bigIntToNetIPv6 is a helper function that correctly returns a net.IP with the // correctly padded values. func bigIntToNetIPv6(bi *big.Int) *net.IP { x := make(net.IP, IPv6len) ipv6Bytes := bi.Bytes() // It's possibe for ipv6Bytes to be less than IPv6len bytes in size. If // they are different sizes we to pad the size of response. if len(ipv6Bytes) < IPv6len { buf := new(bytes.Buffer) buf.Grow(IPv6len) for i := len(ipv6Bytes); i < IPv6len; i++ { if err := binary.Write(buf, binary.BigEndian, byte(0)); err != nil { panic(fmt.Sprintf("Unable to pad byte %d of input %v: %v", i, bi, err)) } } for _, b := range ipv6Bytes { if err := binary.Write(buf, binary.BigEndian, b); err != nil { panic(fmt.Sprintf("Unable to preserve endianness of input %v: %v", bi, err)) } } ipv6Bytes = buf.Bytes() } i := copy(x, ipv6Bytes) if i != IPv6len { panic("IPv6 wrong size") } return &x }
// Appends to data the first (len(data) / 32)bits of the result of sha256(data) // Currently only supports data up to 32 bytes func addChecksum(data []byte) []byte { // Get first byte of sha256 hasher := sha256.New() hasher.Write(data) hash := hasher.Sum(nil) firstChecksumByte := hash[0] // len() is in bytes so we divide by 4 checksumBitLength := uint(len(data) / 4) // For each bit of check sum we want we shift the data one the left // and then set the (new) right most bit equal to checksum bit at that index // staring from the left dataBigInt := new(big.Int).SetBytes(data) for i := uint(0); i < checksumBitLength; i++ { // Bitshift 1 left dataBigInt.Mul(dataBigInt, BigTwo) // Set rightmost bit if leftmost checksum bit is set if uint8(firstChecksumByte&(1<<(7-i))) > 0 { dataBigInt.Or(dataBigInt, BigOne) } } return dataBigInt.Bytes() }
// privateEncrypt implements OpenSSL's RSA_private_encrypt function func privateEncrypt(key *rsa.PrivateKey, data []byte) (enc []byte, err error) { k := (key.N.BitLen() + 7) / 8 tLen := len(data) // rfc2313, section 8: // The length of the data D shall not be more than k-11 octets if tLen > k-11 { err = errors.New("Data too long") return } em := make([]byte, k) em[1] = 1 for i := 2; i < k-tLen-1; i++ { em[i] = 0xff } copy(em[k-tLen:k], data) c := new(big.Int).SetBytes(em) if c.Cmp(key.N) > 0 { err = nil return } var m *big.Int var ir *big.Int if key.Precomputed.Dp == nil { m = new(big.Int).Exp(c, key.D, key.N) } else { // We have the precalculated values needed for the CRT. m = new(big.Int).Exp(c, key.Precomputed.Dp, key.Primes[0]) m2 := new(big.Int).Exp(c, key.Precomputed.Dq, key.Primes[1]) m.Sub(m, m2) if m.Sign() < 0 { m.Add(m, key.Primes[0]) } m.Mul(m, key.Precomputed.Qinv) m.Mod(m, key.Primes[0]) m.Mul(m, key.Primes[1]) m.Add(m, m2) for i, values := range key.Precomputed.CRTValues { prime := key.Primes[2+i] m2.Exp(c, values.Exp, prime) m2.Sub(m2, m) m2.Mul(m2, values.Coeff) m2.Mod(m2, prime) if m2.Sign() < 0 { m2.Add(m2, prime) } m2.Mul(m2, values.R) m.Add(m, m2) } } if ir != nil { // Unblind. m.Mul(m, ir) m.Mod(m, key.N) } enc = m.Bytes() return }
func (ka *dheKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) { var q *big.Int if p := config.Bugs.DHGroupPrime; p != nil { ka.p = p ka.g = big.NewInt(2) q = p } else { // 2048-bit MODP Group with 256-bit Prime Order Subgroup (RFC // 5114, Section 2.3) ka.p, _ = new(big.Int).SetString("87A8E61DB4B6663CFFBBD19C651959998CEEF608660DD0F25D2CEED4435E3B00E00DF8F1D61957D4FAF7DF4561B2AA3016C3D91134096FAA3BF4296D830E9A7C209E0C6497517ABD5A8A9D306BCF67ED91F9E6725B4758C022E0B1EF4275BF7B6C5BFC11D45F9088B941F54EB1E59BB8BC39A0BF12307F5C4FDB70C581B23F76B63ACAE1CAA6B7902D52526735488A0EF13C6D9A51BFA4AB3AD8347796524D8EF6A167B5A41825D967E144E5140564251CCACB83E6B486F6B3CA3F7971506026C0B857F689962856DED4010ABD0BE621C3A3960A54E710C375F26375D7014103A4B54330C198AF126116D2276E11715F693877FAD7EF09CADB094AE91E1A1597", 16) ka.g, _ = new(big.Int).SetString("3FB32C9B73134D0B2E77506660EDBD484CA7B18F21EF205407F4793A1A0BA12510DBC15077BE463FFF4FED4AAC0BB555BE3A6C1B0C6B47B1BC3773BF7E8C6F62901228F8C28CBB18A55AE31341000A650196F931C77A57F2DDF463E5E9EC144B777DE62AAAB8A8628AC376D282D6ED3864E67982428EBC831D14348F6F2F9193B5045AF2767164E1DFC967C1FB3F2E55A4BD1BFFE83B9C80D052B985D182EA0ADB2A3B7313D3FE14C8484B1E052588B9B7D2BBD2DF016199ECD06E1557CD0915B3353BBB64E0EC377FD028370DF92B52C7891428CDC67EB6184B523D1DB246C32F63078490F00EF8D647D148D47954515E2327CFEF98C582664B4C0F6CC41659", 16) q, _ = new(big.Int).SetString("8CF83642A709A097B447997640129DA299B1A47D1EB3750BA308B0FE64F5FBD3", 16) } var err error ka.xOurs, err = rand.Int(config.rand(), q) if err != nil { return nil, err } yOurs := new(big.Int).Exp(ka.g, ka.xOurs, ka.p) // http://tools.ietf.org/html/rfc5246#section-7.4.3 pBytes := ka.p.Bytes() gBytes := ka.g.Bytes() yBytes := yOurs.Bytes() serverDHParams := make([]byte, 0, 2+len(pBytes)+2+len(gBytes)+2+len(yBytes)) serverDHParams = append(serverDHParams, byte(len(pBytes)>>8), byte(len(pBytes))) serverDHParams = append(serverDHParams, pBytes...) serverDHParams = append(serverDHParams, byte(len(gBytes)>>8), byte(len(gBytes))) serverDHParams = append(serverDHParams, gBytes...) serverDHParams = append(serverDHParams, byte(len(yBytes)>>8), byte(len(yBytes))) serverDHParams = append(serverDHParams, yBytes...) return ka.auth.signParameters(config, cert, clientHello, hello, serverDHParams) }
// Sign signs an arbitrary length hash (which should be the result of hashing a // larger message) using the private key, priv. It returns the signature as a // pair of integers. The security of the private key depends on the entropy of // rand. func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error) { // See [NSA] 3.4.1 c := priv.PublicKey.Curve N := c.Params().N var k, kInv *big.Int for { for { k, err = randFieldElement(c, rand) if err != nil { r = nil return } kInv = new(big.Int).ModInverse(k, N) r, _ = priv.Curve.ScalarBaseMult(k.Bytes()) r.Mod(r, N) if r.Sign() != 0 { break } } e := hashToInt(hash, c) s = new(big.Int).Mul(priv.D, r) s.Add(s, e) s.Mul(s, kInv) s.Mod(s, N) if s.Sign() != 0 { break } } return }
func makeBigInt(n *big.Int) (encoder, error) { if n == nil { return nil, StructuralError{"empty integer"} } if n.Sign() < 0 { // A negative number has to be converted to two's-complement // form. So we'll invert and subtract 1. If the // most-significant-bit isn't set then we'll need to pad the // beginning with 0xff in order to keep the number negative. nMinus1 := new(big.Int).Neg(n) nMinus1.Sub(nMinus1, bigOne) bytes := nMinus1.Bytes() for i := range bytes { bytes[i] ^= 0xff } if len(bytes) == 0 || bytes[0]&0x80 == 0 { return multiEncoder([]encoder{byteFFEncoder, bytesEncoder(bytes)}), nil } return bytesEncoder(bytes), nil } else if n.Sign() == 0 { // Zero is written as a single 0 zero rather than no bytes. return byte00Encoder, nil } else { bytes := n.Bytes() if len(bytes) > 0 && bytes[0]&0x80 != 0 { // We'll have to pad this with 0x00 in order to stop it // looking like a negative number. return multiEncoder([]encoder{byte00Encoder, bytesEncoder(bytes)}), nil } return bytesEncoder(bytes), nil } }
/*公钥解密*/ func pubKeyDecrypt(pub *rsa.PublicKey, data []byte) ([]byte, error) { k := (pub.N.BitLen() + 7) / 8 if k != len(data) { return nil, ErrDataLen } m := new(big.Int).SetBytes(data) if m.Cmp(pub.N) > 0 { return nil, ErrDataToLarge } m.Exp(m, big.NewInt(int64(pub.E)), pub.N) d := leftPad(m.Bytes(), k) if d[0] != 0 { return nil, ErrDataBroken } if d[1] != 0 && d[1] != 1 { return nil, ErrKeyPairDismatch } var i = 2 for ; i < len(d); i++ { if d[i] == 0 { break } } i++ if i == len(d) { return nil, nil } return d[i:], nil }
func TestP256BaseMult(t *testing.T) { p256 := P256() p256Generic := p256.Params() scalars := make([]*big.Int, 0, len(p224BaseMultTests)+1) for _, e := range p224BaseMultTests { k, _ := new(big.Int).SetString(e.k, 10) scalars = append(scalars, k) } k := new(big.Int).SetInt64(1) k.Lsh(k, 500) scalars = append(scalars, k) for i, k := range scalars { x, y := p256.ScalarBaseMult(k.Bytes()) x2, y2 := p256Generic.ScalarBaseMult(k.Bytes()) if x.Cmp(x2) != 0 || y.Cmp(y2) != 0 { t.Errorf("#%d: got (%x, %x), want (%x, %x)", i, x, y, x2, y2) } if testing.Short() && i > 5 { break } } }
// Compile instruction // // Attempts to compile and parse the given instruction in "s" // and returns the byte sequence func CompileInstr(s interface{}) ([]byte, error) { switch s.(type) { case string: str := s.(string) isOp := IsOpCode(str) if isOp { return []byte{OpCodes[str]}, nil } // Check for pre formatted byte array // Jumps are preformatted if []byte(str)[0] == 0 { return []byte(str), nil } num := new(big.Int) _, success := num.SetString(str, 0) // Assume regular bytes during compilation if !success { num.SetBytes([]byte(str)) } return num.Bytes(), nil case int: //num := bigToBytes(big.NewInt(int64(s.(int))), 256) return big.NewInt(int64(s.(int))).Bytes(), nil case []byte: return new(big.Int).SetBytes(s.([]byte)).Bytes(), nil } return nil, nil }
func EncodePublicKey(x, y *big.Int, compressed bool) ([]byte, error) { var pubkey []byte if compressed { pubkey = make([]byte, 33) pubkey[0] = 2 + byte(y.Bit(0)) } else { pubkey = make([]byte, 65) pubkey[0] = 4 } // Right-align x coordinate bytes := x.Bytes() if len(bytes) > 32 { return nil, fmt.Errorf("Value of x has > 32 bytes") } copy(pubkey[1+(32-len(bytes)):33], bytes) if !compressed { // Right-align y coordinate bytes = y.Bytes() if len(bytes) > 32 { return nil, fmt.Errorf("Value of y has > 32 bytes") } copy(pubkey[33+(32-len(bytes)):65], bytes) } return pubkey, nil }
// Converts a number to a binary byte slice // i.e. 4 => [0,0,0,4] // 256 => [0,0,1,0] // or in the case of 64 // 4 = > [0,0,0,0,0,0,0,4] func makeBinary(value interface{}) []byte { var z []byte var val uint64 amount := 4 if v, ok := value.(uint64); ok { amount = 8 val = v } else if v, ok := value.(uint32); ok { val = uint64(v) } else { log.Panic("makeBinary requires a value that's either a uint32 or an uint64, got:", value) } str := strconv.FormatUint(val, 10) number := new(big.Int) number.SetString(str, 10) template := make([]byte, amount) x := number.Bytes() z = append(template[:(amount-len(x))], x...) return z }
func wipeBigInt(k *big.Int) { if k == nil { return } k.SetBytes(zeroes(len(k.Bytes()))) }
// powerOffset computes the offset by (n + 2^exp) % (2^mod) func powerOffset(id []byte, exp int, mod int) []byte { // Copy the existing slice off := make([]byte, len(id)) copy(off, id) // Convert the ID to a bigint idInt := big.Int{} idInt.SetBytes(id) // Get the offset two := big.NewInt(2) offset := big.Int{} offset.Exp(two, big.NewInt(int64(exp)), nil) // Sum sum := big.Int{} sum.Add(&idInt, &offset) // Get the ceiling ceil := big.Int{} ceil.Exp(two, big.NewInt(int64(mod)), nil) // Apply the mod idInt.Mod(&sum, &ceil) // Add together return idInt.Bytes() }
func Unblind(key *rsa.PublicKey, blindedSig, unblinder []byte) []byte { m := new(big.Int).SetBytes(blindedSig) unblinderBig := new(big.Int).SetBytes(unblinder) m.Mul(m, unblinderBig) m.Mod(m, key.N) return m.Bytes() }
func SendToConn(data []byte, conn *net.TCPConn, path *big.Int) { // making variable for combining send data var ( err tree_lib.TreeError path_len_data = make([]byte, 4) msg_len_data = make([]byte, 4) path_data = path.Bytes() path_len = uint32(len(path_data)) buf = bytes.Buffer{} ) err.From = tree_lib.FROM_SEND_TO_CONN binary.LittleEndian.PutUint32(path_len_data, path_len) binary.LittleEndian.PutUint32(msg_len_data, path_len+uint32(len(data))+uint32(4)) buf.Write(msg_len_data) buf.Write(path_len_data) buf.Write(path_data) buf.Write(data) if conn != nil { _, err.Err = conn.Write(buf.Bytes()) if !err.IsNull() { tree_log.Error(err.From, fmt.Sprintf("Error sending data to path [%s]", path.String()), err.Error()) } } buf.Reset() }
// countBits returns the number of set bits in n func countBits(n *big.Int) int { var count int = 0 for _, b := range n.Bytes() { count += int(bitCounts[b]) } return count }
func (dag *Dagger) Eval(N *big.Int) *big.Int { pow := common.BigPow(2, 26) dag.xn = pow.Div(N, pow) sha := sha3.NewKeccak256() sha.Reset() ret := new(big.Int) for k := 0; k < 4; k++ { d := sha3.NewKeccak256() b := new(big.Int) d.Reset() d.Write(dag.hash.Bytes()) d.Write(dag.xn.Bytes()) d.Write(N.Bytes()) d.Write(big.NewInt(int64(k)).Bytes()) b.SetBytes(Sum(d)) pk := (b.Uint64() & 0x1ffffff) sha.Write(dag.Node(9, pk).Bytes()) } return ret.SetBytes(Sum(sha)) }
// Put implements storage.Contacts. func (c *contacts) Put(name string, key *sf.PublicKey) error { if len(name) == 0 { return errgo.New("empty key name") } return c.db.Update(func(tx *bolt.Tx) error { contactsBucket, err := tx.CreateBucketIfNotExists([]byte("contacts")) if err != nil { return errgo.Mask(err) } err = contactsBucket.Put(key[:], []byte(name)) if err != nil { return errgo.Mask(err) } keysBucket, err := contactsBucket.CreateBucketIfNotExists([]byte(name)) if err != nil { return errgo.Mask(err) } lastSeqBytes, _ := keysBucket.Cursor().Last() var seq big.Int seq.SetBytes(lastSeqBytes) seq.Add(&seq, bigOne) err = keysBucket.Put(seq.Bytes(), key[:]) if err != nil { return errgo.Mask(err) } return nil }) }
// BigAffineToField takes an affine point (x, y) as big integers and converts // it to an affine point as field values. func (curve *KoblitzCurve) BigAffineToField(x, y *big.Int) (*FieldVal, *FieldVal) { x3, y3 := new(FieldVal), new(FieldVal) x3.SetByteSlice(x.Bytes()) y3.SetByteSlice(y.Bytes()) return x3, y3 }
// Sign creates a signature on the hash under the given secret key. func Sign(sk *eckey.SecretKey, hash []byte) (*Signature, error) { // Generate random nonce nonce: k, kG, err := eckey.GenerateKeyPair() if err != nil { return nil, err } // Try again if kG is nil (point at infinity) if kG == nil { goto nonce } // Clear nonce after completion defer k.Zero() // Compute non-interactive challenge e := util.Hash256d(append([]byte(hash), kG[:]...)) kInt := new(big.Int).SetBytes(k[:]) eInt := new(big.Int).SetBytes(e[:]) rInt := new(big.Int).SetBytes(sk[:]) // Compute s = k - er s := new(big.Int) s.Mul(eInt, rInt) s.Sub(kInt, s) s.Mod(s, eckey.S256.N) // Serialize signature sig := new(Signature) copy(sig[:SignatureSize/2], e[:]) util.PaddedCopy(sig[SignatureSize/2:], s.Bytes(), SignatureSize/2) return sig, nil }
// Generates and opens a temporary file with a defined prefix and suffix // This is the same api as ioutil.TempFile accept it accepts a suffix // TODO: see if this is too slow func TempFile(dir, prefix string, suffix string) (f *os.File, err error) { if dir == "" { dir = os.TempDir() } // The maximum size of random file count // TODO: see if we can do this at package scope somehow var maxRand *big.Int = big.NewInt(0) maxRand.SetString("FFFFFFFFFFFFFFFF", 16) var randNum *big.Int for i := 0; i < 10000; i++ { // Generate random part of the path name randNum, err = rand.Int(rand.Reader, maxRand) if err != nil { return } // Transform to an int randString := hex.EncodeToString(randNum.Bytes()) // Attempt to open file and fail if it already exists name := filepath.Join(dir, prefix+randString+suffix) f, err = os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) if os.IsExist(err) { continue } break } return }
// Decrypt takes two integers, resulting from an ElGamal encryption, and // returns the plaintext of the message. An error can result only if the // ciphertext is invalid. Users should keep in mind that this is a padding // oracle and thus, if exposed to an adaptive chosen ciphertext attack, can // be used to break the cryptosystem. See ``Chosen Ciphertext Attacks // Against Protocols Based on the RSA Encryption Standard PKCS #1'', Daniel // Bleichenbacher, Advances in Cryptology (Crypto '98), func Decrypt(priv *PrivateKey, c1, c2 *big.Int) (msg []byte, err error) { s := new(big.Int).Exp(c1, priv.X, priv.P) s.ModInverse(s, priv.P) s.Mul(s, c2) s.Mod(s, priv.P) em := s.Bytes() firstByteIsTwo := subtle.ConstantTimeByteEq(em[0], 2) // The remainder of the plaintext must be a string of non-zero random // octets, followed by a 0, followed by the message. // lookingForIndex: 1 iff we are still looking for the zero. // index: the offset of the first zero byte. var lookingForIndex, index int lookingForIndex = 1 for i := 1; i < len(em); i++ { equals0 := subtle.ConstantTimeByteEq(em[i], 0) index = subtle.ConstantTimeSelect(lookingForIndex&equals0, i, index) lookingForIndex = subtle.ConstantTimeSelect(equals0, 0, lookingForIndex) } if firstByteIsTwo != 1 || lookingForIndex != 0 || index < 9 { return nil, errors.New("elgamal: decryption error") } return em[index+1:], nil }
func getWorkPackage(difficulty *big.Int) string { if currWork == nil { return getErrorResponse("Current work unavailable") } // Our response object response := &ResponseArray{ Id: currWork.Id, Jsonrpc: currWork.Jsonrpc, Result: currWork.Result[:], } // Calculte requested difficulty diff := new(big.Int).Div(pow256, difficulty) diffBytes := string(common.ToHex(diff.Bytes())) // Adjust the difficulty for the miner response.Result[2] = diffBytes // Convert respone object to JSON b, _ := json.Marshal(response) return string(b) }
// writeIntPadded writes x into b, padded up with leading zeros as // needed. func writeIntPadded(b []byte, x *big.Int) { for i := range b { b[i] = 0 } xb := x.Bytes() copy(b[len(b)-len(xb):], xb) }
// returns a formatted MIP mapped key by adding prefix, canonical number and level // // ex. fn(98, 1000) = (prefix || 1000 || 0) func mipmapKey(num, level uint64) []byte { lkey := make([]byte, 8) binary.BigEndian.PutUint64(lkey, level) key := new(big.Int).SetUint64(num / level * level) return append(mipmapPre, append(lkey, key.Bytes()...)...) }
func NewOcCredLoadFromFile(filename string) (*OcCred, error) { if filename == "" { filename = PRIVATE_KEY_FILENAME } file, err := util.GetAppData(filename) if err != nil { return nil, fmt.Errorf("error getting app data: %v", err.Error()) } var d big.Int fmt.Fscanf(file, "%x\n", &d) curve := elliptic.P256() x, y := curve.ScalarBaseMult(d.Bytes()) priv := ecdsa.PrivateKey{ PublicKey: ecdsa.PublicKey{ Curve: curve, X: x, Y: y, }, D: &d, } ocCred := OcCred{ Priv: &priv, } return &ocCred, nil }
// BigIntToEncodedBytes converts a big integer into its corresponding // 32 byte little endian representation. func BigIntToEncodedBytes(a *big.Int) *[32]byte { s := new([32]byte) if a == nil { return s } // Caveat: a can be longer than 32 bytes. aB := a.Bytes() // If we have a short byte string, expand // it so that it's long enough. aBLen := len(aB) if aBLen < fieldIntSize { diff := fieldIntSize - aBLen for i := 0; i < diff; i++ { aB = append([]byte{0x00}, aB...) } } for i := 0; i < fieldIntSize; i++ { s[i] = aB[i] } // Reverse the byte string --> little endian after // encoding. reverse(s) return s }
func DecodeBase58(ba []byte) []byte { if len(ba) == 0 { return nil } x := new(big.Int) y := big.NewInt(58) z := new(big.Int) for _, b := range ba { v := strings.IndexRune(base58, rune(b)) z.SetInt64(int64(v)) x.Mul(x, y) x.Add(x, z) } xa := x.Bytes() // Restore leading zeros i := 0 for i < len(ba) && ba[i] == '1' { i++ } ra := make([]byte, i+len(xa)) copy(ra[i:], xa) return ra }
func CompileInstr(s interface{}) ([]byte, error) { switch s.(type) { case string: str := s.(string) isOp := IsOpCode(str) if isOp { return []byte{OpCodes[str]}, nil } num := new(big.Int) _, success := num.SetString(str, 0) // Assume regular bytes during compilation if !success { num.SetBytes([]byte(str)) } return num.Bytes(), nil case int: return big.NewInt(int64(s.(int))).Bytes(), nil case []byte: return BigD(s.([]byte)).Bytes(), nil } return nil, nil }
// (n - 2^(k-1)) mod 2^m func calcLastFinger(n []byte, k int) (string, []byte) { // convert the n to a bigint nBigInt := big.Int{} nBigInt.SetBytes(n) // get the right addend, i.e. 2^(k-1) two := big.NewInt(2) addend := big.Int{} addend.Exp(two, big.NewInt(int64(k-1)), nil) addend.Mul(&addend, big.NewInt(-1)) //Soustraction neg := big.Int{} neg.Add(&addend, &nBigInt) // calculate 2^m m := 160 ceil := big.Int{} ceil.Exp(two, big.NewInt(int64(m)), nil) // apply the mod result := big.Int{} result.Mod(&neg, &ceil) resultBytes := result.Bytes() resultHex := fmt.Sprintf("%x", resultBytes) return resultHex, resultBytes }