seekia/internal/myDevice/myDevice.go

89 lines
2.6 KiB
Go

// myDevice provides functions to generate device identifiers
// These are used to let other users know if the user has changed devices
// Upon learning this, users will wait to download new chat keys and discard any secret inboxes they had stored from the user
package myDevice
import "seekia/internal/cryptography/blake3"
import "seekia/internal/encoding"
import "seekia/internal/helpers"
import "seekia/internal/mySeedPhrases"
import "seekia/internal/mySettings"
import "errors"
import "slices"
import "sync"
var initializingDeviceSeedMutex sync.Mutex
//Outputs:
// -bool: My identity found
// -[11]byte: Device identifier
// -error
func GetMyDeviceIdentifier(myIdentityHash [16]byte, networkType byte)(bool, [11]byte, error){
isValid := helpers.VerifyNetworkType(networkType)
if (isValid == false){
networkTypeString := helpers.ConvertByteToString(networkType)
return false, [11]byte{}, errors.New("GetMyDeviceIdentifier called with invalid networkType: " + networkTypeString)
}
identityFound, mySeedPhraseHash, err := mySeedPhrases.GetMySeedPhraseHashFromIdentityHash(myIdentityHash)
if (err != nil) { return false, [11]byte{}, err }
if (identityFound == false){
return false, [11]byte{}, nil
}
getMyDeviceSeed := func()(string, error){
initializingDeviceSeedMutex.Lock()
defer initializingDeviceSeedMutex.Unlock()
exists, myDeviceSeed, err := mySettings.GetSetting("DeviceSeed")
if (err != nil){ return "", err }
if (exists == true){
return myDeviceSeed, nil
}
newDeviceSeed, err := helpers.GetNewRandomHexString(64)
if (err != nil) { return "", err }
err = mySettings.SetSetting("DeviceSeed", newDeviceSeed)
if (err != nil) { return "", err }
return newDeviceSeed, nil
}
myDeviceSeed, err := getMyDeviceSeed()
if (err != nil) { return false, [11]byte{}, err }
deviceSeedBytes, err := encoding.DecodeHexStringToBytes(myDeviceSeed)
if (err != nil) {
return false, [11]byte{}, errors.New("My device seed is invalid: Not Hex: " + myDeviceSeed)
}
if (len(deviceSeedBytes) != 64){
return false, [11]byte{}, errors.New("My device seed is invalid: Invalid length: " + myDeviceSeed)
}
hashSalt, err := encoding.DecodeBase32StringToBytes("mydevice")
if (err != nil) { return false, [11]byte{}, err }
hashInput := slices.Concat(mySeedPhraseHash[:], hashSalt)
hashInput = append(hashInput, networkType)
hashInput = append(hashInput, deviceSeedBytes...)
deviceIdentifier, err := blake3.GetBlake3HashAsBytes(11, hashInput)
if (err != nil) { return false, [11]byte{}, err }
deviceIdentifierArray := [11]byte(deviceIdentifier)
return true, deviceIdentifierArray, nil
}