Skip to content

Commit

Permalink
Parallelize seed generation
Browse files Browse the repository at this point in the history
  • Loading branch information
moncho committed Sep 2, 2017
1 parent c9d3206 commit bc73104
Showing 1 changed file with 34 additions and 15 deletions.
49 changes: 34 additions & 15 deletions warp/seeds.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ import (
"golang.org/x/crypto/scrypt"
)

type result struct {
seed []byte
err error
}

type seedGenerator func() ([]byte, error)

func scryptSeed(passphrase, salt string) seedGenerator {
Expand All @@ -23,27 +28,41 @@ func pbkdf2Seed(passphrase, salt string) seedGenerator {
}
}

func xorSeeds(seeds ...seedGenerator) seedGenerator {
func xorSeeds(generators ...seedGenerator) seedGenerator {
return func() ([]byte, error) {
var keys [][]byte
var err error

genCount := len(generators)
results := make(chan result, genCount)
done := make(chan struct{})
defer close(results)
defer close(done)

for _, g := range generators {
go func(s seedGenerator) {
b, err := s()
select {
case results <- result{b, err}:
case <-done:
}

}(g)
}

var finalKey []byte
for _, s := range seeds {
if b, sErr := s(); sErr == nil {
keys = append(keys, b)

for i := 0; i < genCount; i++ {
r := <-results
if r.err != nil {
return nil, r.err
}
if finalKey == nil {
finalKey = r.seed
} else {
err = sErr
blockXOR(finalKey, r.seed)
}
}

if len(keys) > 0 {
finalKey = make([]byte, len(keys[0]))
copy(finalKey, keys[0])
for _, key := range keys[1:] {
blockXOR(finalKey, key)
}
}
return finalKey, err
return finalKey, nil
}
}

Expand Down

0 comments on commit bc73104

Please sign in to comment.