34#include <gwenhywfar/misc.h>
35#include <gwenhywfar/debug.h>
36#include <gwenhywfar/tlv.h>
37#include <gwenhywfar/gui.h>
38#include <gwenhywfar/text.h>
39#include <gwenhywfar/cryptmgrkeys.h>
77 if (sr->refCount==1) {
78 free(sr->archiveName);
101 if (sr->openMode!=GWEN_Sar_OpenMode_Closed) {
106 free(sr->archiveName);
107 sr->archiveName=strdup(aname);
124 sr->openMode=GWEN_Sar_OpenMode_Created;
142 assert(sr->refCount);
145 if (sr->openMode!=GWEN_Sar_OpenMode_Closed) {
150 free(sr->archiveName);
151 sr->archiveName=strdup(aname);
162 sr->openMode=GWEN_Sar_OpenMode_Opened;
171 sr->openMode=GWEN_Sar_OpenMode_Closed;
186 assert(sr->refCount);
188 if (sr->openMode!=GWEN_Sar_OpenMode_Opened &&
189 sr->openMode!=GWEN_Sar_OpenMode_Created) {
202 free(sr->archiveName);
203 sr->archiveName=
NULL;
204 sr->openMode=GWEN_Sar_OpenMode_Closed;
215 free(sr->archiveName);
216 sr->archiveName=
NULL;
217 sr->openMode=GWEN_Sar_OpenMode_Closed;
223 free(sr->archiveName);
224 sr->archiveName=
NULL;
225 sr->openMode=GWEN_Sar_OpenMode_Closed;
242 v32=GWEN_SAR_HEADER_VERSION;
243 hbuf[0]=(v32>>24) & 0xff;
244 hbuf[1]=(v32>>16) & 0xff;
245 hbuf[2]=(v32>>8) & 0xff;
256 hbuf[0]=(v32>>24) & 0xff;
257 hbuf[1]=(v32>>16) & 0xff;
258 hbuf[2]=(v32>>8) & 0xff;
274 hbuf[0]=(v32>>24) & 0xff;
275 hbuf[1]=(v32>>16) & 0xff;
276 hbuf[2]=(v32>>8) & 0xff;
330 hbuf[0]=(v64>>56) & 0xff;
331 hbuf[1]=(v64>>48) & 0xff;
332 hbuf[2]=(v64>>40) & 0xff;
333 hbuf[3]=(v64>>32) & 0xff;
334 hbuf[4]=(v64>>24) & 0xff;
335 hbuf[5]=(v64>>16) & 0xff;
336 hbuf[6]=(v64>>8) & 0xff;
351 v=(((uint64_t)(p[0]))<<56)+
352 (((uint64_t)(p[1]))<<48)+
353 (((uint64_t)(p[2]))<<40)+
354 (((uint64_t)(p[3]))<<32)+
355 (((uint64_t)(p[4]))<<24)+
356 (((uint64_t)(p[5]))<<16)+
357 (((uint64_t)(p[6]))<<8)+
361 v=(((uint64_t)(p[0]))<<48)+
362 (((uint64_t)(p[1]))<<40)+
363 (((uint64_t)(p[2]))<<32)+
364 (((uint64_t)(p[3]))<<24)+
365 (((uint64_t)(p[4]))<<16)+
366 (((uint64_t)(p[5]))<<8)+
370 v=(((uint64_t)(p[0]))<<40)+
371 (((uint64_t)(p[1]))<<32)+
372 (((uint64_t)(p[2]))<<24)+
373 (((uint64_t)(p[3]))<<16)+
374 (((uint64_t)(p[4]))<<8)+
378 v=(((uint64_t)(p[0]))<<32)+
379 (((uint64_t)(p[1]))<<24)+
380 (((uint64_t)(p[2]))<<16)+
381 (((uint64_t)(p[3]))<<8)+
385 v=(((uint64_t)(p[0]))<<24)+
386 (((uint64_t)(p[1]))<<16)+
387 (((uint64_t)(p[2]))<<8)+
391 v=(((uint64_t)(p[0]))<<16)+
392 (((uint64_t)(p[1]))<<8)+
396 v=(((uint64_t)(p[0]))<<8)+
400 v=((uint64_t)(p[0]));
428 case GWEN_SAR_TAG_HEADER_VERSION:
433 case GWEN_SAR_TAG_HEADER_STATUS:
438 case GWEN_SAR_TAG_HEADER_FLAGS:
443 case GWEN_SAR_TAG_HEADER_PATH:
447 case GWEN_SAR_TAG_HEADER_TYPE:
452 case GWEN_SAR_TAG_HEADER_PERM:
457 case GWEN_SAR_TAG_HEADER_ATIME:
462 case GWEN_SAR_TAG_HEADER_MTIME:
467 case GWEN_SAR_TAG_HEADER_CTIME:
472 case GWEN_SAR_TAG_HEADER_SIZE:
501 assert(sr->refCount);
547 I18N(
"File Operation"),
548 I18N(
"Copying file into archive"),
593 (
unsigned long int)bs, (
unsigned long int) fsize);
628#if ((_BSD_SOURCE || _XOPEN_SOURCE >= 500 || (_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) || _POSIX_C_SOURCE >= 200112L) && !defined(__MINGW32__)) || defined(OS_DARWIN)
637 assert(sr->refCount);
643 rv=readlink(fname, lbuf,
sizeof(lbuf)-1);
646 fname, errno, strerror(errno));
728 assert(sr->refCount);
731#if _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
732 rv=lstat(fname, &st);
738 fname, errno, strerror(errno));
749 switch (st.st_mode & S_IFMT) {
767 if (st.st_mode & S_IRUSR)
769 if (st.st_mode & S_IWUSR)
771 if (st.st_mode & S_IXUSR)
775 if (st.st_mode & S_IRGRP)
779 if (st.st_mode & S_IWGRP)
783 if (st.st_mode & S_IXGRP)
788 if (st.st_mode & S_IROTH)
792 if (st.st_mode & S_IWOTH)
796 if (st.st_mode & S_IXOTH)
945 assert(sr->refCount);
954 int64_t startOfTagHeader;
955 int64_t startOfTagData;
956 unsigned int tagType;
958 uint32_t fullTagSize;
963 startOfTagHeader=pos;
988 startOfTagData=pos+rv;
1003 if (tagType==GWEN_SAR_TAG_HEADER) {
1040 else if (tagType==GWEN_SAR_TAG_FILE) {
1041 if (lastHeader==
NULL) {
1051 (
unsigned long int) tagLength);
1067 else if (tagType==GWEN_SAR_TAG_HASH) {
1068 if (lastHeader==
NULL) {
1084 else if (tagType==GWEN_SAR_TAG_SIGNATURE) {
1087 sr->signaturePos=startOfTagData;
1088 sr->signatureSize=tagLength;
1110 pos=startOfTagData+tagLength;
1135 assert(sr->refCount);
1225 I18N(
"File Operation"),
1226 I18N(
"Extracting file from archive"),
1231 uint8_t fbuf[10240];
1235 if (bs>
sizeof(fbuf))
1282 (
unsigned long int)bs, (
unsigned long int) fsize);
1381#if ((_BSD_SOURCE || _XOPEN_SOURCE >= 500 || (_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) || _POSIX_C_SOURCE >= 200112L) && !defined(__MINGW32__)) || defined(OS_DARWIN)
1394 assert(sr->refCount);
1487 fname, errno, strerror(errno));
1530 rv=chmod(fname, mode);
1533 fname, errno, strerror(errno));
1619 assert(sr->refCount);
1762 rv=mkdir(fname, mode);
1768 fname, errno, strerror(errno));
1840 assert(sr->refCount);
1879 I18N(
"File Operation"),
1880 I18N(
"Unpacking archive file"),
1913 fprintf(stderr,
"Error closing archive (%d)\n", rv);
1928 if (getcwd(savedPwd,
sizeof(savedPwd)-1)==
NULL) {
1932 savedPwd[
sizeof(savedPwd)-1]=0;
1940 if (chdir(savedPwd)) {
1956 assert(sr->refCount);
1958 if (sr->openMode!=GWEN_Sar_OpenMode_Opened &&
1959 sr->openMode!=GWEN_Sar_OpenMode_Created) {
1964 if (sr->signaturePos!=0 || sr->signatureSize!=0) {
1974 uint8_t hashBuf[21];
1999 I18N(
"File Operation"),
2000 I18N(
"Signing archive file"),
2134 assert(sr->refCount);
2136 if (sr->openMode!=GWEN_Sar_OpenMode_Opened &&
2137 sr->openMode!=GWEN_Sar_OpenMode_Created) {
2142 if (sr->signaturePos==0 || sr->signatureSize==0) {
2152 uint8_t hashBuf[21];
2177 I18N(
"File Operation"),
2178 I18N(
"Signing archive file"),
2428 I18N(
"File Operation"),
2429 I18N(
"Checking archive file"),
2462 fprintf(stderr,
"Error closing archive (%d)\n", rv);
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
int GWEN_Buffer_InsertBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
int GWEN_Buffer_IncrementPos(GWEN_BUFFER *bf, uint32_t i)
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
int GWEN_Buffer_SetPos(GWEN_BUFFER *bf, uint32_t i)
int GWEN_Buffer_AdjustUsedBytes(GWEN_BUFFER *bf)
uint32_t GWEN_Buffer_GetBytesLeft(GWEN_BUFFER *bf)
void GWEN_Buffer_Rewind(GWEN_BUFFER *bf)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
int GWEN_Buffer_AllocRoom(GWEN_BUFFER *bf, uint32_t size)
int GWEN_Buffer_ReserveBytes(GWEN_BUFFER *bf, uint32_t res)
struct GWEN_CRYPT_KEY GWEN_CRYPT_KEY
void GWEN_CryptMgr_free(GWEN_CRYPTMGR *cm)
int GWEN_CryptMgr_Sign(GWEN_CRYPTMGR *cm, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *dbuf)
int GWEN_CryptMgr_Verify(GWEN_CRYPTMGR *cm, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *dbuf)
struct GWEN_CRYPTMGR GWEN_CRYPTMGR
GWEN_CRYPTMGR * GWEN_CryptMgrKeys_new(const char *localName, GWEN_CRYPT_KEY *localKey, const char *peerName, GWEN_CRYPT_KEY *peerKey, int ownKeys)
#define DBG_DEBUG(dbg_logger, format, args...)
#define DBG_WARN(dbg_logger, format, args...)
#define DBG_VERBOUS(dbg_logger, format, args...)
#define DBG_INFO(dbg_logger, format, args...)
#define DBG_ERROR(dbg_logger, format, args...)
#define GWEN_ERROR_NOT_OPEN
#define GWEN_ERROR_VERIFY
#define GWEN_ERROR_INVALID
#define GWEN_ERROR_BAD_DATA
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
#define GWEN_GUI_PROGRESS_DELAY
GWENHYWFAR_API uint32_t GWEN_Gui_ProgressStart(uint32_t progressFlags, const char *title, const char *text, uint64_t total, uint32_t guiid)
#define GWEN_GUI_PROGRESS_SHOW_PROGRESS
GWENHYWFAR_API int GWEN_Gui_ProgressEnd(uint32_t id)
#define GWEN_GUI_PROGRESS_SHOW_ABORT
GWENHYWFAR_API int GWEN_Gui_ProgressAdvance(uint32_t id, uint32_t progress)
#define GWEN_GUI_PROGRESS_ONE
#define GWEN_GUI_PROGRESS_ALLOW_EMBED
struct GWEN_TIME GWEN_TIME
GWENHYWFAR_API int GWEN_Time_toUtcString(const GWEN_TIME *t, const char *tmpl, GWEN_BUFFER *buf)
GWENHYWFAR_API GWEN_TIME * GWEN_Time_fromUtcString(const char *s, const char *tmpl)
GWENHYWFAR_API GWEN_TIME * GWEN_Time_fromSeconds(uint32_t s)
GWEN_SAR_FILEHEADER * GWEN_SarFileHeader_List_First(const GWEN_SAR_FILEHEADER_LIST *l)
GWEN_SAR_FILEHEADER * GWEN_SarFileHeader_List_Next(const GWEN_SAR_FILEHEADER *element)
void GWEN_SarFileHeader_List_Add(GWEN_SAR_FILEHEADER *element, GWEN_SAR_FILEHEADER_LIST *list)
void GWEN_SarFileHeader_List_free(GWEN_SAR_FILEHEADER_LIST *l)
GWEN_SAR_FILEHEADER_LIST * GWEN_SarFileHeader_List_new()
uint32_t GWEN_SarFileHeader_List_GetCount(const GWEN_SAR_FILEHEADER_LIST *l)
int GWEN_MDigest_Begin(GWEN_MDIGEST *md)
int GWEN_MDigest_End(GWEN_MDIGEST *md)
unsigned int GWEN_MDigest_GetDigestSize(GWEN_MDIGEST *md)
uint8_t * GWEN_MDigest_GetDigestPtr(GWEN_MDIGEST *md)
void GWEN_MDigest_free(GWEN_MDIGEST *md)
int GWEN_MDigest_Update(GWEN_MDIGEST *md, const uint8_t *buf, unsigned int l)
GWENHYWFAR_API GWEN_MDIGEST * GWEN_MDigest_Rmd160_new(void)
struct GWEN_MDIGEST GWEN_MDIGEST
#define GWEN_FREE_OBJECT(varname)
#define GWEN_NEW_OBJECT(typ, varname)
int GWEN_Sar_ExtractAndDigestFileLink(GWEN_SAR *sr, const GWEN_SAR_FILEHEADER *fh, int checkOnly)
int GWEN_Sar_AddAndDigestFile(GWEN_SAR *sr, const GWEN_SAR_FILEHEADER *fh, GWEN_MDIGEST *md)
int GWEN_Sar_CheckFile(GWEN_SAR *sr, const GWEN_SAR_FILEHEADER *fh)
int GWEN_Sar_ExtractAndDigestFileDir(GWEN_SAR *sr, const GWEN_SAR_FILEHEADER *fh, int checkOnly)
int GWEN_Sar_ExtractAndDigestFileReg(GWEN_SAR *sr, const GWEN_SAR_FILEHEADER *fh, int checkOnly)
int GWEN_Sar_ExtractFile(GWEN_SAR *sr, const GWEN_SAR_FILEHEADER *fh)
int GWEN_Sar_Verify(GWEN_SAR *sr, GWEN_CRYPTMGR *cm)
int GWEN_Sar_AddAndDigestFileReg(GWEN_SAR *sr, const GWEN_SAR_FILEHEADER *fh, GWEN_MDIGEST *md)
int GWEN_Sar_AddAndDigestFileLink(GWEN_SAR *sr, const GWEN_SAR_FILEHEADER *fh, GWEN_MDIGEST *md)
int GWEN_Sar_ScanFile(GWEN_SAR *sr)
int GWEN_Sar_UnpackArchive(const char *inFile, const char *where)
int GWEN_Sar_OpenArchive(GWEN_SAR *sr, const char *aname, GWEN_SYNCIO_FILE_CREATIONMODE cm, uint32_t acc)
int GWEN_Sar_CreateArchive(GWEN_SAR *sr, const char *aname)
void GWEN_Sar_Attach(GWEN_SAR *sr)
int GWEN_Sar_CloseArchive(GWEN_SAR *sr, int abandon)
void GWEN_Sar_free(GWEN_SAR *sr)
int GWEN_Sar__UnpackArchive(const char *inFile, const char *where)
int GWEN_Sar_Sign(GWEN_SAR *sr, GWEN_CRYPTMGR *cm)
int GWEN_Sar_CheckArchive(const char *inFile)
int GWEN_Sar_SignArchive(const char *inFile, const char *signer, GWEN_CRYPT_KEY *key)
int GWEN_Sar_TlvToFileHeader(GWEN_BUFFER *mbuf, GWEN_SAR_FILEHEADER *fh)
int GWEN_Sar_AddFile(GWEN_SAR *sr, const char *fname)
int GWEN_Sar_FileHeaderToTlv(const GWEN_SAR_FILEHEADER *fh, GWEN_BUFFER *tbuf)
GWEN_SAR * GWEN_Sar_new(void)
int GWEN_Sar_ExtractAndDigestFile(GWEN_SAR *sr, const GWEN_SAR_FILEHEADER *fh, int checkOnly)
const GWEN_SAR_FILEHEADER_LIST * GWEN_Sar_GetHeaders(GWEN_SAR *sr)
uint64_t GWEN_Sar_ReadUint64(const uint8_t *p, uint32_t bs)
int GWEN_Sar_VerifyArchive(const char *inFile, const char *signer, GWEN_CRYPT_KEY *key)
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
int GWEN_SyncIo_ReadForced(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
int GWEN_SyncIo_WriteForced(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
int GWEN_SyncIo_Read(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
int GWEN_SyncIo_Flush(GWEN_SYNCIO *sio)
struct GWEN_SYNCIO GWEN_SYNCIO
GWEN_SYNCIO_FILE_CREATIONMODE
@ GWEN_SyncIo_File_CreationMode_CreateNew
@ GWEN_SyncIo_File_CreationMode_CreateAlways
@ GWEN_SyncIo_File_CreationMode_OpenExisting
#define GWEN_SYNCIO_FILE_FLAGS_GWRITE
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
#define GWEN_SYNCIO_FILE_FLAGS_READ
#define GWEN_SYNCIO_FILE_FLAGS_OWRITE
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
GWENHYWFAR_API int64_t GWEN_SyncIo_File_Seek(GWEN_SYNCIO *sio, int64_t pos, GWEN_SYNCIO_FILE_WHENCE whence)
#define GWEN_SYNCIO_FILE_FLAGS_OEXEC
#define GWEN_SYNCIO_FILE_FLAGS_GREAD
#define GWEN_SYNCIO_FILE_FLAGS_OREAD
#define GWEN_SYNCIO_FILE_FLAGS_UEXEC
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
#define GWEN_SYNCIO_FILE_FLAGS_GEXEC
@ GWEN_SyncIo_File_Whence_Set
@ GWEN_SyncIo_File_Whence_Current
@ GWEN_SyncIo_File_Whence_End
void GWEN_Text_LogString(const char *s, unsigned int l, const char *logDomain, GWEN_LOGGER_LEVEL lv)
unsigned int GWEN_TLV_GetTagLength(const GWEN_TLV *tlv)
unsigned int GWEN_TLV_GetTagType(const GWEN_TLV *tlv)
const void * GWEN_TLV_GetTagData(const GWEN_TLV *tlv)
GWEN_TLV * GWEN_TLV_new(void)
int GWEN_TLV_ReadHeader(GWEN_TLV *tlv, const uint8_t *p, uint32_t size, int isBerTlv)
void GWEN_TLV_free(GWEN_TLV *tlv)
GWEN_TLV * GWEN_TLV_fromBuffer(GWEN_BUFFER *mbuf, int isBerTlv)
unsigned int GWEN_TLV_GetTagSize(const GWEN_TLV *tlv)
int GWEN_TLV_DirectlyToBuffer(unsigned int tagType, unsigned int tagMode, const void *tagData, int tagLength, int isBerTlv, GWEN_BUFFER *mbuf)
int GWEN_TLV_WriteHeader(unsigned int tagType, unsigned int tagMode, uint64_t tagLength, int isBerTlv, GWEN_BUFFER *mbuf)