Skip to content
Snippets Groups Projects
Select Git revision
  • 2c68b2aae24b983bd67aafb83a3e05ae275882df
  • release default
  • 11-22-implement-kv-interface-defined-in-collectiveversionedkvgo
  • master protected
  • XX-4688/DbEncoding
  • hotfix/update
  • @XX-4682/Files
  • hotfix/XX-4655
  • dev protected
  • project/HavenNotifications
  • XX-4602/SilentMessageType
  • jono/npmTest
  • wasmTest2
  • XX-4461/FileUpload
  • XX-4505/blockuser
  • XX-4441
  • Jakub/Emoji-CI-Test
  • testing/websockets
  • fastReg
  • fast-registration
  • NewHostPool
  • v0.3.22
  • v0.3.21
  • v0.3.20
  • v0.3.18
  • v0.3.17
  • v0.3.16
  • v0.3.15
  • v0.3.14
  • v0.3.13
  • v0.3.12
  • v0.3.11
  • v0.3.10
  • v0.3.9
  • v0.3.8
  • v0.3.7
  • v0.3.6
  • v0.3.5
  • v0.3.4
  • 812b395df518ce096d01d5292596ca26f8fe92d9c4487ddfa515e190a51aa1a1
  • 76ba08e2dfa1798412a265404fa271840b52c035869111fce8e8cdb23a036a5a
41 results

wasm_test.go

Blame
  • mnemonic.go 3.15 KiB
    ///////////////////////////////////////////////////////////////////////////////
    // Copyright © 2020 xx network SEZC                                          //
    //                                                                           //
    // Use of this source code is governed by a license that can be found in the //
    // LICENSE file                                                              //
    ///////////////////////////////////////////////////////////////////////////////
    
    package api
    
    import (
    	"github.com/pkg/errors"
    	"gitlab.com/elixxir/crypto/fastRNG"
    	"gitlab.com/xx_network/crypto/chacha"
    	"gitlab.com/xx_network/crypto/csprng"
    	xxMnemonic "gitlab.com/xx_network/crypto/mnemonic"
    	"gitlab.com/xx_network/primitives/utils"
    	"path/filepath"
    	"strings"
    )
    
    const mnemonicFile = ".recovery"
    
    // StoreSecretWithMnemonic creates a mnemonic and uses it to encrypt the secret.
    // This encrypted data saved in storage.
    func StoreSecretWithMnemonic(secret []byte, path string) (string, error) {
    	// Use fastRNG for RNG ops (AES fortuna based RNG using system RNG)
    	rng := fastRNG.NewStreamGenerator(12, 1024, csprng.NewSystemRNG).GetStream()
    
    	// Ensure path is appended by filepath separator "/"
    	if !strings.HasSuffix(path, string(filepath.Separator)) {
    		path = path + string(filepath.Separator)
    	}
    
    	// Create a mnemonic
    	mnemonic, err := xxMnemonic.GenerateMnemonic(rng, 32)
    	if err != nil {
    		return "", errors.Errorf("Failed to generate mnemonic: %v", err)
    	}
    
    	// Decode mnemonic
    	decodedMnemonic, err := xxMnemonic.DecodeMnemonic(mnemonic)
    	if err != nil {
    		return "", errors.Errorf("Failed to decode mnemonic: %v", err)
    	}
    
    	// Encrypt secret with mnemonic as key
    	ciphertext, err := chacha.Encrypt(decodedMnemonic, secret, rng)
    	if err != nil {
    		return "", errors.Errorf("Failed to encrypt secret with mnemonic: %v", err)
    	}
    
    	// Save encrypted secret to file
    	recoveryFile := path + mnemonicFile
    	err = utils.WriteFileDef(recoveryFile, ciphertext)
    	if err != nil {
    		return "", errors.Errorf("Failed to save mnemonic information to file")
    	}
    
    	return mnemonic, nil
    }
    
    // LoadSecretWithMnemonic loads the encrypted secret from storage and decrypts
    // the secret using the given mnemonic.
    func LoadSecretWithMnemonic(mnemonic, path string) (secret []byte, err error) {
    	// Ensure path is appended by filepath separator "/"
    	if !strings.HasSuffix(path, string(filepath.Separator)) {
    		path = path + string(filepath.Separator)
    	}
    
    	// Ensure that the recovery file exists
    	recoveryFile := path + mnemonicFile
    	if !utils.Exists(recoveryFile) {
    		return nil, errors.Errorf("Recovery file does not exist. " +
    			"Did you properly set up recovery or provide an incorrect filepath?")
    	}
    
    	// Read file from storage
    	data, err := utils.ReadFile(recoveryFile)
    	if err != nil {
    		return nil, errors.Errorf("Failed to load mnemonic information: %v", err)
    	}
    
    	// Decode mnemonic
    	decodedMnemonic, err := xxMnemonic.DecodeMnemonic(mnemonic)
    	if err != nil {
    		return nil, errors.Errorf("Failed to decode mnemonic: %v", err)
    	}
    
    	// Decrypt the stored secret
    	secret, err = chacha.Decrypt(decodedMnemonic, data)
    	if err != nil {
    		return nil, errors.Errorf("Failed to decrypt secret: %v", err)
    	}
    
    	return secret, nil
    }