Skip to content
Snippets Groups Projects
Commit 9532f719 authored by Benjamin Wenger's avatar Benjamin Wenger
Browse files

multithreaded user creation to reduce how long it takes

parent b0c55a43
No related branches found
No related tags found
1 merge request!23Release
...@@ -82,7 +82,6 @@ func NewClient(ndfJSON, storageDir string, password []byte, registrationCode str ...@@ -82,7 +82,6 @@ func NewClient(ndfJSON, storageDir string, password []byte, registrationCode str
// Use fastRNG for RNG ops (AES fortuna based RNG using system RNG) // Use fastRNG for RNG ops (AES fortuna based RNG using system RNG)
jww.INFO.Printf("RNG Creation") jww.INFO.Printf("RNG Creation")
rngStreamGen := fastRNG.NewStreamGenerator(12, 3, csprng.NewSystemRNG) rngStreamGen := fastRNG.NewStreamGenerator(12, 3, csprng.NewSystemRNG)
rngStream := rngStreamGen.GetStream()
jww.INFO.Printf("Parsing NDF") jww.INFO.Printf("Parsing NDF")
// Parse the NDF // Parse the NDF
def, err := parseNDF(ndfJSON) def, err := parseNDF(ndfJSON)
...@@ -92,7 +91,7 @@ func NewClient(ndfJSON, storageDir string, password []byte, registrationCode str ...@@ -92,7 +91,7 @@ func NewClient(ndfJSON, storageDir string, password []byte, registrationCode str
jww.INFO.Printf("Decoding Groups") jww.INFO.Printf("Decoding Groups")
cmixGrp, e2eGrp := decodeGroups(def) cmixGrp, e2eGrp := decodeGroups(def)
jww.INFO.Printf("Creating New User") jww.INFO.Printf("Creating New User")
protoUser := createNewUser(rngStream, cmixGrp, e2eGrp) protoUser := createNewUser(rngStreamGen, cmixGrp, e2eGrp)
jww.INFO.Printf("Setting Up Storage") jww.INFO.Printf("Setting Up Storage")
err = checkVersionAndSetupStorage(def, storageDir, password, protoUser, err = checkVersionAndSetupStorage(def, storageDir, password, protoUser,
cmixGrp, e2eGrp, rngStreamGen, false, registrationCode) cmixGrp, e2eGrp, rngStreamGen, false, registrationCode)
......
...@@ -12,6 +12,7 @@ import ( ...@@ -12,6 +12,7 @@ import (
jww "github.com/spf13/jwalterweatherman" jww "github.com/spf13/jwalterweatherman"
"gitlab.com/elixxir/client/interfaces/user" "gitlab.com/elixxir/client/interfaces/user"
"gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/cyclic"
"gitlab.com/elixxir/crypto/fastRNG"
"gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/crypto/csprng"
"gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/crypto/signature/rsa"
"gitlab.com/xx_network/crypto/xx" "gitlab.com/xx_network/crypto/xx"
...@@ -29,58 +30,105 @@ const ( ...@@ -29,58 +30,105 @@ const (
) )
// createNewUser generates an identity for cMix // createNewUser generates an identity for cMix
func createNewUser(rng csprng.Source, cmix, e2e *cyclic.Group) user.User { func createNewUser(rng *fastRNG.StreamGenerator, cmix, e2e *cyclic.Group) user.User {
// CMIX Keygen // CMIX Keygen
// FIXME: Why 256 bits? -- this is spec but not explained, it has var transmissionRsaKey, receptionRsaKey *rsa.PrivateKey
// to do with optimizing operations on one side and still preserves
// decent security -- cite this.
cMixKeyBytes, err := csprng.GenerateInGroup(cmix.GetPBytes(), 256, rng)
if err != nil {
jww.FATAL.Panicf(err.Error())
}
// DH Keygen var cMixKeyBytes, e2eKeyBytes, transmissionSalt, receptionSalt []byte
// FIXME: Why 256 bits? -- this is spec but not explained, it has
// to do with optimizing operations on one side and still preserves wg := sync.WaitGroup{}
// decent security -- cite this. Why valid for BOTH e2e and cmix?
e2eKeyBytes, err := csprng.GenerateInGroup(e2e.GetPBytes(), 256, rng) wg.Add(6)
if err != nil {
jww.FATAL.Panicf(err.Error()) go func(){
} defer wg.Done()
var err error
// FIXME: Why 256 bits? -- this is spec but not explained, it has
// to do with optimizing operations on one side and still preserves
// decent security -- cite this.
stream := rng.GetStream()
cMixKeyBytes, err = csprng.GenerateInGroup(cmix.GetPBytes(), 256, stream)
stream.Close()
if err != nil {
jww.FATAL.Panicf(err.Error())
}
}()
go func(){
defer wg.Done()
var err error
// DH Keygen
// FIXME: Why 256 bits? -- this is spec but not explained, it has
// to do with optimizing operations on one side and still preserves
// decent security -- cite this. Why valid for BOTH e2e and cmix?
stream := rng.GetStream()
e2eKeyBytes, err = csprng.GenerateInGroup(e2e.GetPBytes(), 256, stream)
stream.Close()
if err != nil {
jww.FATAL.Panicf(err.Error())
}
}()
// RSA Keygen (4096 bit defaults) // RSA Keygen (4096 bit defaults)
transmissionRsaKey, err := rsa.GenerateKey(rng, rsa.DefaultRSABitLen) go func() {
if err != nil { defer wg.Done()
jww.FATAL.Panicf(err.Error()) var err error
} stream := rng.GetStream()
receptionRsaKey, err := rsa.GenerateKey(rng, rsa.DefaultRSABitLen) transmissionRsaKey, err = rsa.GenerateKey(stream, rsa.DefaultRSABitLen)
if err != nil { stream.Close()
jww.FATAL.Panicf(err.Error()) if err != nil {
} jww.FATAL.Panicf(err.Error())
}
}()
go func() {
defer wg.Done()
var err error
stream := rng.GetStream()
receptionRsaKey, err = rsa.GenerateKey(stream, rsa.DefaultRSABitLen)
stream.Close()
if err != nil {
jww.FATAL.Panicf(err.Error())
}
}()
// Salt, UID, etc gen // Salt, UID, etc gen
transmissionSalt := make([]byte, SaltSize) go func(){
n, err := csprng.NewSystemRNG().Read(transmissionSalt) defer wg.Done()
if err != nil { transmissionSalt = make([]byte, SaltSize)
jww.FATAL.Panicf(err.Error()) stream := rng.GetStream()
} n, err := stream.Read(transmissionSalt)
if n != SaltSize { stream.Close()
jww.FATAL.Panicf("transmissionSalt size too small: %d", n) if err != nil {
} jww.FATAL.Panicf(err.Error())
}
if n != SaltSize {
jww.FATAL.Panicf("transmissionSalt size too small: %d", n)
}
}()
go func(){
defer wg.Done()
receptionSalt = make([]byte, SaltSize)
stream := rng.GetStream()
n, err := stream.Read(receptionSalt)
stream.Close()
if err != nil {
jww.FATAL.Panicf(err.Error())
}
if n != SaltSize {
jww.FATAL.Panicf("transmissionSalt size too small: %d", n)
}
}()
wg.Wait()
transmissionID, err := xx.NewID(transmissionRsaKey.GetPublic(), transmissionSalt, id.User) transmissionID, err := xx.NewID(transmissionRsaKey.GetPublic(), transmissionSalt, id.User)
if err != nil { if err != nil {
jww.FATAL.Panicf(err.Error()) jww.FATAL.Panicf(err.Error())
} }
// Salt, UID, etc gen
receptionSalt := make([]byte, SaltSize)
n, err = csprng.NewSystemRNG().Read(receptionSalt)
if err != nil {
jww.FATAL.Panicf(err.Error())
}
if n != SaltSize {
jww.FATAL.Panicf("receptionSalt size too small: %d", n)
}
receptionID, err := xx.NewID(receptionRsaKey.GetPublic(), receptionSalt, id.User) receptionID, err := xx.NewID(receptionRsaKey.GetPublic(), receptionSalt, id.User)
if err != nil { if err != nil {
jww.FATAL.Panicf(err.Error()) jww.FATAL.Panicf(err.Error())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment