started session class and tests

This commit is contained in:
Kevin Froman 2020-05-28 20:38:45 -05:00
parent 734774f1a8
commit c9f505fe6c
5 changed files with 118 additions and 9 deletions

View File

@ -3,13 +3,5 @@ Session(private master key, public master peer key, bool strict, int timePerKey)
List<Ed25519PublicKey> pubkeys List<Ed25519PublicKey> pubkeys
List<Ed25519PrivKey> privkeys List<Ed25519PrivKey> privkeys
public:
encrypt()
decrypt()
deleteExpired()
byte[] SessionMessage(byte[] data)
getNewKey()

View File

@ -0,0 +1,73 @@
using NUnit.Framework;
using System;
using System.Linq;
using chestcrypto.session;
using chestcrypto.exceptions;
using Sodium;
namespace sessionTests
{
public class Tests
{
[SetUp]
public void Setup()
{
}
public long getFutureTime(int seconds){
return DateTimeOffset.UtcNow.ToUnixTimeSeconds() + (long) seconds;
}
[Test]
public void TestSessionAddValidPublic(){
byte[] publicK = PublicKeyBox.GenerateKeyPair().PublicKey;
byte[] privateK = PublicKeyBox.GenerateKeyPair().PrivateKey;
byte[] newK = PublicKeyBox.GenerateKeyPair().PublicKey;
Session session = new Session(privateK, publicK, true);
session.addPublic(newK, getFutureTime(61));
Assert.IsTrue(Enumerable.SequenceEqual(newK, session.getLatestPublicKey()));
}
[Test]
public void TestSessionAddPublicInvalidTime(){
byte[] publicK = PublicKeyBox.GenerateKeyPair().PublicKey;
byte[] privateK = PublicKeyBox.GenerateKeyPair().PrivateKey;
byte[] newK = PublicKeyBox.GenerateKeyPair().PublicKey;
Session session = new Session(privateK, publicK, true);
try{
session.addPublic(newK, getFutureTime(-1));
}
catch(System.ArgumentOutOfRangeException){
return;
}
Assert.Fail();
}
[Test]
public void TestSessionConstructor()
{
byte[] publicK = PublicKeyBox.GenerateKeyPair().PublicKey;
byte[] privateK = PublicKeyBox.GenerateKeyPair().PrivateKey;
Session session = new Session(privateK, publicK, true);
byte[] invalid = {0, 0, 0};
try{
new Session(invalid, publicK, true);
}
catch(InvalidKeyLength){
goto secondAssert;
}
Assert.Fail();
secondAssert:
try{
new Session(privateK, invalid, true);
}
catch(InvalidKeyLength){
return;
}
Assert.Fail();
}
}
}

View File

@ -0,0 +1,44 @@
using System.Collections.Generic;
using System;
using chestcrypto.exceptions;
namespace chestcrypto{
namespace session{
internal class Session{
// Create List of tuples(time, byte[])
// Where the tuple contains a time stamp for expiry and a ed25519 key
private List<(long, byte[])> ourPrivateKeys;
private List<(long, byte[])> theirPublicKeys;
private byte[] ourMasterPrivateKey;
private byte[] theirMasterPublicKey;
private bool strictMode;
private const int minimumKeyExpireSeconds = 60;
public Session(byte[] masterPrivate, byte[] masterPublic, bool strictMode){
if(masterPrivate.Length != 32 | masterPublic.Length != 32){throw new InvalidKeyLength();}
ourMasterPrivateKey = masterPrivate;
theirMasterPublicKey = masterPublic;
this.strictMode = strictMode;
ourPrivateKeys = new List<(long, byte[])>();
theirPublicKeys = new List<(long, byte[])>();
}
public void addPublic(byte[] publicKey, long timestamp){
if (timestamp < DateTimeOffset.UtcNow.ToUnixTimeSeconds() + minimumKeyExpireSeconds){
throw new ArgumentOutOfRangeException();
}
theirPublicKeys.Add((timestamp, publicKey));
}
public byte[] getLatestPublicKey(){return theirPublicKeys[theirPublicKeys.Count - 1].Item2;}
}
}
}

View File

@ -7,7 +7,7 @@ namespace keyring{
public class KeyRing public class KeyRing
{ {
private List<PublicIdentity> publicIdentities; //private List<PublicIdentity> publicIdentities;
private List<PrivateIdentity> privateIdentities; private List<PrivateIdentity> privateIdentities;
public KeyRing(){ public KeyRing(){