diff options
Diffstat (limited to 'src/network/channel.cpp')
| -rw-r--r-- | src/network/channel.cpp | 36 | 
1 files changed, 20 insertions, 16 deletions
| diff --git a/src/network/channel.cpp b/src/network/channel.cpp index b317f3d..b95e0a1 100644 --- a/src/network/channel.cpp +++ b/src/network/channel.cpp @@ -133,15 +133,17 @@ optional<Stored<ChannelAccept>> Channel::acceptRequest(const Identity & self,  	}));  } -vector<uint8_t> Channel::encrypt(const vector<uint8_t> & plain) +uint64_t Channel::encrypt(BufferCIt plainBegin, BufferCIt plainEnd, +		Buffer & encBuffer, size_t encOffset)  { -	vector<uint8_t> res(plain.size() + 8 + 16 + 16); +	auto plainSize = plainEnd - plainBegin; +	encBuffer.resize(encOffset + plainSize + 8 + 16 + 16);  	array<uint8_t, 12> iv;  	uint64_t beCount = htobe64(nonceCounter++); -	std::memcpy(res.data(), &beCount, 8); +	std::memcpy(encBuffer.data() + encOffset, &beCount, 8);  	std::copy_n(nonceFixedOur.begin(), 6, iv.begin()); -	std::copy_n(res.begin() + 2, 6, iv.begin() + 6); +	std::copy_n(encBuffer.begin() + encOffset + 2, 6, iv.begin() + 6);  	const unique_ptr<EVP_CIPHER_CTX, void(*)(EVP_CIPHER_CTX*)>  		ctx(EVP_CIPHER_CTX_new(), EVP_CIPHER_CTX_free); @@ -149,9 +151,9 @@ vector<uint8_t> Channel::encrypt(const vector<uint8_t> & plain)  			nullptr, key.data(), iv.data());  	int outl = 0; -	uint8_t * cur = res.data() + 8; +	uint8_t * cur = encBuffer.data() + encOffset + 8; -	if (EVP_EncryptUpdate(ctx.get(), cur, &outl, plain.data(), plain.size()) != 1) +	if (EVP_EncryptUpdate(ctx.get(), cur, &outl, &*plainBegin, plainSize) != 1)  		throw runtime_error("failed to encrypt data");  	cur += outl; @@ -162,17 +164,19 @@ vector<uint8_t> Channel::encrypt(const vector<uint8_t> & plain)  	EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_GCM_GET_TAG, 16, cur);  	cur += 16; -	res.resize(cur - res.data()); -	return res; +	encBuffer.resize(cur - encBuffer.data()); +	return 0;  } -optional<vector<uint8_t>> Channel::decrypt(const vector<uint8_t> & ctext) +optional<uint64_t> Channel::decrypt(BufferCIt encBegin, BufferCIt encEnd, +			Buffer & decBuffer, const size_t decOffset)  { -	vector<uint8_t> res(ctext.size()); +	auto encSize = encEnd - encBegin; +	decBuffer.resize(decOffset + encSize);  	array<uint8_t, 12> iv;  	std::copy_n(nonceFixedPeer.begin(), 6, iv.begin()); -	std::copy_n(ctext.begin() + 2, 6, iv.begin() + 6); +	std::copy_n(encBegin + 2, 6, iv.begin() + 6);  	const unique_ptr<EVP_CIPHER_CTX, void(*)(EVP_CIPHER_CTX*)>  		ctx(EVP_CIPHER_CTX_new(), EVP_CIPHER_CTX_free); @@ -180,21 +184,21 @@ optional<vector<uint8_t>> Channel::decrypt(const vector<uint8_t> & ctext)  			nullptr, key.data(), iv.data());  	int outl = 0; -	uint8_t * cur = res.data(); +	uint8_t * cur = decBuffer.data() + decOffset;  	if (EVP_DecryptUpdate(ctx.get(), cur, &outl, -				ctext.data() + 8, ctext.size() - 8 - 16) != 1) +				&*encBegin + 8, encSize - 8 - 16) != 1)  		return nullopt;  	cur += outl;  	if (!EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_GCM_SET_TAG, 16, -				(void *) (ctext.data() + ctext.size() - 16))) +				(void *) (&*encEnd - 16)))  		return nullopt;  	if (EVP_DecryptFinal_ex(ctx.get(), cur, &outl) != 1)  		return nullopt;  	cur += outl; -	res.resize(cur - res.data()); -	return res; +	decBuffer.resize(cur - decBuffer.data()); +	return 0;  } |