3 * Copyright (C) 2007, Rus V. Brushkoff, All rights reserved.
9 #include <netinet/in.h>
14 #define SFINX_HASH_BUF_SIZE 65536
24 sfinx_hash_t(int alg) {
26 len = gcry_md_get_algo_dlen(algo);
27 err = gcry_md_open (&hd, algo, 0);
29 throw("Can't open hash algorithm !");
30 buf = new u8_t[SFINX_HASH_BUF_SIZE];
36 const char *strvalue() {
37 char *p = (char *) gcry_md_read(hd, algo);
39 for (u32_t i = 0; i < len; i++) {
41 sprintf(b, "%02hhx", p[i]);
44 return strval.c_str();
46 void *value() { return gcry_md_read(hd, algo); }
47 bool hash(const string &file) { return hash(file.c_str()); }
48 bool hash(const char *file) {
49 ifstream f(file, ios::in | ios::binary);
51 debug("Error opening %s", file);
56 f.read((char *)buf, SFINX_HASH_BUF_SIZE);
58 debug("Error reading %s", file);
61 gcry_md_write(hd, buf, f.gcount());
64 // debug("%s", strvalue());
70 u8_t header_[5 + 1 + 4]; // magic + type + next data len
74 virtual int crypt(u32_t size, u8_t **b) = 0;
75 virtual int decrypt(u32_t size, u8_t **b) = 0;
77 static bool get_random_bytes(sfinx_8bit_vector_t &buf, u32_t len) {
78 // get some data from /dev/urandom - somewhat insecure
79 int fd = open("/dev/urandom", O_RDONLY);
84 if (read(fd, &byte, 1) != 1)
91 sfinx_crypter(u8_t t) {
92 strcpy((char *)header_, SFINX_PACKET_MAGIC);
93 header_[5] = type_ = t;
96 virtual ~sfinx_crypter() { }
97 u8_t type() { return type_; }
98 u8_t header_len() { return header_len_; }
99 u8_t *header() { return header_; }
100 bool decrypt(sfinx_elements &buf) { return false; }
101 bool crypt(sfinx_elements &buf) {
104 s8_t data_size_len = -1;
106 u32_t coded_data_size_be32 = buf.code(buf.size(), &data_size_len);
107 header_len_ += data_size_len;
108 memcpy(header_ + 6, ((u8_t *)&coded_data_size_be32) + (sizeof(u32_t) - data_size_len), data_size_len);
109 // debug("got %d elements, %d bytes", buf.n_elements, buf.data_size_);
114 class sfinx_crypter_plain : public sfinx_crypter {
116 sfinx_crypter_plain() : sfinx_crypter(SFINX_PACKET_PLAIN) { }
117 int crypt(u32_t size, u8_t **b) { return 0; }
118 int decrypt(u32_t size, u8_t **b) { return 0; }
121 class sfinx_crypter_crc32 : public sfinx_crypter {
123 sfinx_crypter_crc32() : sfinx_crypter(SFINX_PACKET_CRC32) { }
124 int crypt(u32_t size, u8_t **b) { return 1; }
125 int decrypt(u32_t size, u8_t **b) { return 1; }
128 class sfinx_crypter_aes : public sfinx_crypter {
130 sfinx_crypter_aes() : sfinx_crypter(SFINX_PACKET_CRYPTED_AES) { }
131 int crypt(u32_t size, u8_t **b) { return 1; }
132 int decrypt(u32_t size, u8_t **b) { return 1; }
135 class sfinx_crypter_rsa : public sfinx_crypter {
137 sfinx_crypter_rsa() : sfinx_crypter(SFINX_PACKET_CRYPTED_RSA) { }
138 int crypt(u32_t size, u8_t **b) { return 1; }
139 int decrypt(u32_t size, u8_t **b) { return 1; }