Add kvzrtp style interface for the crypto library

This commit is contained in:
Aaro Altonen 2020-01-28 08:11:38 +02:00
parent 9f2969b7c1
commit 5d9cb58f8a
5 changed files with 469 additions and 1 deletions

1
.gitignore vendored
View File

@ -1,6 +1,7 @@
src/*.o
src/formats/*.o
src/mzrtp/*.o
src/crypto/*.o
libkvzrtp.a
*main
benchmarks/*/main_*

View File

@ -3,7 +3,7 @@
CXX = g++
CXXFLAGS = -g -Wall -Wextra -Wuninitialized -O2 -std=c++11 -Isrc -fPIC #-DNDEBUG
SOURCES = $(wildcard src/*.cc)
MODULES := src/formats src/mzrtp
MODULES := src/formats src/mzrtp src/crypto
-include $(patsubst %, %/module.mk, $(MODULES))
OBJECTS := $(patsubst %.cc, %.o, $(filter %.cc, $(SOURCES)))

167
src/crypto/crypto.cc Normal file
View File

@ -0,0 +1,167 @@
#include "crypto/crypto.hh"
#include <iostream>
using namespace std;
/* ***************** hmac-sha1 ***************** */
kvz_rtp::crypto::hmac::sha1::sha1(uint8_t *key, size_t key_size):
hmac_(key, key_size)
{
}
kvz_rtp::crypto::hmac::sha1::~sha1()
{
}
void kvz_rtp::crypto::hmac::sha1::update(uint8_t *data, size_t len)
{
hmac_.Update(data, len);
}
void kvz_rtp::crypto::hmac::sha1::final(uint8_t *digest)
{
hmac_.Final(digest);
}
/* ***************** hmac-sha256 ***************** */
kvz_rtp::crypto::hmac::sha256::sha256(uint8_t *key, size_t key_size):
hmac_(key, key_size)
{
}
kvz_rtp::crypto::hmac::sha256::~sha256()
{
}
void kvz_rtp::crypto::hmac::sha256::update(uint8_t *data, size_t len)
{
hmac_.Update(data, len);
}
void kvz_rtp::crypto::hmac::sha256::final(uint8_t *digest)
{
hmac_.Final(digest);
}
/* ***************** sha256 ***************** */
kvz_rtp::crypto::sha256::sha256():
sha_()
{
}
kvz_rtp::crypto::sha256::~sha256()
{
}
void kvz_rtp::crypto::sha256::update(uint8_t *data, size_t len)
{
sha_.Update(data, len);
}
void kvz_rtp::crypto::sha256::final(uint8_t *digest)
{
sha_.Final(digest);
}
/* ***************** aes-128 ***************** */
kvz_rtp::crypto::aes::aes(uint8_t *key, size_t key_size, uint8_t *iv):
enc_(key, key_size, iv),
dec_(key, key_size, iv)
{
}
kvz_rtp::crypto::aes::~aes()
{
}
void kvz_rtp::crypto::aes::encrypt(uint8_t *input, uint8_t *output, size_t len)
{
enc_.ProcessData(input, output, len);
}
void kvz_rtp::crypto::aes::decrypt(uint8_t *input, uint8_t *output, size_t len)
{
dec_.ProcessData(input, output, len);
}
/* ***************** diffie-hellman 3072 ***************** */
kvz_rtp::crypto::dh::dh():
prng_(),
dh_()
{
fprintf(stderr, "HERERERERE TOO\n");
CryptoPP::Integer p(
"0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"
"29024E088A67CC74020BBEA63B139B22514A08798E3404DD"
"EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"
"E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"
"EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D"
"C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F"
"83655D23DCA3AD961C62F356208552BB9ED529077096966D"
"670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B"
"E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9"
"DE2BCBF6955817183995497CEA956AE515D2261898FA0510"
"15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64"
"ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7"
"ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B"
"F12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
"BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31"
"43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF"
);
CryptoPP::Integer g("0x02");
dh_.AccessGroupParameters().Initialize(p, g);
CryptoPP::SecByteBlock t1(dh_.PrivateKeyLength()), t2(dh_.PublicKeyLength());
dh_.GenerateKeyPair(prng_, t1, t2);
CryptoPP::Integer k1(t1, t1.size()), k2(t2, t2.size());
cout << "Private key:\n";
cout << hex << k1 << endl;
cout << "Public key:\n";
cout << hex << k2 << endl;
}
kvz_rtp::crypto::dh::~dh()
{
}
/* ***************** base32 ***************** */
kvz_rtp::crypto::b32::b32():
enc_()
{
}
kvz_rtp::crypto::b32::~b32()
{
}
void kvz_rtp::crypto::b32::encode(uint8_t *input, uint8_t *output, size_t len)
{
enc_.Put(input, len);
enc_.MessageEnd();
CryptoPP::word64 max_ret = enc_.MaxRetrievable();
if (max_ret) {
enc_.Get(output, len);
}
}
/* ***************** random ***************** */
void kvz_rtp::crypto::random::generate_random(uint8_t *out, size_t len)
{
/* do not block ever */
CryptoPP::OS_GenerateRandomBlock(false, out, len);
}

97
src/crypto/crypto.hh Normal file
View File

@ -0,0 +1,97 @@
#pragma once
#include "crypto/3rdparty/cryptopp/aes.h"
#include "crypto/3rdparty/cryptopp/base32.h"
#include "crypto/3rdparty/cryptopp/cryptlib.h"
#include "crypto/3rdparty/cryptopp/dh.h"
#include "crypto/3rdparty/cryptopp/hmac.h"
#include "crypto/3rdparty/cryptopp/modes.h"
#include "crypto/3rdparty/cryptopp/osrng.h"
#include "crypto/3rdparty/cryptopp/sha.h"
namespace kvz_rtp {
namespace crypto {
/* hash-based message authentication code */
namespace hmac {
class sha1 {
public:
sha1(uint8_t *key, size_t key_size);
~sha1();
void update(uint8_t *data, size_t len);
void final(uint8_t *digest);
private:
CryptoPP::HMAC<CryptoPP::SHA1> hmac_;
};
class sha256 {
public:
sha256(uint8_t *key, size_t key_size);
~sha256();
void update(uint8_t *data, size_t len);
void final(uint8_t *digest);
private:
CryptoPP::HMAC<CryptoPP::SHA256> hmac_;
};
};
class sha256 {
public:
sha256();
~sha256();
void update(uint8_t *data, size_t len);
void final(uint8_t *digest);
private:
CryptoPP::SHA256 sha_;
};
class aes {
public:
aes(uint8_t *key, size_t key_size, uint8_t *iv);
~aes();
void encrypt(uint8_t *input, uint8_t *output, size_t len);
void decrypt(uint8_t *input, uint8_t *output, size_t len);
private:
CryptoPP::CTR_Mode<CryptoPP::AES>::Encryption enc_;
CryptoPP::CTR_Mode<CryptoPP::AES>::Decryption dec_;
};
/* diffie-hellman key derivation */
class dh {
public:
dh();
~dh();
/* TODO: generate keys? */
private:
CryptoPP::AutoSeededRandomPool prng_;
CryptoPP::DH dh_;
};
/* base32 */
class b32 {
public:
b32();
~b32();
void encode(uint8_t *input, uint8_t *output, size_t len);
private:
CryptoPP::Base32Encoder enc_;
};
namespace random {
void generate_random(uint8_t *out, size_t len);
};
};
};

203
src/crypto/module.mk Normal file
View File

@ -0,0 +1,203 @@
SOURCES += \
src/crypto/crypto.cc
# src/crypto/3rdparty/cryptopp/dh.cc \
# src/crypto/3rdparty/cryptopp/integer.cc \
# src/crypto/3rdparty/cryptopp/3way.cc \
# src/crypto/3rdparty/cryptopp/adhoc.cc \
# src/crypto/3rdparty/cryptopp/adler32.cc \
# src/crypto/3rdparty/cryptopp/algebra.cc \
# src/crypto/3rdparty/cryptopp/algparam.cc \
# src/crypto/3rdparty/cryptopp/allocate.cc \
# src/crypto/3rdparty/cryptopp/arc4.cc \
# src/crypto/3rdparty/cryptopp/aria.cc \
# src/crypto/3rdparty/cryptopp/aria_simd.cc \
# src/crypto/3rdparty/cryptopp/ariatab.cc \
# src/crypto/3rdparty/cryptopp/asn.cc \
# src/crypto/3rdparty/cryptopp/authenc.cc \
# src/crypto/3rdparty/cryptopp/base32.cc \
# src/crypto/3rdparty/cryptopp/base64.cc \
# src/crypto/3rdparty/cryptopp/basecode.cc \
# src/crypto/3rdparty/cryptopp/bench1.cc \
# src/crypto/3rdparty/cryptopp/bench2.cc \
# src/crypto/3rdparty/cryptopp/bench3.cc \
# src/crypto/3rdparty/cryptopp/bfinit.cc \
# src/crypto/3rdparty/cryptopp/blake2b_simd.cc \
# src/crypto/3rdparty/cryptopp/blake2.cc \
# src/crypto/3rdparty/cryptopp/blake2s_simd.cc \
# src/crypto/3rdparty/cryptopp/blowfish.cc \
# src/crypto/3rdparty/cryptopp/blumshub.cc \
# src/crypto/3rdparty/cryptopp/camellia.cc \
# src/crypto/3rdparty/cryptopp/cast.cc \
# src/crypto/3rdparty/cryptopp/casts.cc \
# src/crypto/3rdparty/cryptopp/cbcmac.cc \
# src/crypto/3rdparty/cryptopp/ccm.cc \
# src/crypto/3rdparty/cryptopp/chacha_avx.cc \
# src/crypto/3rdparty/cryptopp/chacha.cc \
# src/crypto/3rdparty/cryptopp/chachapoly.cc \
# src/crypto/3rdparty/cryptopp/chacha_simd.cc \
# src/crypto/3rdparty/cryptopp/cham.cc \
# src/crypto/3rdparty/cryptopp/cham_simd.cc \
# src/crypto/3rdparty/cryptopp/channels.cc \
# src/crypto/3rdparty/cryptopp/cmac.cc \
# src/crypto/3rdparty/cryptopp/cpu.cc \
# src/crypto/3rdparty/cryptopp/crc.cc \
# src/crypto/3rdparty/cryptopp/crc_simd.cc \
# src/crypto/3rdparty/cryptopp/cryptlib.cc \
# src/crypto/3rdparty/cryptopp/darn.cc \
# src/crypto/3rdparty/cryptopp/datatest.cc \
# src/crypto/3rdparty/cryptopp/default.cc \
# src/crypto/3rdparty/cryptopp/des.cc \
# src/crypto/3rdparty/cryptopp/dessp.cc \
# src/crypto/3rdparty/cryptopp/dh2.cc \
# src/crypto/3rdparty/cryptopp/dll.cc \
# src/crypto/3rdparty/cryptopp/dlltest.cc \
# src/crypto/3rdparty/cryptopp/donna_32.cc \
# src/crypto/3rdparty/cryptopp/donna_64.cc \
# src/crypto/3rdparty/cryptopp/donna_sse.cc \
# src/crypto/3rdparty/cryptopp/dsa.cc \
# src/crypto/3rdparty/cryptopp/eax.cc \
# src/crypto/3rdparty/cryptopp/ec2n.cc \
# src/crypto/3rdparty/cryptopp/eccrypto.cc \
# src/crypto/3rdparty/cryptopp/ecp.cc \
# src/crypto/3rdparty/cryptopp/elgamal.cc \
# src/crypto/3rdparty/cryptopp/emsa2.cc \
# src/crypto/3rdparty/cryptopp/eprecomp.cc \
# src/crypto/3rdparty/cryptopp/esign.cc \
# src/crypto/3rdparty/cryptopp/files.cc \
# src/crypto/3rdparty/cryptopp/filters.cc \
# src/crypto/3rdparty/cryptopp/fips140.cc \
# src/crypto/3rdparty/cryptopp/fipsalgt.cc \
# src/crypto/3rdparty/cryptopp/fipstest.cc \
# src/crypto/3rdparty/cryptopp/gcm.cc \
# src/crypto/3rdparty/cryptopp/gcm_simd.cc \
# src/crypto/3rdparty/cryptopp/gf2_32.cc \
# src/crypto/3rdparty/cryptopp/gf256.cc \
# src/crypto/3rdparty/cryptopp/gf2n.cc \
# src/crypto/3rdparty/cryptopp/gf2n_simd.cc \
# src/crypto/3rdparty/cryptopp/gfpcrypt.cc \
# src/crypto/3rdparty/cryptopp/gost.cc \
# src/crypto/3rdparty/cryptopp/gzip.cc \
# src/crypto/3rdparty/cryptopp/hc128.cc \
# src/crypto/3rdparty/cryptopp/hc256.cc \
# src/crypto/3rdparty/cryptopp/hex.cc \
# src/crypto/3rdparty/cryptopp/hight.cc \
# src/crypto/3rdparty/cryptopp/hmac.cc \
# src/crypto/3rdparty/cryptopp/hrtimer.cc \
# src/crypto/3rdparty/cryptopp/ida.cc \
# src/crypto/3rdparty/cryptopp/idea.cc \
# src/crypto/3rdparty/cryptopp/integer.cc \
# src/crypto/3rdparty/cryptopp/iterhash.cc \
# src/crypto/3rdparty/cryptopp/kalyna.cc \
# src/crypto/3rdparty/cryptopp/kalynatab.cc \
# src/crypto/3rdparty/cryptopp/keccak_core.cc \
# src/crypto/3rdparty/cryptopp/keccak.cc \
# src/crypto/3rdparty/cryptopp/keccak_simd.cc \
# src/crypto/3rdparty/cryptopp/lea.cc \
# src/crypto/3rdparty/cryptopp/lea_simd.cc \
# src/crypto/3rdparty/cryptopp/luc.cc \
# src/crypto/3rdparty/cryptopp/mars.cc \
# src/crypto/3rdparty/cryptopp/marss.cc \
# src/crypto/3rdparty/cryptopp/md2.cc \
# src/crypto/3rdparty/cryptopp/md4.cc \
# src/crypto/3rdparty/cryptopp/md5.cc \
# src/crypto/3rdparty/cryptopp/misc.cc \
# src/crypto/3rdparty/cryptopp/modes.cc \
# src/crypto/3rdparty/cryptopp/mqueue.cc \
# src/crypto/3rdparty/cryptopp/mqv.cc \
# src/crypto/3rdparty/cryptopp/nbtheory.cc \
# src/crypto/3rdparty/cryptopp/neon_simd.cc \
# src/crypto/3rdparty/cryptopp/oaep.cc \
# src/crypto/3rdparty/cryptopp/osrng.cc \
# src/crypto/3rdparty/cryptopp/padlkrng.cc \
# src/crypto/3rdparty/cryptopp/panama.cc \
# src/crypto/3rdparty/cryptopp/pch.cc \
# src/crypto/3rdparty/cryptopp/pkcspad.cc \
# src/crypto/3rdparty/cryptopp/poly1305.cc \
# src/crypto/3rdparty/cryptopp/polynomi.cc \
# src/crypto/3rdparty/cryptopp/ppc_power7.cc \
# src/crypto/3rdparty/cryptopp/ppc_power8.cc \
# src/crypto/3rdparty/cryptopp/ppc_power9.cc \
# src/crypto/3rdparty/cryptopp/ppc_simd.cc \
# src/crypto/3rdparty/cryptopp/pssr.cc \
# src/crypto/3rdparty/cryptopp/pubkey.cc \
# src/crypto/3rdparty/cryptopp/queue.cc \
# src/crypto/3rdparty/cryptopp/rabbit.cc \
# src/crypto/3rdparty/cryptopp/rabin.cc \
# src/crypto/3rdparty/cryptopp/randpool.cc \
# src/crypto/3rdparty/cryptopp/rc2.cc \
# src/crypto/3rdparty/cryptopp/rc5.cc \
# src/crypto/3rdparty/cryptopp/rc6.cc \
# src/crypto/3rdparty/cryptopp/rdrand.cc \
# src/crypto/3rdparty/cryptopp/rdtables.cc \
# src/crypto/3rdparty/cryptopp/regtest1.cc \
# src/crypto/3rdparty/cryptopp/regtest2.cc \
# src/crypto/3rdparty/cryptopp/regtest3.cc \
# src/crypto/3rdparty/cryptopp/regtest4.cc \
# src/crypto/3rdparty/cryptopp/rijndael.cc \
# src/crypto/3rdparty/cryptopp/rijndael_simd.cc \
# src/crypto/3rdparty/cryptopp/ripemd.cc \
# src/crypto/3rdparty/cryptopp/rng.cc \
# src/crypto/3rdparty/cryptopp/rsa.cc \
# src/crypto/3rdparty/cryptopp/rw.cc \
# src/crypto/3rdparty/cryptopp/safer.cc \
# src/crypto/3rdparty/cryptopp/salsa.cc \
# src/crypto/3rdparty/cryptopp/scrypt.cc \
# src/crypto/3rdparty/cryptopp/seal.cc \
# src/crypto/3rdparty/cryptopp/seed.cc \
# src/crypto/3rdparty/cryptopp/serpent.cc \
# src/crypto/3rdparty/cryptopp/sha3.cc \
# src/crypto/3rdparty/cryptopp/shacal2.cc \
# src/crypto/3rdparty/cryptopp/shacal2_simd.cc \
# src/crypto/3rdparty/cryptopp/sha.cc \
# src/crypto/3rdparty/cryptopp/shake.cc \
# src/crypto/3rdparty/cryptopp/sharkbox.cc \
# src/crypto/3rdparty/cryptopp/shark.cc \
# src/crypto/3rdparty/cryptopp/sha_simd.cc \
# src/crypto/3rdparty/cryptopp/simeck.cc \
# src/crypto/3rdparty/cryptopp/simeck_simd.cc \
# src/crypto/3rdparty/cryptopp/simon128_simd.cc \
# src/crypto/3rdparty/cryptopp/simon64_simd.cc \
# src/crypto/3rdparty/cryptopp/simon.cc \
# src/crypto/3rdparty/cryptopp/simple.cc \
# src/crypto/3rdparty/cryptopp/skipjack.cc \
# src/crypto/3rdparty/cryptopp/sm3.cc \
# src/crypto/3rdparty/cryptopp/sm4.cc \
# src/crypto/3rdparty/cryptopp/sm4_simd.cc \
# src/crypto/3rdparty/cryptopp/sosemanuk.cc \
# src/crypto/3rdparty/cryptopp/speck128_simd.cc \
# src/crypto/3rdparty/cryptopp/speck64_simd.cc \
# src/crypto/3rdparty/cryptopp/speck.cc \
# src/crypto/3rdparty/cryptopp/square.cc \
# src/crypto/3rdparty/cryptopp/squaretb.cc \
# src/crypto/3rdparty/cryptopp/sse_simd.cc \
# src/crypto/3rdparty/cryptopp/strciphr.cc \
# src/crypto/3rdparty/cryptopp/tea.cc \
# src/crypto/3rdparty/cryptopp/test.cc \
# src/crypto/3rdparty/cryptopp/tftables.cc \
# src/crypto/3rdparty/cryptopp/threefish.cc \
# src/crypto/3rdparty/cryptopp/tiger.cc \
# src/crypto/3rdparty/cryptopp/tigertab.cc \
# src/crypto/3rdparty/cryptopp/ttmac.cc \
# src/crypto/3rdparty/cryptopp/tweetnacl.cc \
# src/crypto/3rdparty/cryptopp/twofish.cc \
# src/crypto/3rdparty/cryptopp/validat0.cc \
# src/crypto/3rdparty/cryptopp/validat10.cc \
# src/crypto/3rdparty/cryptopp/validat1.cc \
# src/crypto/3rdparty/cryptopp/validat2.cc \
# src/crypto/3rdparty/cryptopp/validat3.cc \
# src/crypto/3rdparty/cryptopp/validat4.cc \
# src/crypto/3rdparty/cryptopp/validat5.cc \
# src/crypto/3rdparty/cryptopp/validat6.cc \
# src/crypto/3rdparty/cryptopp/validat7.cc \
# src/crypto/3rdparty/cryptopp/validat8.cc \
# src/crypto/3rdparty/cryptopp/validat9.cc \
# src/crypto/3rdparty/cryptopp/vmac.cc \
# src/crypto/3rdparty/cryptopp/wake.cc \
# src/crypto/3rdparty/cryptopp/whrlpool.cc \
# src/crypto/3rdparty/cryptopp/xed25519.cc \
# src/crypto/3rdparty/cryptopp/xtr.cc \
# src/crypto/3rdparty/cryptopp/xtrcrypt.cc \
# src/crypto/3rdparty/cryptopp/xts.cc \
# src/crypto/3rdparty/cryptopp/zdeflate.cc \
# src/crypto/3rdparty/cryptopp/zinflate.cc \
# src/crypto/3rdparty/cryptopp/zlib.cpp.cc