pre steak commit
This commit is contained in:
parent
a27bb453f9
commit
030e33f483
7 changed files with 98 additions and 4 deletions
|
@ -1,13 +1,19 @@
|
||||||
#ifndef SOSC_CRYPTO_CIPHER_H
|
#ifndef SOSC_CRYPTO_CIPHER_H
|
||||||
#define SOSC_CRYPTO_CIPHER_H
|
#define SOSC_CRYPTO_CIPHER_H
|
||||||
|
|
||||||
|
#include "../utils/bigint.hpp"
|
||||||
|
|
||||||
namespace sosc {
|
namespace sosc {
|
||||||
namespace cgc {
|
namespace cgc {
|
||||||
class Cipher {
|
class Cipher {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
const std::string sigma = "expand 32-byte k";
|
||||||
|
const std::string tau = "expand 16-byte k";
|
||||||
|
|
||||||
|
std::string key;
|
||||||
|
std::string state;
|
||||||
};
|
};
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,52 @@
|
||||||
#include "keyex.hpp"
|
#include "keyex.hpp"
|
||||||
|
|
||||||
|
sosc::cgc::KeyExchange::KeyExchange() {
|
||||||
|
if(KeyExchange::secret.IsZero())
|
||||||
|
KeyExchange::secret =
|
||||||
|
BigUInt::GenerateRandomPrime(this->key_size_bytes);
|
||||||
|
|
||||||
|
this->modulus = BigUInt::GenerateRandomPrime(this->key_size_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
sosc::Packet sosc::cgc::KeyExchange::GenerateRequest() const {
|
||||||
|
return Packet(1, {
|
||||||
|
this->generator.ToString(),
|
||||||
|
this->modulus.ToString(),
|
||||||
|
BigUInt::ModPow(this->generator, this->secret, this->modulus);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sosc::cgc::KeyExchange::ParseRequest
|
||||||
|
(const Packet& request, Packet* response)
|
||||||
|
{
|
||||||
|
if(request.GetId() != 1 || request.RegionCount() != 3)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
BigUInt generator, modulus, public_key;
|
||||||
|
bool check = generator.Parse(request[0]);
|
||||||
|
check = check || modulus.Parse(request[1]);
|
||||||
|
check = check || public_key.Parse(request[2]);
|
||||||
|
|
||||||
|
if(!check)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
this->private_key = BigUInt::ModPow(public_key, this->secret, modulus);
|
||||||
|
public_key = BigUInt::ModPow(generator, this->secret, modulus);
|
||||||
|
*response = Packet(1, { public_key.ToString() });
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sosc::cgc::KeyExchange::ParseResponse(const Packet& response) {
|
||||||
|
if(response.GetId() != 1 || response.RegionCount() != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
BigUInt public_key;
|
||||||
|
if(!public_key.Parse(response[0]))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
this->private_key =
|
||||||
|
BigUInt::ModPow(public_key, this->secret, this->modulus);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -1,15 +1,35 @@
|
||||||
#ifndef SOSC_CRYPTO_KEYEX_H
|
#ifndef SOSC_CRYPTO_KEYEX_H
|
||||||
#define SOSC_CRYPTO_KEYEX_H
|
#define SOSC_CRYPTO_KEYEX_H
|
||||||
|
|
||||||
|
#include "../utils/bigint.hpp"
|
||||||
|
#include "../sock/packet.hpp"
|
||||||
|
|
||||||
namespace sosc {
|
namespace sosc {
|
||||||
namespace cgc {
|
namespace cgc {
|
||||||
class KeyExchange {
|
class KeyExchange {
|
||||||
public:
|
public:
|
||||||
const int key_size = 512;
|
KeyExchange();
|
||||||
const int key_size_bytes = key_size / 8;
|
|
||||||
const int generator = 2;
|
|
||||||
private:
|
|
||||||
|
|
||||||
|
Packet GenerateRequest() const;
|
||||||
|
bool ParseRequest(const Packet& request, Packet* response);
|
||||||
|
bool ParseResponse(const Packet& response);
|
||||||
|
|
||||||
|
inline bool Succeeded() {
|
||||||
|
return !this->private_key.IsZero();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const BigUInt& GetPrivateKey() {
|
||||||
|
return this->private_key;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
const int key_size = 256;
|
||||||
|
const int key_size_bytes = key_size / 8;
|
||||||
|
|
||||||
|
const BigUInt generator = BigUInt(2u);
|
||||||
|
static BigUInt secret;
|
||||||
|
BigUInt modulus;
|
||||||
|
|
||||||
|
BigUInt private_key;
|
||||||
};
|
};
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,14 @@
|
||||||
#include "packet.hpp"
|
#include "packet.hpp"
|
||||||
|
|
||||||
|
sosc::Packet::Packet() {
|
||||||
|
this->id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sosc::Packet::Packet(uint8_t id, std::vector<std::string> data) {
|
||||||
|
this->SetId(id);
|
||||||
|
this->regions = data;
|
||||||
|
}
|
||||||
|
|
||||||
bool sosc::Packet::AddRegion(std::string data) {
|
bool sosc::Packet::AddRegion(std::string data) {
|
||||||
if(this->regions.size() >= 256)
|
if(this->regions.size() >= 256)
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -18,6 +18,9 @@
|
||||||
namespace sosc {
|
namespace sosc {
|
||||||
class Packet {
|
class Packet {
|
||||||
public:
|
public:
|
||||||
|
Packet();
|
||||||
|
Packet(uint8_t id, std::vector<std::string> data);
|
||||||
|
|
||||||
bool AddRegion(std::string data);
|
bool AddRegion(std::string data);
|
||||||
bool AddRegions(std::vector<std::string> data);
|
bool AddRegions(std::vector<std::string> data);
|
||||||
|
|
||||||
|
|
|
@ -437,6 +437,11 @@ sosc::BigUInt sosc::BigUInt::operator << (const uint64_t& rhs) const {
|
||||||
return shifted;
|
return shifted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string sosc::BigUInt::ToRawString(uint64_t byte_count) const {
|
||||||
|
std::string raw(byte_count == 0 ? this->UsedByteCount() : byte_count, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
std::string sosc::BigUInt::ToString() const {
|
std::string sosc::BigUInt::ToString() const {
|
||||||
std::stringstream stream;
|
std::stringstream stream;
|
||||||
for(size_t i = this->WordCount() - 1;; --i) {
|
for(size_t i = this->WordCount() - 1;; --i) {
|
||||||
|
|
|
@ -82,6 +82,7 @@ public:
|
||||||
BigUInt operator >> (const uint64_t& rhs) const;
|
BigUInt operator >> (const uint64_t& rhs) const;
|
||||||
BigUInt operator << (const uint64_t& rhs) const;
|
BigUInt operator << (const uint64_t& rhs) const;
|
||||||
|
|
||||||
|
std::string ToRawString(uint64_t byte_count = 0) const;
|
||||||
std::string ToString() const;
|
std::string ToString() const;
|
||||||
inline operator std::string () const {
|
inline operator std::string () const {
|
||||||
return this->ToString();
|
return this->ToString();
|
||||||
|
|
Loading…
Reference in a new issue