#include "file_access_encrypted.h" #include "aes256.h" #include "md5.h" #include "os/copymem.h" #define COMP_MAGIC 0x43454447 Error FileAccessEncrypted::open_and_parse(FileAccess *p_base,const Vector& p_key,Mode p_mode) { ERR_FAIL_COND_V(file!=NULL,ERR_ALREADY_IN_USE); if (p_mode==MODE_WRITE_AES256) { ERR_FAIL_COND_V(p_key.size()!=32,ERR_INVALID_PARAMETER); data.clear(); writing=true; file=p_base; mode=p_mode; key=p_key; } return OK; } Error FileAccessEncrypted::open_and_parse_password(FileAccess *p_base,const String& p_key,Mode p_mode){ String cs = p_key.md5_text(); ERR_FAIL_COND_V(cs.length()!=32,ERR_INVALID_PARAMETER); Vector key; key.resize(32); for(int i=0;i<32;i++) { key[i]=cs[i]; } return open_and_parse(p_base,key,p_mode); } Error FileAccessEncrypted::_open(const String& p_path, int p_mode_flags) { return OK; } void FileAccessEncrypted::close() { if (!file) return; if (writing) { Vector compressed; size_t len = data.size(); if (len % 16) { len+=16-(len % 16); } compressed.resize(len); zeromem( compressed.ptr(), len ); for(int i=0;istore_32(COMP_MAGIC); file->store_32(mode); MD5_CTX md5; MD5Init(&md5); MD5Update(&md5,compressed.ptr(),compressed.size()); MD5Final(&md5); file->store_buffer(md5.digest,16); file->store_64(data.size()); file->store_buffer(compressed.ptr(),compressed.size()); file->close(); memdelete(file); file=NULL; } } bool FileAccessEncrypted::is_open() const{ return file!=NULL; } void FileAccessEncrypted::seek(size_t p_position){ if (writing) { if (p_position > (size_t)data.size()) p_position=data.size(); pos=p_position; } } void FileAccessEncrypted::seek_end(int64_t p_position){ seek( data.size() + p_position ); } size_t FileAccessEncrypted::get_pos() const{ return pos; return 0; } size_t FileAccessEncrypted::get_len() const{ if (writing) return data.size(); return 0; } bool FileAccessEncrypted::eof_reached() const{ if (!writing) { } return false; } uint8_t FileAccessEncrypted::get_8() const{ return 0; } int FileAccessEncrypted::get_buffer(uint8_t *p_dst, int p_length) const{ return 0; } Error FileAccessEncrypted::get_error() const{ return OK; } void FileAccessEncrypted::store_buffer(const uint8_t *p_src,int p_length) { ERR_FAIL_COND(!writing); if (pos