mirror of
https://dev.azure.com/TeilRad/sharee.bike%20App/_git/Code
synced 2024-11-05 18:46:30 +01:00
82 lines
2.9 KiB
C#
82 lines
2.9 KiB
C#
using Serilog;
|
|
using TINK.Model.Device;
|
|
|
|
namespace TINK.Services.BluetoothLock.Crypto
|
|
{
|
|
public class AuthCryptoHelper
|
|
{
|
|
private ICipher Cipher { get; }
|
|
|
|
/// <summary> Encrypted seed (random number) created inside ILOCKIT and passd to app.</summary>
|
|
private byte[] SeedLockEncrypted { get; }
|
|
|
|
/// <summary> Contstructs a auth crypto helper object.</summary>
|
|
/// <param name="seedLockEncrypted">Encrypted seed to deocode using <see cref="KeyCopri"/>.</param>
|
|
/// <param name="keyCopri">Key used to to decrypt <see cref="SeedLockEncrypted"/>.</param>
|
|
public AuthCryptoHelper(
|
|
byte[] seedLockEncrypted,
|
|
byte[] keyCopri,
|
|
ICipher cipher)
|
|
{
|
|
KeyCopri = keyCopri;
|
|
SeedLockEncrypted = seedLockEncrypted;
|
|
Cipher = cipher ?? new Cipher();
|
|
}
|
|
|
|
|
|
/// <summary> Public for testing purposes only.</summary>
|
|
public byte[] GetSeedLock()
|
|
{
|
|
byte[] seedLockDecrypted;
|
|
var seedLockEncrypted = SeedLockEncrypted;
|
|
var keyCopri = KeyCopri;
|
|
try
|
|
{
|
|
seedLockDecrypted = Cipher.Decrypt(
|
|
keyCopri,
|
|
seedLockEncrypted);
|
|
}
|
|
catch (System.Exception exception)
|
|
{
|
|
Log.ForContext<AuthCryptoHelper>().Error("Decrypting seed from lock failed. {Exception}", exception);
|
|
throw;
|
|
}
|
|
|
|
Log.ForContext<AuthCryptoHelper>().Verbose($"Lock random number decrypted from {string.Join(",", seedLockEncrypted)} to {string.Join(",", seedLockDecrypted)} using {string.Join(", ", keyCopri)}.");
|
|
return seedLockDecrypted;
|
|
}
|
|
|
|
public byte[] GetAccessKeyEncrypted()
|
|
{
|
|
|
|
var accessKey = GetSeedLock();
|
|
|
|
if (accessKey == null || accessKey.Length <= 0)
|
|
{
|
|
Log.ForContext<AuthCryptoHelper>().Error("Creating access key failed, Key must not be null or empty.");
|
|
throw new System.Exception();
|
|
}
|
|
|
|
accessKey[accessKey.Length - 1] += 1;
|
|
|
|
var keyCopri = KeyCopri;
|
|
byte[] acccessKeyEncrypted;
|
|
try
|
|
{
|
|
acccessKeyEncrypted = Cipher.Encrypt(
|
|
keyCopri,
|
|
accessKey);
|
|
}
|
|
catch (System.Exception exception)
|
|
{
|
|
Log.ForContext<AuthCryptoHelper>().Error("Encrypting access key failed. {Exception}", exception);
|
|
throw;
|
|
}
|
|
|
|
Log.ForContext<AuthCryptoHelper>().Verbose($"Access key encrypted from {string.Join(",", accessKey)} to {string.Join(",", acccessKeyEncrypted)} using {string.Join(", ", keyCopri)}.");
|
|
return acccessKeyEncrypted;
|
|
}
|
|
|
|
public byte[] KeyCopri { get; }
|
|
}
|
|
}
|