-
Notifications
You must be signed in to change notification settings - Fork 36
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
feabf13
commit 89f3641
Showing
20 changed files
with
3,763 additions
and
52 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,4 +22,6 @@ profile.out | |
|
||
coverage.out | ||
|
||
dist | ||
|
||
commit_hash.txt |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,65 +1,53 @@ | ||
# This is an example goreleaser.yaml file with some sane defaults. | ||
# Make sure to check the documentation at http://goreleaser.com | ||
builds: | ||
- main: ./cmd/ft | ||
- binary: ft | ||
main: ./cmd/ft | ||
goos: | ||
- windows | ||
- darwin | ||
- linux | ||
goarch: | ||
- amd64 | ||
- 386 | ||
- binary: ftkey | ||
main: ./cmd/ftkey | ||
goos: | ||
- windows | ||
- darwin | ||
- linux | ||
goarch: | ||
- amd64 | ||
- 386 | ||
- binary: ftfinder | ||
main: ./cmd/ftfinder | ||
goos: | ||
- windows | ||
- darwin | ||
- linux | ||
goarch: | ||
- amd64 | ||
- 386 | ||
env: | ||
- CGO_ENABLED=0 | ||
ldflags: | ||
- -s -w | ||
- -X github.com/fractalplatform/fractal/utils.commit={{.Commit}} | ||
- -X github.com/fractalplatform/fractal/utils.date={{.Date}} | ||
archive: | ||
replacements: | ||
darwin: Darwin | ||
linux: Linux | ||
windows: Windows | ||
386: i386 | ||
amd64: x86_64 | ||
checksum: | ||
name_template: 'checksums.txt' | ||
snapshot: | ||
name_template: "{{ .Tag }}-next" | ||
name_template: "{{ .Tag }}" | ||
changelog: | ||
sort: asc | ||
filters: | ||
exclude: | ||
- '^docs:' | ||
- '^test:' | ||
|
||
- main: ./cmd/ftkey | ||
ldflags: | ||
- -s -w | ||
- -X github.com/fractalplatform/fractal/utils.commit={{.Commit}} | ||
- -X github.com/fractalplatform/fractal/utils.date={{.Date}} | ||
archive: | ||
replacements: | ||
darwin: Darwin | ||
386: i386 | ||
amd64: x86_64 | ||
checksum: | ||
name_template: 'checksums.txt' | ||
snapshot: | ||
name_template: "{{ .Tag }}-next" | ||
changelog: | ||
sort: asc | ||
filters: | ||
exclude: | ||
- '^docs:' | ||
- '^test:' | ||
|
||
- main: ./cmd/build_ftfinder | ||
ldflags: | ||
- -s -w | ||
- -X github.com/fractalplatform/fractal/utils.commit={{.Commit}} | ||
- -X github.com/fractalplatform/fractal/utils.date={{.Date}} | ||
archive: | ||
replacements: | ||
darwin: Darwin | ||
386: i386 | ||
amd64: x86_64 | ||
checksum: | ||
name_template: 'checksums.txt' | ||
snapshot: | ||
name_template: "{{ .Tag }}-next" | ||
changelog: | ||
sort: asc | ||
filters: | ||
exclude: | ||
- '^docs:' | ||
- '^test:' | ||
- '^test:' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
// Copyright 2018 The Fractal Team Authors | ||
// This file is part of the fractal project. | ||
// | ||
// This program is free software: you can redistribute it and/or modify | ||
// it under the terms of the GNU General Public License as published by | ||
// the Free Software Foundation, either version 3 of the License, or | ||
// (at your option) any later version. | ||
// | ||
// This program is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
// GNU General Public License for more details. | ||
// | ||
// You should have received a copy of the GNU General Public License | ||
// along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
|
||
// +build nacl js !cgo | ||
|
||
package crypto | ||
|
||
import ( | ||
"crypto/ecdsa" | ||
"crypto/elliptic" | ||
"errors" | ||
"fmt" | ||
"math/big" | ||
|
||
"github.com/btcsuite/btcd/btcec" | ||
) | ||
|
||
// Ecrecover returns the uncompressed public key that created the given signature. | ||
func Ecrecover(hash, sig []byte) ([]byte, error) { | ||
pub, err := SigToPub(hash, sig) | ||
if err != nil { | ||
return nil, err | ||
} | ||
bytes := (*btcec.PublicKey)(pub).SerializeUncompressed() | ||
return bytes, err | ||
} | ||
|
||
// SigToPub returns the public key that created the given signature. | ||
func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) { | ||
// Convert to btcec input format with 'recovery id' v at the beginning. | ||
btcsig := make([]byte, 65) | ||
btcsig[0] = sig[64] + 27 | ||
copy(btcsig[1:], sig) | ||
|
||
pub, _, err := btcec.RecoverCompact(btcec.S256(), btcsig, hash) | ||
return (*ecdsa.PublicKey)(pub), err | ||
} | ||
|
||
// Sign calculates an ECDSA signature. | ||
// | ||
// This function is susceptible to chosen plaintext attacks that can leak | ||
// information about the private key that is used for signing. Callers must | ||
// be aware that the given hash cannot be chosen by an adversery. Common | ||
// solution is to hash any input before calculating the signature. | ||
// | ||
// The produced signature is in the [R || S || V] format where V is 0 or 1. | ||
func Sign(hash []byte, prv *ecdsa.PrivateKey) ([]byte, error) { | ||
if len(hash) != 32 { | ||
return nil, fmt.Errorf("hash is required to be exactly 32 bytes (%d)", len(hash)) | ||
} | ||
if prv.Curve != btcec.S256() { | ||
return nil, fmt.Errorf("private key curve is not secp256k1") | ||
} | ||
sig, err := btcec.SignCompact(btcec.S256(), (*btcec.PrivateKey)(prv), hash, false) | ||
if err != nil { | ||
return nil, err | ||
} | ||
// Convert to Ethereum signature format with 'recovery id' v at the end. | ||
v := sig[0] - 27 | ||
copy(sig, sig[1:]) | ||
sig[64] = v | ||
return sig, nil | ||
} | ||
|
||
// VerifySignature checks that the given public key created signature over hash. | ||
// The public key should be in compressed (33 bytes) or uncompressed (65 bytes) format. | ||
// The signature should have the 64 byte [R || S] format. | ||
func VerifySignature(pubkey, hash, signature []byte) bool { | ||
if len(signature) != 64 { | ||
return false | ||
} | ||
sig := &btcec.Signature{R: new(big.Int).SetBytes(signature[:32]), S: new(big.Int).SetBytes(signature[32:])} | ||
key, err := btcec.ParsePubKey(pubkey, btcec.S256()) | ||
if err != nil { | ||
return false | ||
} | ||
// Reject malleable signatures. libsecp256k1 does this check but btcec doesn't. | ||
if sig.S.Cmp(secp256k1halfN) > 0 { | ||
return false | ||
} | ||
return sig.Verify(hash, key) | ||
} | ||
|
||
// DecompressPubkey parses a public key in the 33-byte compressed format. | ||
func DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) { | ||
if len(pubkey) != 33 { | ||
return nil, errors.New("invalid compressed public key length") | ||
} | ||
key, err := btcec.ParsePubKey(pubkey, btcec.S256()) | ||
if err != nil { | ||
return nil, err | ||
} | ||
return key.ToECDSA(), nil | ||
} | ||
|
||
// CompressPubkey encodes a public key to the 33-byte compressed format. | ||
func CompressPubkey(pubkey *ecdsa.PublicKey) []byte { | ||
return (*btcec.PublicKey)(pubkey).SerializeCompressed() | ||
} | ||
|
||
// S256 returns an instance of the secp256k1 curve. | ||
func S256() elliptic.Curve { | ||
return btcec.S256() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.