2018-11-28 19:49:03 +00:00
|
|
|
# beacon_chain
|
|
|
|
# Copyright (c) 2018 Status Research & Development GmbH
|
|
|
|
# Licensed and distributed under either of
|
|
|
|
# * MIT license (license terms in the root directory or at http://opensource.org/licenses/MIT).
|
|
|
|
# * Apache v2 license (license terms in the root directory or at http://www.apache.org/licenses/LICENSE-2.0).
|
|
|
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
|
|
|
|
|
|
|
# At the time of writing, the exact definitions of what should be used for
|
|
|
|
# cryptography in the spec is in flux, with sizes and test vectors still being
|
|
|
|
# hashed out. This layer helps isolate those chagnes.
|
|
|
|
|
|
|
|
import
|
2018-12-19 12:58:53 +00:00
|
|
|
hashes,
|
|
|
|
milagro_crypto, json_serialization
|
|
|
|
|
|
|
|
export
|
|
|
|
json_serialization, milagro_crypto.`$`
|
2018-11-28 19:49:03 +00:00
|
|
|
|
|
|
|
type
|
2018-11-29 01:08:34 +00:00
|
|
|
ValidatorPubKey* = milagro_crypto.VerKey
|
|
|
|
ValidatorPrivKey* = milagro_crypto.SigKey
|
|
|
|
ValidatorSig* = milagro_crypto.Signature
|
|
|
|
|
|
|
|
template hash*(k: ValidatorPubKey|ValidatorPrivKey): Hash =
|
|
|
|
hash(k.getRaw)
|
|
|
|
|
2018-12-11 17:55:45 +00:00
|
|
|
func pubKey*(pk: ValidatorPrivKey): ValidatorPubKey = fromSigKey(pk)
|
2018-12-05 13:58:41 +00:00
|
|
|
|
2018-12-17 19:36:17 +00:00
|
|
|
func bls_aggregate_pubkeys*(keys: openArray[ValidatorPubKey]): ValidatorPubKey =
|
2018-12-21 23:47:55 +00:00
|
|
|
var empty = true
|
2018-12-11 17:55:45 +00:00
|
|
|
for key in keys:
|
|
|
|
if empty:
|
|
|
|
result = key
|
|
|
|
empty = false
|
|
|
|
else:
|
|
|
|
result.combine(key)
|
|
|
|
|
2018-12-17 19:36:17 +00:00
|
|
|
func bls_verify*(
|
2018-12-11 17:55:45 +00:00
|
|
|
pubkey: ValidatorPubKey, msg: openArray[byte], sig: ValidatorSig,
|
|
|
|
domain: uint64): bool =
|
|
|
|
# name from spec!
|
|
|
|
# TODO domain!
|
|
|
|
sig.verifyMessage(msg, pubkey)
|
2018-12-19 12:58:53 +00:00
|
|
|
|
|
|
|
proc writeValue*(writer: var JsonWriter, value: ValidatorPubKey) {.inline.} =
|
|
|
|
writer.writeValue $value
|
|
|
|
|
|
|
|
proc readValue*(reader: var JsonReader, value: var ValidatorPubKey) {.inline.} =
|
|
|
|
value = initVerKey reader.readValue(string)
|
|
|
|
|
|
|
|
proc writeValue*(writer: var JsonWriter, value: ValidatorSig) {.inline.} =
|
|
|
|
writer.writeValue $value
|
|
|
|
|
|
|
|
proc readValue*(reader: var JsonReader, value: var ValidatorSig) {.inline.} =
|
|
|
|
value = initSignature reader.readValue(string)
|
|
|
|
|
|
|
|
proc writeValue*(writer: var JsonWriter, value: ValidatorPrivKey) {.inline.} =
|
|
|
|
writer.writeValue $value
|
|
|
|
|
|
|
|
proc readValue*(reader: var JsonReader, value: var ValidatorPrivKey) {.inline.} =
|
|
|
|
value = initSigKey reader.readValue(string)
|
|
|
|
|