Menu

[r679]: / framework / trunk / encryptor.cpp  Maximize  Restore  History

Download this file

70 lines (59 with data), 1.5 kB

 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "encryptor.h"
#include "base64.h"
#include "cppcms_error.h"
#include <sys/time.h>
#include <time.h>
#include <cstdlib>
using namespace std;
namespace cppcms {
encryptor::~encryptor()
{
}
encryptor::encryptor(string key_):
key(16,0)
{
if(key_.size()!=32) {
throw cppcms_error("Incorrect key length (32 expected)\n");
}
for(unsigned i=0;i<32;i+=2) {
char buf[3];
if(!isxdigit(key_[i]) || !isxdigit(key_[i+1])) {
throw cppcms_error("Cipher should be encoded as hexadecimal 32 digits number");
}
buf[0]=key_[i];
buf[1]=key_[i+1];
buf[2]=0;
unsigned v;
sscanf(buf,"%x",&v);
key[i/2]=v;
}
struct timeval tv;
gettimeofday(&tv,NULL);
seed=(unsigned)(intptr_t)this+tv.tv_sec+tv.tv_usec+getpid();
}
unsigned encryptor::rand(unsigned max)
{
return (unsigned)(rand_r(&seed)/(RAND_MAX+1.0)*max);
}
string encryptor::base64_enc(vector<unsigned char> const &data)
{
size_t size=b64url::encoded_size(data.size());
vector<unsigned char> result(size,0);
b64url::encode(&data.front(),&data.front()+data.size(),&result.front());
return string(result.begin(),result.end());
}
void encryptor::base64_dec(std::string const &in,std::vector<unsigned char> &data)
{
ssize_t size=b64url::decoded_size(in.size());
if(size<0) return;
data.resize(size);
unsigned char const *ptr=(unsigned char const *)in.data();
b64url::decode((unsigned char const *)ptr,ptr+in.size(),&data.front());
}
void encryptor::salt(char *salt)
{
info dummy;
for(unsigned i=0;i<sizeof(dummy.salt);i++)
salt[i]=rand(256);
}
}
MongoDB Logo MongoDB