commit 58968de4f88aad3014ca1cfd5ce3d99590733642
parent fdf23180919ec42422694f1f1801eead1ea576e8
Author: Bernd Fix <brf@hoi-polloi.org>
Date: Sun, 24 May 2020 15:14:14 +0200
Milestone #3 (RC2)
Diffstat:
3 files changed, 54 insertions(+), 43 deletions(-)
diff --git a/src/cmd/revoke-zonekey/main.go b/src/cmd/revoke-zonekey/main.go
@@ -53,6 +53,10 @@ func main() {
flag.StringVar(&filename, "f", "", "Name of file to store revocation")
flag.Parse()
+ if len(filename) == 0 {
+ log.Fatal("Missing '-f' argument (filename fot revocation data)")
+ }
+
// define layout of persistant data
var revData struct {
Rd *revocation.RevData // Revocation data
@@ -112,16 +116,38 @@ func main() {
}
// Start or continue calculation
- startTime := util.AbsoluteTimeNow()
ctx, cancelFcn := context.WithCancel(context.Background())
wg := new(sync.WaitGroup)
wg.Add(1)
go func() {
defer wg.Done()
- if result, last := revData.Rd.Compute(ctx, bits, revData.Last); result != 32 {
+
+ startTime := util.AbsoluteTimeNow()
+ result, last := revData.Rd.Compute(ctx, bits, revData.Last)
+ if result != 32 {
log.Printf("Incomplete revocation: Only %d of 32 PoWs available!\n", result)
+ } else {
+ log.Println("Revocation data object:")
+ log.Println(" 0x" + hex.EncodeToString(revData.Rd.Blob()))
+ log.Println("Status:")
+ rc := revData.Rd.Verify(false)
+ switch {
+ case rc == -1:
+ log.Println(" Missing/invalid signature")
+ case rc == -2:
+ log.Println(" Expired revocation")
+ case rc == -3:
+ log.Println(" Wrong PoW sequence order")
+ case rc < 25:
+ log.Println(" Difficulty to small")
+ default:
+ log.Printf(" Difficulty: %d\n", rc)
+ }
+ }
+ if !cont || last != revData.Last {
revData.Last = last
revData.T = util.AbsoluteTimeNow().Diff(startTime)
+
log.Println("Writing revocation data to file...")
file, err := os.Create(filename)
if err != nil {
@@ -144,23 +170,6 @@ func main() {
if err = file.Close(); err != nil {
log.Fatal("Error closing file: " + err.Error())
}
- } else {
- log.Println("Revocation data object:")
- log.Println(" 0x" + hex.EncodeToString(revData.Rd.Blob()))
- log.Println("Status:")
- rc := revData.Rd.Verify()
- switch {
- case rc == -1:
- log.Println(" Missing/invalid signature")
- case rc == -2:
- log.Println(" Expired revocation")
- case rc == -3:
- log.Println(" Wrong PoW sequence order")
- case rc < 25:
- log.Println(" Difficulty to small")
- default:
- log.Printf(" Difficulty: %d\n", rc)
- }
}
}()
diff --git a/src/gnunet/service/revocation/module.go b/src/gnunet/service/revocation/module.go
@@ -94,7 +94,7 @@ func (s *RevocationModule) Query(ctx *service.SessionContext, pkey *ed25519.Publ
// Revoke
func (s *RevocationModule) Revoke(ctx *service.SessionContext, rd *RevData) (success bool, err error) {
// verify the revocation data
- rc := rd.Verify()
+ rc := rd.Verify(true)
switch {
case rc == -1:
logger.Println(logger.WARN, "[revocation] Revoke: Missing/invalid signature")
diff --git a/src/gnunet/service/revocation/pow.go b/src/gnunet/service/revocation/pow.go
@@ -173,29 +173,31 @@ func (rd *RevData) Sign(skey *ed25519.PrivateKey) error {
// than the minimum (25) indicates invalid PoWs; a value of -1 indicates
// a failed signature; -2 indicates an expired revocation and -3 for a
// "out-of-order" PoW sequence.
-func (rd *RevData) Verify() int {
+func (rd *RevData) Verify(withSig bool) int {
// (1) check signature
- sigBlock := &SignedRevData{
- Purpose: &crypto.SignaturePurpose{
- Size: 48,
- Purpose: enums.SIG_REVOCATION,
- },
- ZoneKey: rd.ZoneKey,
- Timestamp: rd.Timestamp,
- }
- sigData, err := data.Marshal(sigBlock)
- if err != nil {
- return -1
- }
- pkey := ed25519.NewPublicKeyFromBytes(rd.ZoneKey)
- sig, err := ed25519.NewEcSignatureFromBytes(rd.Signature)
- if err != nil {
- return -1
- }
- valid, err := pkey.EcVerify(sigData, sig)
- if err != nil || !valid {
- return -1
+ if withSig {
+ sigBlock := &SignedRevData{
+ Purpose: &crypto.SignaturePurpose{
+ Size: 48,
+ Purpose: enums.SIG_REVOCATION,
+ },
+ ZoneKey: rd.ZoneKey,
+ Timestamp: rd.Timestamp,
+ }
+ sigData, err := data.Marshal(sigBlock)
+ if err != nil {
+ return -1
+ }
+ pkey := ed25519.NewPublicKeyFromBytes(rd.ZoneKey)
+ sig, err := ed25519.NewEcSignatureFromBytes(rd.Signature)
+ if err != nil {
+ return -1
+ }
+ valid, err := pkey.EcVerify(sigData, sig)
+ if err != nil || !valid {
+ return -1
+ }
}
// (2) check PoWs
@@ -240,8 +242,8 @@ func (rd *RevData) Compute(ctx context.Context, bits int, last uint64) (int, uin
for i, pow := range rd.PoWs {
// handle "new" pow value: set it to last_pow+1
// this ensures a correctly sorted pow list by design.
- if pow == 0 {
- pow = last
+ if pow == 0 && last != 0 {
+ pow, last = last, 0
}
if pow == 0 && i > 0 {
pow = rd.PoWs[i-1] + 1