added public key validation
This commit is contained in:
parent
ad50959bac
commit
fd47ade07b
@ -28,6 +28,35 @@ namespace sessionTests
|
|||||||
Assert.IsTrue(Enumerable.SequenceEqual(newK, session.getLatestPublicKey()));
|
Assert.IsTrue(Enumerable.SequenceEqual(newK, session.getLatestPublicKey()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestSessionNoPublicDupes(){
|
||||||
|
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));
|
||||||
|
try{
|
||||||
|
session.addPublic(newK, getFutureTime(61));
|
||||||
|
}
|
||||||
|
catch(DuplicatePublicKey){return;}
|
||||||
|
Assert.Fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestSessionAddPublicInvalidKey(){
|
||||||
|
byte[] publicK = PublicKeyBox.GenerateKeyPair().PublicKey;
|
||||||
|
byte[] privateK = PublicKeyBox.GenerateKeyPair().PrivateKey;
|
||||||
|
byte[] newK = {3, 5};
|
||||||
|
Session session = new Session(privateK, publicK, true);
|
||||||
|
try{
|
||||||
|
session.addPublic(newK, getFutureTime(61));
|
||||||
|
}
|
||||||
|
catch(InvalidKeyLength){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Assert.Fail();
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestSessionAddPublicInvalidTime(){
|
public void TestSessionAddPublicInvalidTime(){
|
||||||
byte[] publicK = PublicKeyBox.GenerateKeyPair().PublicKey;
|
byte[] publicK = PublicKeyBox.GenerateKeyPair().PublicKey;
|
||||||
|
23
treasurechest/chestcrypto/session/exceptions.cs
Normal file
23
treasurechest/chestcrypto/session/exceptions.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
namespace chestcrypto{
|
||||||
|
|
||||||
|
namespace exceptions{
|
||||||
|
public class DuplicatePublicKey : Exception
|
||||||
|
{
|
||||||
|
public DuplicatePublicKey()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public DuplicatePublicKey(string message)
|
||||||
|
: base(message)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public DuplicatePublicKey(string message, Exception inner)
|
||||||
|
: base(message, inner)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System;
|
using System;
|
||||||
using chestcrypto.exceptions;
|
using chestcrypto.exceptions;
|
||||||
|
|
||||||
@ -18,8 +19,24 @@ namespace chestcrypto{
|
|||||||
private bool strictMode;
|
private bool strictMode;
|
||||||
private const int minimumKeyExpireSeconds = 60;
|
private const int minimumKeyExpireSeconds = 60;
|
||||||
|
|
||||||
|
private void validateKey(byte[] key){
|
||||||
|
if (key.Length != 32){
|
||||||
|
throw new InvalidKeyLength();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool publicKeyExists(byte[] key){
|
||||||
|
foreach( (int, byte[]) k in theirPublicKeys){
|
||||||
|
if (Enumerable.SequenceEqual(k.Item2, key)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public Session(byte[] masterPrivate, byte[] masterPublic, bool strictMode){
|
public Session(byte[] masterPrivate, byte[] masterPublic, bool strictMode){
|
||||||
if(masterPrivate.Length != 32 | masterPublic.Length != 32){throw new InvalidKeyLength();}
|
validateKey(masterPrivate);
|
||||||
|
validateKey(masterPublic);
|
||||||
ourMasterPrivateKey = masterPrivate;
|
ourMasterPrivateKey = masterPrivate;
|
||||||
theirMasterPublicKey = masterPublic;
|
theirMasterPublicKey = masterPublic;
|
||||||
this.strictMode = strictMode;
|
this.strictMode = strictMode;
|
||||||
@ -29,6 +46,8 @@ namespace chestcrypto{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void addPublic(byte[] publicKey, long timestamp){
|
public void addPublic(byte[] publicKey, long timestamp){
|
||||||
|
validateKey(publicKey);
|
||||||
|
if (publicKeyExists(publicKey)){throw new DuplicatePublicKey();}
|
||||||
if (timestamp < DateTimeOffset.UtcNow.ToUnixTimeSeconds() + minimumKeyExpireSeconds){
|
if (timestamp < DateTimeOffset.UtcNow.ToUnixTimeSeconds() + minimumKeyExpireSeconds){
|
||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user