aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/clickhouse/src/IO/ReadBufferFromEncryptedFile.h
blob: 155dc2ccce02a5f046ab72f03cdc6d9cbbb7e15a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#pragma once

#include "clickhouse_config.h"

#if USE_SSL
#include <IO/ReadBufferFromFileBase.h>
#include <IO/FileEncryptionCommon.h>


namespace DB
{

/// Reads data from the underlying read buffer and decrypts it.
class ReadBufferFromEncryptedFile : public ReadBufferFromFileBase
{
public:
    ReadBufferFromEncryptedFile(
        size_t buffer_size_,
        std::unique_ptr<ReadBufferFromFileBase> in_,
        const String & key_,
        const FileEncryption::Header & header_,
        size_t offset_ = 0);

    off_t seek(off_t off, int whence) override;
    off_t getPosition() override;

    std::string getFileName() const override { return in->getFileName(); }

    void setReadUntilPosition(size_t position) override { in->setReadUntilPosition(position + FileEncryption::Header::kSize); }

    void setReadUntilEnd() override { in->setReadUntilEnd(); }

    size_t getFileSize() override { return in->getFileSize(); }

private:
    bool nextImpl() override;

    std::unique_ptr<ReadBufferFromFileBase> in;

    off_t offset = 0;

    bool need_seek = false;

    Memory<> encrypted_buffer;
    FileEncryption::Encryptor encryptor;
};

}

#endif