135 lines
4 KiB
Go
135 lines
4 KiB
Go
|
|
||
|
// mySeedPhrases provides functions to manage a user's seed phrases
|
||
|
|
||
|
package mySeedPhrases
|
||
|
|
||
|
import "seekia/internal/encoding"
|
||
|
import "seekia/internal/identity"
|
||
|
import "seekia/internal/myDatastores/myMap"
|
||
|
import "seekia/internal/seedPhrase"
|
||
|
|
||
|
import "errors"
|
||
|
|
||
|
// Map Structure: Identity Type -> My seed phrase
|
||
|
var mySeedPhrasesMapDatastore *myMap.MyMap
|
||
|
|
||
|
// This function must be called whenever an app user signs in
|
||
|
func InitializeMySeedPhrasesDatastore()error{
|
||
|
|
||
|
newMySeedPhrasesMapDatastore, err := myMap.CreateNewMap("MySeedPhrases")
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
mySeedPhrasesMapDatastore = newMySeedPhrasesMapDatastore
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: My seed phrase exists
|
||
|
// -[32]byte: My seed phrase hash
|
||
|
// -error
|
||
|
func GetMySeedPhraseHash(myIdentityType string)(bool, [32]byte, error){
|
||
|
|
||
|
exists, mySeedPhrase, err := GetMySeedPhrase(myIdentityType)
|
||
|
if (err != nil) { return false, [32]byte{}, err }
|
||
|
if (exists == false) {
|
||
|
return false, [32]byte{}, nil
|
||
|
}
|
||
|
|
||
|
mySeedPhraseHash, err := seedPhrase.ConvertSeedPhraseToSeedPhraseHash(mySeedPhrase)
|
||
|
if (err != nil) { return false, [32]byte{}, err }
|
||
|
|
||
|
return true, mySeedPhraseHash, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// This function will verify that the seed phrase hash belongs to the identity hash
|
||
|
// This is necessary because the seed phrase can be changed by the user
|
||
|
// Use this function when you need to guarantee that the seed phrase belongs to the requested identityHash
|
||
|
//Outputs:
|
||
|
// -bool: Found identity hash seed phrase hash
|
||
|
// -[32]byte: Seed phrase hash
|
||
|
// -error
|
||
|
func GetMySeedPhraseHashFromIdentityHash(inputIdentityHash [16]byte)(bool, [32]byte, error){
|
||
|
|
||
|
identityType, err := identity.GetIdentityTypeFromIdentityHash(inputIdentityHash)
|
||
|
if (err != nil) {
|
||
|
inputIdentityHashHex := encoding.EncodeBytesToHexString(inputIdentityHash[:])
|
||
|
return false, [32]byte{}, errors.New("GetMySeedPhraseHashFromIdentityHash called with invalid identityHash: " + inputIdentityHashHex)
|
||
|
}
|
||
|
|
||
|
exists, mySeedPhraseHash, err := GetMySeedPhraseHash(identityType)
|
||
|
if (err != nil) { return false, [32]byte{}, err }
|
||
|
if (exists == false) {
|
||
|
return false, [32]byte{}, nil
|
||
|
}
|
||
|
|
||
|
myIdentityHash, err := identity.GetIdentityHashFromSeedPhraseHash(mySeedPhraseHash, identityType)
|
||
|
if (err != nil) { return false, [32]byte{}, err }
|
||
|
if (myIdentityHash != inputIdentityHash) {
|
||
|
// Identity must have been replaced after identity hash was initially retrieved
|
||
|
return false, [32]byte{}, nil
|
||
|
}
|
||
|
|
||
|
return true, mySeedPhraseHash, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: My seed phrase exists
|
||
|
// -string: My seed phrase
|
||
|
// -error
|
||
|
func GetMySeedPhrase(identityType string)(bool, string, error){
|
||
|
|
||
|
if (identityType != "Mate" && identityType != "Host" && identityType != "Moderator"){
|
||
|
return false, "", errors.New("GetMySeedPhrase called with invalid identity type: " + identityType)
|
||
|
}
|
||
|
|
||
|
exists, mySeedPhrase, err := mySeedPhrasesMapDatastore.GetMapEntry(identityType)
|
||
|
if (err != nil) { return false, "", err }
|
||
|
if (exists == false) {
|
||
|
return false, "", nil
|
||
|
}
|
||
|
|
||
|
isValid := seedPhrase.VerifySeedPhrase(mySeedPhrase)
|
||
|
if (isValid == false) {
|
||
|
return false, "", errors.New("My existing seed phrase is invalid: " + mySeedPhrase)
|
||
|
}
|
||
|
|
||
|
return true, mySeedPhrase, nil
|
||
|
}
|
||
|
|
||
|
func SetMySeedPhrase(identityType string, newSeedPhrase string)error{
|
||
|
|
||
|
if (identityType != "Mate" && identityType != "Host" && identityType != "Moderator"){
|
||
|
return errors.New("SetMySeedPhrase called with invalid identity type: " + identityType)
|
||
|
}
|
||
|
|
||
|
isValid := seedPhrase.VerifySeedPhrase(newSeedPhrase)
|
||
|
if (isValid == false) {
|
||
|
return errors.New("SetMySeedPhrase called with invalid seed phrase: " + newSeedPhrase)
|
||
|
}
|
||
|
|
||
|
err := mySeedPhrasesMapDatastore.SetMapEntry(identityType, newSeedPhrase)
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
|
||
|
func DeleteMySeedPhrase(identityType string)error{
|
||
|
|
||
|
if (identityType != "Mate" && identityType != "Host" && identityType != "Moderator"){
|
||
|
return errors.New("DeleteMySeedPhrase called with invalid identity type: " + identityType)
|
||
|
}
|
||
|
|
||
|
err := mySeedPhrasesMapDatastore.DeleteMapEntry(identityType)
|
||
|
if (err != nil){ return err }
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
|