Merge branch 'master' into qmlapp_pex_alpha

This commit is contained in:
Gioacchino Mazzurco 2017-05-08 13:38:29 +02:00
commit ccaf4881a8
35 changed files with 399 additions and 260 deletions

View file

@ -44,6 +44,12 @@
//#define DEBUG_CHACHA20
#if OPENSSL_VERSION_NUMBER >= 0x010100000L
#define AEAD_chacha20_poly1305_openssl AEAD_chacha20_poly1305
#else
#define AEAD_chacha20_poly1305_rs AEAD_chacha20_poly1305
#endif
namespace librs {
namespace crypto {
@ -273,6 +279,7 @@ static void quotient(const uint256_32& n,const uint256_32& p,uint256_32& q,uint2
q += m ;
}
}
static void remainder(const uint256_32& n,const uint256_32& p,uint256_32& r)
{
// simple algorithm: add up multiples of u while keeping below *this. Once done, substract.
@ -356,7 +363,7 @@ static void print(const chacha20_state& s)
}
#endif
void chacha20_encrypt(uint8_t key[32], uint32_t block_counter, uint8_t nonce[12], uint8_t *data, uint32_t size)
void chacha20_encrypt_rs(uint8_t key[32], uint32_t block_counter, uint8_t nonce[12], uint8_t *data, uint32_t size)
{
for(uint32_t i=0;i<size/64 + 1;++i)
{
@ -379,6 +386,50 @@ void chacha20_encrypt(uint8_t key[32], uint32_t block_counter, uint8_t nonce[12]
}
}
#if OPENSSL_VERSION_NUMBER >= 0x010100000L
void chacha20_encrypt_openssl(uint8_t key[32], uint32_t block_counter, uint8_t nonce[12], uint8_t *data, uint32_t size)
{
EVP_CIPHER_CTX *ctx;
int len;
int tmp_len;
uint8_t tmp[size];
uint8_t iv[16];
// create iv with nonce and block counter
memcpy(iv, &block_counter, 4);
memcpy(iv + 4, nonce, 12);
/* Create and initialise the context */
if(!(ctx = EVP_CIPHER_CTX_new())) return;
/* Initialise the encryption operation. IMPORTANT - ensure you use a key
* and IV size appropriate for your cipher
* In this example we are using 256 bit AES (i.e. a 256 bit key). The
* IV size for *most* modes is the same as the block size. For AES this
* is 128 bits */
if(1 != EVP_EncryptInit_ex(ctx, EVP_chacha20(), NULL, key, iv)) goto out;
/* Provide the message to be encrypted, and obtain the encrypted output.
* EVP_EncryptUpdate can be called multiple times if necessary
*/
if(1 != EVP_EncryptUpdate(ctx, tmp, &len, data, size)) goto out;
tmp_len = len;
/* Finalise the encryption. Further ciphertext bytes may be written at
* this stage.
*/
if(1 != EVP_EncryptFinal_ex(ctx, tmp + len, &len)) goto out;
tmp_len += len;
memcpy(data, tmp, tmp_len);
out:
/* Clean up */
EVP_CIPHER_CTX_free(ctx);
}
#endif
struct poly1305_state
{
uint256_32 r ;
@ -475,7 +526,7 @@ bool constant_time_memory_compare(const uint8_t *m1,const uint8_t *m2,uint32_t s
return !CRYPTO_memcmp(m1,m2,size) ;
}
bool AEAD_chacha20_poly1305(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uint32_t data_size,uint8_t *aad,uint32_t aad_size,uint8_t tag[16],bool encrypt)
bool AEAD_chacha20_poly1305_rs(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uint32_t data_size,uint8_t *aad,uint32_t aad_size,uint8_t tag[16],bool encrypt)
{
// encrypt + tag. See RFC7539-2.8
@ -492,7 +543,7 @@ bool AEAD_chacha20_poly1305(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uin
if(encrypt)
{
chacha20_encrypt(key,1,nonce,data,data_size);
chacha20_encrypt_rs(key,1,nonce,data,data_size);
poly1305_state pls ;
@ -520,19 +571,107 @@ bool AEAD_chacha20_poly1305(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uin
// decrypt
chacha20_encrypt(key,1,nonce,data,data_size);
chacha20_encrypt_rs(key,1,nonce,data,data_size);
return constant_time_memory_compare(tag,computed_tag,16) ;
}
}
#if OPENSSL_VERSION_NUMBER >= 0x010100000L
#define errorOut {ret = false; goto out;}
bool AEAD_chacha20_poly1305_openssl(uint8_t key[32], uint8_t nonce[12], uint8_t *data, uint32_t data_size, uint8_t *aad, uint32_t aad_size, uint8_t tag[16], bool encrypt_or_decrypt)
{
EVP_CIPHER_CTX *ctx;
bool ret = true;
int len;
const uint8_t tag_len = 16;
int tmp_len;
uint8_t tmp[data_size];
/* Create and initialise the context */
if(!(ctx = EVP_CIPHER_CTX_new())) return false;
if (encrypt_or_decrypt) {
/* Initialise the encryption operation. */
if(1 != EVP_EncryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, NULL, NULL)) errorOut
/* Initialise key and IV */
if(1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, nonce)) errorOut
/* Provide any AAD data. This can be called zero or more times as
* required
*/
if(1 != EVP_EncryptUpdate(ctx, NULL, &len, aad, aad_size)) errorOut
/* Provide the message to be encrypted, and obtain the encrypted output.
* EVP_EncryptUpdate can be called multiple times if necessary
*/
if(1 != EVP_EncryptUpdate(ctx, tmp, &len, data, data_size)) errorOut
tmp_len = len;
/* Finalise the encryption. Normally ciphertext bytes may be written at
* this stage, but this does not occur in GCM mode
*/
if(1 != EVP_EncryptFinal_ex(ctx, data + len, &len)) errorOut
tmp_len += len;
/* Get the tag */
if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag_len, tag)) errorOut
} else {
/* Initialise the decryption operation. */
if(!EVP_DecryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, key, nonce)) errorOut
/* Provide any AAD data. This can be called zero or more times as
* required
*/
if(!EVP_DecryptUpdate(ctx, NULL, &len, aad, aad_size)) errorOut
/* Provide the message to be decrypted, and obtain the plaintext output.
* EVP_DecryptUpdate can be called multiple times if necessary
*/
if(!EVP_DecryptUpdate(ctx, tmp, &len, data, data_size)) errorOut
tmp_len = len;
/* Set expected tag value. Works in OpenSSL 1.0.1d and later */
if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, tag)) errorOut
/* Finalise the decryption. A positive return value indicates success,
* anything else is a failure - the plaintext is not trustworthy.
*/
if(EVP_DecryptFinal_ex(ctx, tmp + len, &len) > 0) {
/* Success */
tmp_len += len;
ret = true;
} else {
/* Verify failed */
errorOut
}
}
memcpy(data, tmp, tmp_len);
out:
/* Clean up */
EVP_CIPHER_CTX_free(ctx);
return !!ret;
}
#undef errorOut
#endif
bool AEAD_chacha20_sha256(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uint32_t data_size,uint8_t *aad,uint32_t aad_size,uint8_t tag[16],bool encrypt)
{
// encrypt + tag. See RFC7539-2.8
if(encrypt)
{
chacha20_encrypt(key,1,nonce,data,data_size);
#if OPENSSL_VERSION_NUMBER < 0x10100000L
chacha20_encrypt_rs(key,1,nonce,data,data_size);
#else
chacha20_encrypt_openssl(key, 1, nonce, data, data_size);
#endif
uint8_t computed_tag[EVP_MAX_MD_SIZE];
unsigned int md_size ;
@ -594,7 +733,11 @@ bool AEAD_chacha20_sha256(uint8_t key[32], uint8_t nonce[12],uint8_t *data,uint3
// decrypt
chacha20_encrypt(key,1,nonce,data,data_size);
#if OPENSSL_VERSION_NUMBER < 0x10100000L
chacha20_encrypt_rs(key,1,nonce,data,data_size);
#else
chacha20_encrypt_openssl(key, 1, nonce, data, data_size);
#endif
return constant_time_memory_compare(tag,computed_tag,16) ;
}
@ -674,7 +817,7 @@ bool perform_tests()
0x74, 0x2e
};
chacha20_encrypt(key,1,nounce2,plaintext,7*16+2) ;
chacha20_encrypt_rs(key,1,nounce2,plaintext,7*16+2) ;
#ifdef DEBUG_CHACHA20
fprintf(stdout,"CipherText: \n") ;
@ -1154,12 +1297,12 @@ bool perform_tests()
uint8_t tag[16] ;
uint8_t test_tag[16] = { 0x1a,0xe1,0x0b,0x59,0x4f,0x09,0xe2,0x6a,0x7e,0x90,0x2e,0xcb,0xd0,0x60,0x06,0x91 };
AEAD_chacha20_poly1305(key,nonce,msg,7*16+2,aad,12,tag,true) ;
AEAD_chacha20_poly1305_rs(key,nonce,msg,7*16+2,aad,12,tag,true) ;
if(!constant_time_memory_compare(msg,test_msg,7*16+2)) return false ;
if(!constant_time_memory_compare(tag,test_tag,16)) return false ;
bool res = AEAD_chacha20_poly1305(key,nonce,msg,7*16+2,aad,12,tag,false) ;
bool res = AEAD_chacha20_poly1305_rs(key,nonce,msg,7*16+2,aad,12,tag,false) ;
if(!res) return false ;
}
@ -1197,7 +1340,7 @@ bool perform_tests()
uint8_t received_tag[16] = { 0xee,0xad,0x9d,0x67,0x89,0x0c,0xbb,0x22,0x39,0x23,0x36,0xfe,0xa1,0x85,0x1f,0x38 };
if(!AEAD_chacha20_poly1305(key,nonce,ciphertext,16*16+9,aad,12,received_tag,false))
if(!AEAD_chacha20_poly1305_rs(key,nonce,ciphertext,16*16+9,aad,12,received_tag,false))
return false ;
uint8_t cleartext[16*16+9] = {
@ -1243,21 +1386,29 @@ bool perform_tests()
{
RsScopeTimer s("AEAD1") ;
chacha20_encrypt(key, 1, nonce, ten_megabyte_data,SIZE) ;
chacha20_encrypt_rs(key, 1, nonce, ten_megabyte_data,SIZE) ;
std::cerr << " Chacha20 encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl;
std::cerr << " Chacha20 encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl;
}
{
RsScopeTimer s("AEAD2") ;
AEAD_chacha20_poly1305(key,nonce,ten_megabyte_data,SIZE,aad,12,received_tag,true) ;
AEAD_chacha20_poly1305_rs(key,nonce,ten_megabyte_data,SIZE,aad,12,received_tag,true) ;
std::cerr << " AEAD/poly1305 encryption speed: " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl;
std::cerr << " AEAD/poly1305 own encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl;
}
#if OPENSSL_VERSION_NUMBER >= 0x010100000L
{
RsScopeTimer s("AEAD3") ;
AEAD_chacha20_poly1305_openssl(key,nonce,ten_megabyte_data,SIZE,aad,12,received_tag,true) ;
std::cerr << " AEAD/poly1305 openssl encryption speed: " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl;
}
#endif
{
RsScopeTimer s("AEAD4") ;
AEAD_chacha20_sha256(key,nonce,ten_megabyte_data,SIZE,aad,12,received_tag,true) ;
std::cerr << " AEAD/sha256 encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl;
std::cerr << " AEAD/sha256 encryption speed : " << SIZE / (1024.0*1024.0) / s.duration() << " MB/s" << std::endl;
}
free(ten_megabyte_data) ;

View file

@ -53,11 +53,6 @@ void ftExtraList::data_tick()
bool todo = false;
time_t now = time(NULL);
#ifdef DEBUG_ELIST
//std::cerr << "ftExtraList::run() Iteration";
//std::cerr << std::endl;
#endif
{
RsStackMutex stack(extMutex);
@ -131,6 +126,7 @@ void ftExtraList::hashAFile()
/* stick it in the available queue */
mFiles[details.info.hash] = details;
mHashOfHash[makeEncryptedHash(details.info.hash)] = details.info.hash ;
/* add to the path->hash map */
mHashedList[details.info.path] = details.info.hash;
@ -169,6 +165,7 @@ bool ftExtraList::addExtraFile(std::string path, const RsFileHash& hash,
/* stick it in the available queue */
mFiles[details.info.hash] = details;
mHashOfHash[makeEncryptedHash(details.info.hash)] = details.info.hash ;
IndicateConfigChanged();
@ -190,6 +187,8 @@ bool ftExtraList::removeExtraFile(const RsFileHash& hash, TransferRequestFlags f
RsStackMutex stack(extMutex);
mHashOfHash.erase(makeEncryptedHash(hash)) ;
std::map<RsFileHash, FileDetails>::iterator it;
it = mFiles.find(hash);
if (it == mFiles.end())
@ -242,29 +241,26 @@ bool ftExtraList::cleanupOldFiles()
time_t now = time(NULL);
std::list<RsFileHash> toRemove;
std::list<RsFileHash>::iterator rit;
std::map<RsFileHash, FileDetails>::iterator it;
for(it = mFiles.begin(); it != mFiles.end(); ++it)
{
/* check timestamps */
for( std::map<RsFileHash, FileDetails>::iterator it = mFiles.begin(); it != mFiles.end(); ++it) /* check timestamps */
if ((time_t)it->second.info.age < now)
{
toRemove.push_back(it->first);
}
}
if (toRemove.size() > 0)
{
std::map<RsFileHash, FileDetails>::iterator it;
/* remove items */
for(rit = toRemove.begin(); rit != toRemove.end(); ++rit)
{
for(std::list<RsFileHash>::iterator rit = toRemove.begin(); rit != toRemove.end(); ++rit)
{
if (mFiles.end() != (it = mFiles.find(*rit)))
{
cleanupEntry(it->second.info.path, it->second.info.transfer_info_flags);
mFiles.erase(it);
}
}
mHashOfHash.erase(makeEncryptedHash(*rit)) ;
}
IndicateConfigChanged();
}
return true;
@ -333,31 +329,71 @@ bool ftExtraList::hashExtraFileDone(std::string path, FileInfo &info)
**/
bool ftExtraList::search(const RsFileHash &hash, FileSearchFlags /*hintflags*/, FileInfo &info) const
{
#ifdef DEBUG_ELIST
std::cerr << "ftExtraList::search()";
std::cerr << std::endl;
std::cerr << "ftExtraList::search() hash=" << hash ;
#endif
/* find hash */
std::map<RsFileHash, FileDetails>::const_iterator fit;
if (mFiles.end() == (fit = mFiles.find(hash)))
{
return false;
#ifdef DEBUG_ELIST
std::cerr << " not found in mFiles. Trying encrypted... " ;
#endif
// File not found. We try to look for encrypted hash.
std::map<RsFileHash,RsFileHash>::const_iterator hit = mHashOfHash.find(hash) ;
if(hit == mHashOfHash.end())
{
#ifdef DEBUG_ELIST
std::cerr << " not found." << std::endl;
#endif
return false;
}
#ifdef DEBUG_ELIST
std::cerr << " found! Reaching data..." ;
#endif
fit = mFiles.find(hit->second) ;
if(fit == mFiles.end()) // not found. This is an error.
{
#ifdef DEBUG_ELIST
std::cerr << " no data. Returning false." << std::endl;
#endif
return false ;
}
#ifdef DEBUG_ELIST
std::cerr << " ok! Accepting encrypted transfer." << std::endl;
#endif
info = fit->second.info;
info.storage_permission_flags = FileStorageFlags(DIR_FLAGS_ANONYMOUS_DOWNLOAD) ;
info.transfer_info_flags |= RS_FILE_REQ_ENCRYPTED ;
}
else
{
#ifdef DEBUG_ELIST
std::cerr << " found! Accepting direct transfer" << std::endl;
#endif
info = fit->second.info;
info = fit->second.info;
// Now setup the file storage flags so that the client can know how to handle permissions
//
#warning mr-alice: make sure this is right
info.storage_permission_flags = FileStorageFlags(0) ;//DIR_FLAGS_BROWSABLE_OTHERS ;
// Unencrypted file transfer: We only allow direct transfers. This is not exactly secure since another friend can
// swarm the file. But the hash being kept secret, there's no risk here.
//
info.storage_permission_flags = FileStorageFlags(DIR_FLAGS_BROWSABLE) ;
}
if(info.transfer_info_flags & RS_FILE_REQ_ANONYMOUS_ROUTING) info.storage_permission_flags |= DIR_FLAGS_ANONYMOUS_DOWNLOAD ;
return true;
}
RsFileHash ftExtraList::makeEncryptedHash(const RsFileHash& hash)
{
return RsDirUtil::sha1sum(hash.toByteArray(),hash.SIZE_IN_BYTES);
}
/***
* Configuration - store extra files.
@ -472,6 +508,8 @@ bool ftExtraList::loadList(std::list<RsItem *>& load)
/* stick it in the available queue */
mFiles[details.info.hash] = details;
mHashOfHash[makeEncryptedHash(details.info.hash)] = details.info.hash ;
delete (*it);
/* short sleep */

View file

@ -109,66 +109,69 @@ const uint32_t CLEANUP_PERIOD = 600; /* 10 minutes */
class ftExtraList: public RsTickingThread, public p3Config, public ftSearch
{
public:
public:
ftExtraList();
ftExtraList();
/***
/***
* If the File is alreay Hashed, then just add it in.
**/
bool addExtraFile(std::string path, const RsFileHash &hash,
uint64_t size, uint32_t period, TransferRequestFlags flags);
bool addExtraFile(std::string path, const RsFileHash &hash,
uint64_t size, uint32_t period, TransferRequestFlags flags);
bool removeExtraFile(const RsFileHash& hash, TransferRequestFlags flags);
bool moveExtraFile(std::string fname, const RsFileHash& hash, uint64_t size,
std::string destpath);
bool removeExtraFile(const RsFileHash& hash, TransferRequestFlags flags);
bool moveExtraFile(std::string fname, const RsFileHash& hash, uint64_t size,
std::string destpath);
/***
* Hash file, and add to the files,
/***
* Hash file, and add to the files,
* file is removed after period.
**/
bool hashExtraFile(std::string path, uint32_t period, TransferRequestFlags flags);
bool hashExtraFileDone(std::string path, FileInfo &info);
bool hashExtraFile(std::string path, uint32_t period, TransferRequestFlags flags);
bool hashExtraFileDone(std::string path, FileInfo &info);
/***
* Search Function - used by File Transfer
/***
* Search Function - used by File Transfer
* implementation of ftSearch.
*
**/
virtual bool search(const RsFileHash &hash, FileSearchFlags hintflags, FileInfo &info) const;
virtual bool search(const RsFileHash &hash, FileSearchFlags hintflags, FileInfo &info) const;
/***
* Thread Main Loop
/***
* Thread Main Loop
**/
virtual void data_tick();
virtual void data_tick();
/***
/***
* Configuration - store extra files.
*
**/
protected:
virtual RsSerialiser *setupSerialiser();
virtual bool saveList(bool &cleanup, std::list<RsItem*>&);
virtual bool loadList(std::list<RsItem *>& load);
protected:
virtual RsSerialiser *setupSerialiser();
virtual bool saveList(bool &cleanup, std::list<RsItem*>&);
virtual bool loadList(std::list<RsItem *>& load);
private:
static RsFileHash makeEncryptedHash(const RsFileHash& hash);
/* Worker Functions */
void hashAFile();
bool cleanupOldFiles();
bool cleanupEntry(std::string path, TransferRequestFlags flags);
private:
mutable RsMutex extMutex;
/* Worker Functions */
void hashAFile();
bool cleanupOldFiles();
bool cleanupEntry(std::string path, TransferRequestFlags flags);
std::list<FileDetails> mToHash;
mutable RsMutex extMutex;
std::map<std::string, RsFileHash> mHashedList; /* path -> hash ( not saved ) */
std::map<RsFileHash, FileDetails> mFiles;
std::list<FileDetails> mToHash;
time_t cleanup ;
std::map<std::string, RsFileHash> mHashedList; /* path -> hash ( not saved ) */
std::map<RsFileHash, FileDetails> mFiles;
std::map<RsFileHash, RsFileHash> mHashOfHash; /* sha1(hash) map so as to answer requests to encrypted transfers */
time_t cleanup ;
};

View file

@ -1371,6 +1371,18 @@ bool RsGenExchange::getGroupData(const uint32_t &token, std::vector<RsGxsGrpItem
gItem->meta.mPop = 0;
gItem->meta.mVisibleMsgCount = 0;
}
// Also check the group privacy flags. A while ago, it as possible to publish a group without privacy flags. Now it is not possible anymore.
// As a consequence, it's important to supply a correct value in this flag before the data can be edited/updated.
if((gItem->meta.mGroupFlags & GXS_SERV::FLAG_PRIVACY_MASK) == 0)
{
#ifdef GEN_EXCH_DEBUG
std::cerr << "(WW) getGroupData(): mGroupFlags for group " << gItem->meta.mGroupId << " has incorrect value " << std::hex << gItem->meta.mGroupFlags << std::dec << ". Setting value to GXS_SERV::FLAG_PRIVACY_PUBLIC." << std::endl;
#endif
gItem->meta.mGroupFlags |= GXS_SERV::FLAG_PRIVACY_PUBLIC;
}
grpItem.push_back(gItem);
}
else

View file

@ -7,6 +7,8 @@
#include "serialiser/rsserializer.h"
#include "util/stacktrace.h"
#include <typeinfo>
class RsItem: public RsMemoryManagement::SmallObject
{
public:

View file

@ -162,6 +162,19 @@ void RsNxsGrp::clear()
meta.TlvClear();
}
RsNxsGrp* RsNxsGrp::clone() const {
RsNxsGrp* grp = new RsNxsGrp(this->grp.tlvtype);
*grp = *this;
if(this->metaData)
{
grp->metaData = new RsGxsGrpMetaData();
*(grp->metaData) = *(this->metaData);
}
return grp;
}
void RsNxsSyncGrpReqItem::clear()
{
flag = 0;

View file

@ -37,6 +37,8 @@
#include <map>
#include <vector>
#include <iostream>
#include <typeinfo>
/***
* #define RSSERIAL_DEBUG 1
@ -385,7 +387,7 @@ RsItem * RsSerialiser::deserialise(void *data, uint32_t *size)
//std::cerr << "RsSerialiser::deserialise() RsItem Type: " << std::hex << getRsItemId(data) << " Size: " << pkt_size;
//std::cerr << std::endl;
if (pkt_size != *size)
if (pkt_size > *size)
{
#ifdef RSSERIAL_ERROR_DEBUG
std::cerr << "RsSerialiser::deserialise() ERROR Size mismatch(2)";

View file

@ -60,12 +60,14 @@ RsItem *RsServiceSerializer::deserialise(void *data, uint32_t *size)
item->serial_process(RsGenericSerializer::DESERIALIZE, ctx) ;
if(ctx.mSize != ctx.mOffset)
if(ctx.mSize < ctx.mOffset)
{
std::cerr << "RsSerializer::deserialise(): ERROR. offset does not match expected size!" << std::endl;
delete item ;
return NULL ;
}
*size = ctx.mOffset ;
if(ctx.mOk)
return item ;
@ -96,12 +98,14 @@ RsItem *RsConfigSerializer::deserialise(void *data, uint32_t *size)
item->serial_process(DESERIALIZE, ctx) ;
if(ctx.mSize != ctx.mOffset)
if(ctx.mSize < ctx.mOffset)
{
std::cerr << "RsSerializer::deserialise(): ERROR. offset does not match expected size!" << std::endl;
delete item ;
return NULL ;
}
*size = ctx.mOffset ;
if(ctx.mOk)
return item ;
@ -139,6 +143,8 @@ bool RsGenericSerializer::serialise(RsItem *item,void *data,uint32_t *size)
std::cerr << "RsSerializer::serialise(): ERROR. offset does not match expected size!" << std::endl;
return false ;
}
*size = ctx.mOffset ;
return true ;
}

View file

@ -32,6 +32,9 @@
#include "util/rsprint.h"
#include <iomanip>
#include <typeinfo>
#include <time.h>
static const uint32_t MAX_SERIALIZED_ARRAY_SIZE = 500 ;
static const uint32_t MAX_SERIALIZED_CHUNK_SIZE = 10*1024*1024 ; // 10 MB.

View file

@ -27,6 +27,8 @@
#include "rsitems/rsposteditems.h"
#include <math.h>
#include <typeinfo>
/****
* #define POSTED_DEBUG 1