58 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| This file is part of Telegram Desktop,
 | |
| the official desktop application for the Telegram messaging service.
 | |
| 
 | |
| For license and copyright information please follow this link:
 | |
| https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | |
| */
 | |
| #pragma once
 | |
| 
 | |
| #include "base/bytes.h"
 | |
| 
 | |
| namespace Storage {
 | |
| 
 | |
| constexpr auto kSaltSize = size_type(64);
 | |
| 
 | |
| class CtrState {
 | |
| public:
 | |
| 	static constexpr auto kBlockSize = size_type(16);
 | |
| 	static constexpr auto kKeySize = size_type(32);
 | |
| 	static constexpr auto kIvSize = kBlockSize;
 | |
| 
 | |
| 	CtrState(bytes::const_span key, bytes::const_span iv);
 | |
| 
 | |
| 	void encrypt(bytes::span data, int64 offset);
 | |
| 	void decrypt(bytes::span data, int64 offset);
 | |
| 
 | |
| private:
 | |
| 	template <typename Method>
 | |
| 	void process(bytes::span data, int64 offset, Method method);
 | |
| 
 | |
| 	bytes::array<kIvSize> incrementedIv(int64 blockIndex);
 | |
| 
 | |
| 	static constexpr auto EcountSize = kBlockSize;
 | |
| 
 | |
| 	bytes::array<kKeySize> _key;
 | |
| 	bytes::array<kIvSize> _iv;
 | |
| 
 | |
| };
 | |
| 
 | |
| class EncryptionKey {
 | |
| public:
 | |
| 	static constexpr auto kSize = size_type(256);
 | |
| 
 | |
| 	EncryptionKey() = default;
 | |
| 	explicit EncryptionKey(bytes::vector &&data);
 | |
| 
 | |
| 	bool empty() const;
 | |
| 	explicit operator bool() const;
 | |
| 
 | |
| 	const bytes::vector &data() const;
 | |
| 	CtrState prepareCtrState(bytes::const_span salt) const;
 | |
| 
 | |
| private:
 | |
| 	bytes::vector _data;
 | |
| 
 | |
| };
 | |
| 
 | |
| } // namespace Storage
 | 
