func generateFromChecksum(in PrivateKeyDat, WIF string) PrivateKeyDat {
	var answer PrivateKeyDat
	answer.Error = in.Error

	answer.Priv2WIF = in.Priv2WIF
	answer.WIF2Priv = in.WIF2Priv
	answer.WIFChecksum = []string{}
	answer.Minikey = in.Minikey

	hex := mymath.Base582Hex(WIF)
	if mymath.Hex2Base58(hex) != mymath.Base58(WIF) {
		if answer.Error == "" {
			answer.Error = "Invalid Base58 encoding"
		}
		answer.WIFChecksum = []string{WIF, "", "", "", "", "", ""}
		return answer
	}
	answer.WIFChecksum = append(answer.WIFChecksum, WIF)
	answer.WIFChecksum = append(answer.WIFChecksum, mymath.Hex2Str(hex))
	answer.WIFChecksum = append(answer.WIFChecksum, mymath.Hex2Str(hex[0:len(hex)-4]))
	sha := mymath.SingleSHA(hex[0 : len(hex)-4])
	answer.WIFChecksum = append(answer.WIFChecksum, mymath.Hex2Str(sha))
	sha = mymath.SingleSHA(sha)
	answer.WIFChecksum = append(answer.WIFChecksum, mymath.Hex2Str(sha))
	answer.WIFChecksum = append(answer.WIFChecksum, mymath.Hex2Str(sha[0:4]))
	answer.WIFChecksum = append(answer.WIFChecksum, mymath.Hex2Str(hex[len(hex)-4:]))

	return answer
}
func generateFromPrivate(in PrivateKeyDat, Private string) PrivateKeyDat {
	var answer PrivateKeyDat
	answer.Error = in.Error

	answer.Priv2WIF = []string{}
	answer.WIF2Priv = in.WIF2Priv
	answer.WIFChecksum = in.WIFChecksum
	answer.Minikey = in.Minikey

	curve := bitelliptic.S256()
	if bitecdsa.CheckIsOnCurve(curve, mymath.Str2Big(Private)) == false {
		if answer.Error == "" {
			answer.Error = "Private key is not on curve"
		}
		answer.Priv2WIF = []string{Private, "", "", "", "", "", ""}
		return answer
	}
	priv := append([]byte{0x80}, mymath.Str2Hex(Private)...)
	answer.Priv2WIF = append(answer.Priv2WIF, Private)
	answer.Priv2WIF = append(answer.Priv2WIF, mymath.Hex2Str(priv))
	sha := mymath.SingleSHA(priv)
	answer.Priv2WIF = append(answer.Priv2WIF, mymath.Hex2Str(sha))
	sha = mymath.SingleSHA(sha)
	answer.Priv2WIF = append(answer.Priv2WIF, mymath.Hex2Str(sha))
	answer.Priv2WIF = append(answer.Priv2WIF, mymath.Hex2Str(sha[0:4]))
	priv = append(priv, sha[0:4]...)
	answer.Priv2WIF = append(answer.Priv2WIF, mymath.Hex2Str(priv))
	answer.Priv2WIF = append(answer.Priv2WIF, string(mymath.Hex2Base58(priv)))

	return answer
}
func generateFromWIF(in PrivateKeyDat, WIF string) PrivateKeyDat {
	var answer PrivateKeyDat
	answer.Error = in.Error

	answer.Priv2WIF = in.Priv2WIF
	answer.WIF2Priv = []string{}
	answer.WIFChecksum = in.WIFChecksum
	answer.Minikey = in.Minikey

	hex := mymath.Base582Hex(WIF)
	if mymath.Hex2Base58(hex) != mymath.Base58(WIF) {
		if answer.Error == "" {
			answer.Error = "Invalid Base58 encoding"
		}
		answer.WIF2Priv = []string{WIF, "", "", ""}
		return answer
	}
	answer.WIF2Priv = append(answer.WIF2Priv, WIF)
	answer.WIF2Priv = append(answer.WIF2Priv, mymath.Hex2Str(hex))
	answer.WIF2Priv = append(answer.WIF2Priv, mymath.Hex2Str(hex[0:len(hex)-4]))
	answer.WIF2Priv = append(answer.WIF2Priv, mymath.Hex2Str(hex[1:len(hex)-4]))

	return answer
}
Exemple #4
0
func addressTest(w http.ResponseWriter, r *http.Request) {
	c := appengine.NewContext(r)
	if r.FormValue("Random") != "" {
		var address AddressDat
		curve := bitelliptic.S256()
		priv, x, y, _ := curve.GenerateKey(rand.Reader)
		pub := append(append([]byte{0x04}, mymath.Big2HexWithMinimumLength(x, 32)...), mymath.Big2HexWithMinimumLength(y, 32)...)
		//pub=mymath.Str2Hex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f")

		st2 := mymath.SingleSHA(pub)
		st3 := mymath.Ripemd(st2)
		st4 := append([]byte{0x00}, st3[:]...)
		st5 := mymath.SingleSHA(st4)
		st6 := mymath.SingleSHA(st5)
		st7 := st6[0:4]
		st8 := append(st4[:], st7[:]...)
		st9 := mymath.Hex2Base58(st8)

		address.HashString = []string{
			mymath.Hex2Str(priv),
			mymath.Hex2Str(pub),
			mymath.Hex2Str(st2),
			mymath.Hex2Str(st3),
			mymath.Hex2Str(st4),
			mymath.Hex2Str(st5),
			mymath.Hex2Str(st6),
			mymath.Hex2Str(st7),
			mymath.Hex2Str(st8),
			string(st9)}
		AddressTestTemplate.Execute(w, address)

	} else if r.FormValue("private") != "" {
		var err error
		var address AddressDat
		curve := bitelliptic.S256()
		privs, err := bitecdsa.GenerateFromPrivateKey(mymath.Str2Big(r.FormValue("private")), curve)
		if err != nil {
			if err.Error() == "Private key is not on curve" {
				address = DefaultAddress
				address.Error = "Private key is not on curve"
				AddressTestTemplate.Execute(w, address)
			} else {
				c.Errorf("Err ", err)
				return
			}
		} else {
			priv := mymath.Big2Hex(privs.D)
			x := privs.PublicKey.X
			y := privs.PublicKey.Y
			//priv, x, y, _:=curve.GenerateKey(rand.Reader)
			pub := append(append([]byte{0x04}, mymath.Big2HexWithMinimumLength(x, 32)...), mymath.Big2HexWithMinimumLength(y, 32)...)

			st2 := mymath.SingleSHA(pub)
			st3 := mymath.Ripemd(st2)
			st4 := append([]byte{0x00}, st3[:]...)
			st5 := mymath.SingleSHA(st4)
			st6 := mymath.SingleSHA(st5)
			st7 := st6[0:4]
			st8 := append(st4[:], st7[:]...)
			st9 := mymath.Hex2Base58(st8)

			address.HashString = []string{
				mymath.Hex2Str(priv),
				mymath.Hex2Str(pub),
				mymath.Hex2Str(st2),
				mymath.Hex2Str(st3),
				mymath.Hex2Str(st4),
				mymath.Hex2Str(st5),
				mymath.Hex2Str(st6),
				mymath.Hex2Str(st7),
				mymath.Hex2Str(st8),
				string(st9)}
			AddressTestTemplate.Execute(w, address)
		}

	} else if r.FormValue("public") != "" {
		var address AddressDat

		pub := mymath.Str2Hex(r.FormValue("public"))
		if len(pub) != 65 {
			address.Error = "Invalid public key length"
		} else if pub[0] != 0x04 {
			address.Error = "Invalid public key format"
		}

		st2 := mymath.SingleSHA(pub)
		st3 := mymath.Ripemd(st2)
		st4 := append([]byte{0x00}, st3[:]...)
		st5 := mymath.SingleSHA(st4)
		st6 := mymath.SingleSHA(st5)
		st7 := st6[0:4]
		st8 := append(st4[:], st7[:]...)
		st9 := mymath.Hex2Base58(st8)

		address.HashString = []string{
			"",
			mymath.Hex2Str(pub),
			mymath.Hex2Str(st2),
			mymath.Hex2Str(st3),
			mymath.Hex2Str(st4),
			mymath.Hex2Str(st5),
			mymath.Hex2Str(st6),
			mymath.Hex2Str(st7),
			mymath.Hex2Str(st8),
			string(st9)}
		AddressTestTemplate.Execute(w, address)
	} else if r.FormValue("RIPEMD") != "" {
		var address AddressDat

		st3 := mymath.Str2Hex(r.FormValue("RIPEMD"))
		if len(st3) != 20 {
			address.Error = "Invalid RIPEMD-160 length"
		}

		st4 := append([]byte{0x00}, st3[:]...)
		st5 := mymath.SingleSHA(st4)
		st6 := mymath.SingleSHA(st5)
		st7 := st6[0:4]
		st8 := append(st4[:], st7[:]...)
		st9 := mymath.Hex2Base58(st8)

		address.HashString = []string{
			"", "", "",
			mymath.Hex2Str(st3),
			mymath.Hex2Str(st4),
			mymath.Hex2Str(st5),
			mymath.Hex2Str(st6),
			mymath.Hex2Str(st7),
			mymath.Hex2Str(st8),
			string(st9)}
		AddressTestTemplate.Execute(w, address)
	} else if r.FormValue("RIPEMDWithHash") != "" {
		var address AddressDat

		st4 := mymath.Str2Hex(r.FormValue("RIPEMDWithHash"))
		if len(st4) != 21 {
			address.Error = "Invalid RIPEMD-160 length"
		}
		st3 := st4[1:]
		st5 := mymath.SingleSHA(st4)
		st6 := mymath.SingleSHA(st5)
		st7 := st6[0:4]
		st8 := append(st4[:], st7[:]...)
		st9 := mymath.Hex2Base58(st8)

		address.HashString = []string{
			"", "", "",
			mymath.Hex2Str(st3),
			mymath.Hex2Str(st4),
			mymath.Hex2Str(st5),
			mymath.Hex2Str(st6),
			mymath.Hex2Str(st7),
			mymath.Hex2Str(st8),
			string(st9)}
		AddressTestTemplate.Execute(w, address)
	} else if r.FormValue("FullAddress") != "" {
		var address AddressDat

		st8 := mymath.Str2Hex(r.FormValue("FullAddress"))
		if len(st8) != 25 {
			address.Error = "Invalid address length"
			c.Debugf("%d", len(st8))
		}

		st3 := st8[1:21]
		st4 := append([]byte{0x00}, st3[:]...)
		st5 := mymath.SingleSHA(st4)
		st6 := mymath.SingleSHA(st5)
		st7 := st6[0:4]
		//st8:=append(st4[:], st7[:]...)
		st9 := mymath.Hex2Base58(st8)
		if len(st8) == 25 {
			if st7[3] != st8[24] || st7[2] != st8[23] || st7[1] != st8[22] || st7[0] != st8[21] {
				address.Error = "Invalid checksum"
			}
		}

		address.HashString = []string{
			"", "", "",
			mymath.Hex2Str(st3),
			mymath.Hex2Str(st4),
			mymath.Hex2Str(st5),
			mymath.Hex2Str(st6),
			mymath.Hex2Str(st7),
			mymath.Hex2Str(st8),
			string(st9)}
		AddressTestTemplate.Execute(w, address)
	} else if r.FormValue("Base58") != "" {
		var address AddressDat

		st9 := r.FormValue("Base58")
		st8 := mymath.Base582Hex(st9)
		if len(st8) != 25 {
			address.Error = "Invalid address length"
			c.Debugf("%d", len(st8))
		}

		st3 := st8[1:21]
		st4 := append([]byte{0x00}, st3[:]...)
		st5 := mymath.SingleSHA(st4)
		st6 := mymath.SingleSHA(st5)
		st7 := st6[0:4]
		//st8:=append(st4[:], st7[:]...)
		//st9:=mymath.Hex2Base58(st8)
		if len(st8) == 25 {
			if st7[3] != st8[24] || st7[2] != st8[23] || st7[1] != st8[22] || st7[0] != st8[21] {
				address.Error = "Invalid checksum"
			}
		}

		address.HashString = []string{
			"", "", "",
			mymath.Hex2Str(st3),
			mymath.Hex2Str(st4),
			mymath.Hex2Str(st5),
			mymath.Hex2Str(st6),
			mymath.Hex2Str(st7),
			mymath.Hex2Str(st8),
			string(st9)}
		AddressTestTemplate.Execute(w, address)
	} else {
		AddressTestTemplate.Execute(w, DefaultAddress)
	}

}