mirror of
https://github.com/henrydcase/nobs.git
synced 2024-11-22 15:18:57 +00:00
Kris Kwiatkowski
7efbbf4745
Implementation of Commutative Supersingular Isogeny Diffie Hellman, based on "A faster way to CSIDH" paper (2018/782). * For fast isogeny calculation, implementation converts a curve from Montgomery to Edwards. All calculations are done on Edwards curve and then converted back to Montgomery. * As multiplication in a field Fp511 is most expensive operation the implementation contains multiple multiplications. It has most performant, assembly implementation which uses BMI2 and ADOX/ADCX instructions for modern CPUs. It also contains slower implementation which will run on older CPUs * Benchmarks (Intel SkyLake): BenchmarkGeneratePrivate 6459 172213 ns/op 0 B/op 0 allocs/op BenchmarkGenerateKeyPair 25 45800356 ns/op 0 B/op 0 allocs/op BenchmarkValidate 297 3915983 ns/op 0 B/op 0 allocs/op BenchmarkValidateRandom 184683 6231 ns/op 0 B/op 0 allocs/op BenchmarkValidateGenerated 25 48481306 ns/op 0 B/op 0 allocs/op BenchmarkDerive 19 60928763 ns/op 0 B/op 0 allocs/op BenchmarkDeriveGenerated 8 137342421 ns/op 0 B/op 0 allocs/op BenchmarkXMul 2311 494267 ns/op 1 B/op 0 allocs/op BenchmarkXAdd 2396754 501 ns/op 0 B/op 0 allocs/op BenchmarkXDbl 2072690 571 ns/op 0 B/op 0 allocs/op BenchmarkIsom 78004 15171 ns/op 0 B/op 0 allocs/op BenchmarkFp512Sub 224635152 5.33 ns/op 0 B/op 0 allocs/op BenchmarkFp512Mul 246633255 4.90 ns/op 0 B/op 0 allocs/op BenchmarkCSwap 233228547 5.10 ns/op 0 B/op 0 allocs/op BenchmarkAddRdc 87348240 12.6 ns/op 0 B/op 0 allocs/op BenchmarkSubRdc 95112787 11.7 ns/op 0 B/op 0 allocs/op BenchmarkModExpRdc 25436 46878 ns/op 0 B/op 0 allocs/op BenchmarkMulBmiAsm 19527573 60.1 ns/op 0 B/op 0 allocs/op BenchmarkMulGeneric 7117650 164 ns/op 0 B/op 0 allocs/op * Go code has very similar performance when compared to C implementation. Results from sidh_torturer (4e2996e12d68364761064341cbe1d1b47efafe23) github.com:henrydcase/sidh-torture/csidh | TestName |Go | C | |------------------|----------|----------| |TestSharedSecret | 57.95774 | 57.91092 | |TestKeyGeneration | 62.23614 | 58.12980 | |TestSharedSecret | 55.28988 | 57.23132 | |TestKeyGeneration | 61.68745 | 58.66396 | |TestSharedSecret | 63.19408 | 58.64774 | |TestKeyGeneration | 62.34022 | 61.62539 | |TestSharedSecret | 62.85453 | 68.74503 | |TestKeyGeneration | 52.58518 | 58.40115 | |TestSharedSecret | 50.77081 | 61.91699 | |TestKeyGeneration | 59.91843 | 61.09266 | |TestSharedSecret | 59.97962 | 62.98151 | |TestKeyGeneration | 64.57525 | 56.22863 | |TestSharedSecret | 56.40521 | 55.77447 | |TestKeyGeneration | 67.85850 | 58.52604 | |TestSharedSecret | 60.54290 | 65.14052 | |TestKeyGeneration | 65.45766 | 58.42823 | On average Go implementation is 2% faster.
66 lines
1.8 KiB
Makefile
66 lines
1.8 KiB
Makefile
# I'm sure there is better way. But I would need to find it first
|
|
MK_FILE_PATH = $(lastword $(MAKEFILE_LIST))
|
|
PRJ_DIR = $(abspath $(dir $(MK_FILE_PATH)))
|
|
GO ?= go
|
|
VENDOR_DIR = tls_vendor
|
|
OPTS ?= -v
|
|
NOASM ?=
|
|
TEST_PATH ?= ./...
|
|
GOCACHE ?= off
|
|
BENCH_OPTS ?= -v -bench=. -run="^_" -benchmem
|
|
TEST_PATH ?= ./...
|
|
DBG = 1
|
|
OPTS_ENV =
|
|
|
|
ifeq ($(NOASM),1)
|
|
OPTS+=$(OPTS_TAGS)
|
|
endif
|
|
|
|
ifeq ($(PPROF),1)
|
|
BENCH_OPTS+= -cpuprofile=cpu.out -memprofile=mem0.out
|
|
endif
|
|
|
|
ifeq ($(DBG),1)
|
|
DBG_FLAGS+= #-m # escape analysis
|
|
DBG_FLAGS+= -l # no inline
|
|
DBG_FLAGS+= -N # debug symbols
|
|
#OPTS+=-gcflags=all="$(DBG_FLAGS)"
|
|
OPTS+=-gcflags "$(DBG_FLAGS)"
|
|
OPTS_ENV+= GOTRACEBACK=crash # enable core dumps
|
|
endif
|
|
|
|
test:
|
|
$(OPTS_ENV) $(GO) test $(OPTS) $(TEST_PATH)
|
|
|
|
test_csidh: clean make_dirs $(addprefix prep-,$(TARGETS))
|
|
cd $(GOPATH_LOCAL); $(OPTS_ENV) GOPATH=$(GOPATH_LOCAL) go test $(OPTS) github.com/henrydcase/nobs/dh/csidh
|
|
|
|
test_csidh_bin: clean make_dirs $(addprefix prep-,$(TARGETS))
|
|
cd $(GOPATH_LOCAL); $(OPTS_ENV) GOPATH=$(GOPATH_LOCAL) go test -c $(OPTS) github.com/henrydcase/nobs/dh/csidh
|
|
|
|
cover:
|
|
$(GO) test \
|
|
-coverprofile=coverage.txt -covermode=atomic $(OPTS) $(TEST_PATH)
|
|
|
|
bench:
|
|
$(GO) test $(BENCH_OPTS) $(TEST_PATH)
|
|
|
|
bench_csidh: clean $(addprefix prep-,$(TARGETS))
|
|
cd $(GOPATH_LOCAL); GOCACHE=$(GOCACHE) GOPATH=$(GOPATH_LOCAL) $(GO) test \
|
|
$(BENCH_OPTS) github.com/henrydcase/nobs/dh/csidh
|
|
|
|
clean:
|
|
rm -rf $(VENDOR_DIR)
|
|
rm -rf coverage.txt
|
|
|
|
vendor-sidh-for-tls: clean
|
|
mkdir -p $(VENDOR_DIR)/github_com/henrydcase/nobs/
|
|
rsync -a . $(VENDOR_DIR)/github_com/henrydcase/nobs/ --exclude=$(VENDOR_DIR) --exclude=.git --exclude=.travis.yml --exclude=README.md
|
|
find $(VENDOR_DIR) -type f -print0 -name "*.go" | xargs -0 sed -i 's/github\.com/github_com/g'
|
|
|
|
pprof-cpu:
|
|
$(GO) tool pprof cpu.out
|
|
|
|
pprof-mem:
|
|
$(GO) tool pprof mem0.out
|