|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#endif
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#ifndef OS_WIN32
|
|
# include <unistd.h>
|
|
#endif
|
|
#include <gwenhywfar/gwenhywfar.h>
|
|
#include <gwenhywfar/debug.h>
|
|
#include <gwenhywfar/db.h>
|
|
#include <gwenhywfar/xml.h>
|
|
#include <gwenhywfar/msgengine.h>
|
|
#include <gwenhywfar/text.h>
|
|
#include <gwenhywfar/dbio.h>
|
|
#include <gwenhywfar/process.h>
|
|
#include <gwenhywfar/args.h>
|
|
#include <gwenhywfar/base64.h>
|
|
#include <gwenhywfar/misc2.h>
|
|
#include <gwenhywfar/gwentime.h>
|
|
#include <gwenhywfar/fslock.h>
|
|
#include <gwenhywfar/refptr.h>
|
|
#include <gwenhywfar/stringlist2.h>
|
|
#include <gwenhywfar/url.h>
|
|
#include <gwenhywfar/tree.h>
|
|
#include <gwenhywfar/syncio_file.h>
|
|
#include <gwenhywfar/syncio_buffered.h>
|
|
#include <gwenhywfar/syncio_http.h>
|
|
#include <gwenhywfar/syncio_tls.h>
|
|
#include <gwenhywfar/smalltresor.h>
|
|
#ifdef OS_WIN32
|
|
# include <windows.h>
|
|
# include <winsock.h>
|
|
# define sleep(x) Sleep(x*1000)
|
|
# define strcasecmp(a, b) strcmp(a, b)
|
|
#else
|
|
# include <sys/socket.h>
|
|
# include <netinet/in.h>
|
|
#endif
|
|
|
|
#include <gwenhywfar/idmap.h>
|
|
#include <gwenhywfar/idlist.h>
|
|
#include <gwenhywfar/gwensignal.h>
|
|
#include <gwenhywfar/cgui.h>
|
|
|
|
#include <gwenhywfar/cryptdefs.h>
|
|
#include <gwenhywfar/cryptkeysym.h>
|
|
#include <gwenhywfar/mdigest.h>
|
|
#include <gwenhywfar/padd.h>
|
|
|
|
#include <gwenhywfar/httpsession.h>
|
|
#include <gwenhywfar/dialog.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
|
|
#include <gnutls/gnutls.h>
|
|
#include <gcrypt.h>
|
|
|
|
#ifdef WITH_ZIP_TEST
|
|
# include <zlib.h>
|
|
#endif
|
|
|
|
|
|
#ifdef USE_LIBXML2
|
|
# include <libxml/tree.h>
|
|
# include <libxml/parser.h>
|
|
#endif
|
|
|
|
|
|
#include <gwenhywfar/cryptkeyrsa.h>
|
|
#include <gwenhywfar/cryptmgrkeys.h>
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
#ifdef HAVE_ARPA_INET_H
|
|
# include <arpa/inet.h>
|
|
#endif
|
|
|
|
|
|
|
|
static int readFile(const char *fname, GWEN_BUFFER *dbuf) {
|
|
FILE *f;
|
|
|
|
f=fopen(fname, "rb");
|
|
if (f) {
|
|
while(!feof(f)) {
|
|
uint32_t l;
|
|
ssize_t s;
|
|
char *p;
|
|
|
|
GWEN_Buffer_AllocRoom(dbuf, 1024);
|
|
l=GWEN_Buffer_GetMaxUnsegmentedWrite(dbuf);
|
|
p=GWEN_Buffer_GetPosPointer(dbuf);
|
|
s=fread(p, 1, l, f);
|
|
if (s==0)
|
|
break;
|
|
if (s==(ssize_t)-1) {
|
|
DBG_ERROR(0,
|
|
"fread(%s): %s",
|
|
fname, strerror(errno));
|
|
fclose(f);
|
|
return GWEN_ERROR_IO;
|
|
}
|
|
|
|
GWEN_Buffer_IncrementPos(dbuf, s);
|
|
GWEN_Buffer_AdjustUsedBytes(dbuf);
|
|
}
|
|
|
|
fclose(f);
|
|
return 0;
|
|
}
|
|
else {
|
|
DBG_ERROR(0,
|
|
"fopen(%s): %s",
|
|
fname, strerror(errno));
|
|
return GWEN_ERROR_IO;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static int removeCTRL(GWEN_BUFFER *dbuf) {
|
|
char *p1;
|
|
char *p2;
|
|
|
|
p1=GWEN_Buffer_GetStart(dbuf);
|
|
p2=p1;
|
|
while(*p1) {
|
|
if ((*p1)>31)
|
|
*(p2++)=*p1;
|
|
p1++;
|
|
}
|
|
GWEN_Buffer_Crop(dbuf, 0,
|
|
p2-GWEN_Buffer_GetStart(dbuf));
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
static int writeToFile(FILE *f, const char *p, int len) {
|
|
while(len>0) {
|
|
ssize_t l;
|
|
ssize_t s;
|
|
|
|
l=1024;
|
|
if (l>len)
|
|
l=len;
|
|
s=fwrite(p, 1, l, f);
|
|
if (s==(ssize_t)-1 || s==0) {
|
|
DBG_ERROR(0,
|
|
"fwrite: %s",
|
|
strerror(errno));
|
|
return GWEN_ERROR_IO;
|
|
}
|
|
p+=s;
|
|
len-=s;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
static int writeFile(const char *fname, const char *p, int len) {
|
|
FILE *f;
|
|
|
|
f=fopen(fname, "wb");
|
|
if (f) {
|
|
int rv;
|
|
|
|
rv=writeToFile(f, p, len);
|
|
if (rv<0) {
|
|
DBG_ERROR(0, "here (%d)", rv);
|
|
fclose(f);
|
|
return rv;
|
|
}
|
|
if (fclose(f)) {
|
|
DBG_ERROR(0, "here (%d)", rv);
|
|
return rv;
|
|
}
|
|
}
|
|
else {
|
|
DBG_ERROR(0, "fopen(%s): %s",
|
|
fname, strerror(errno));
|
|
return GWEN_ERROR_IO;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
static int zip_inflate(const char *ptr, unsigned int size, GWEN_BUFFER *buf) {
|
|
#ifdef WITH_ZIP_TEST
|
|
z_stream z;
|
|
char outbuf[512];
|
|
int rv;
|
|
int mode;
|
|
|
|
z.next_in=(unsigned char*)ptr;
|
|
z.avail_in=size;
|
|
z.next_out=(unsigned char*)outbuf;
|
|
z.avail_out=sizeof(outbuf);
|
|
z.zalloc=Z_NULL;
|
|
z.zfree=Z_NULL;
|
|
|
|
rv=inflateInit(&z);
|
|
if (rv!=Z_OK) {
|
|
DBG_ERROR(0, "Error on deflateInit (%d)", rv);
|
|
return -1;
|
|
}
|
|
|
|
mode=Z_NO_FLUSH;
|
|
for(;;) {
|
|
rv=inflate(&z, mode);
|
|
if (z.avail_out!=sizeof(outbuf)) {
|
|
GWEN_Buffer_AppendBytes(buf, outbuf, sizeof(outbuf)-z.avail_out);
|
|
z.next_out=(unsigned char*)outbuf;
|
|
z.avail_out=sizeof(outbuf);
|
|
}
|
|
|
|
if (rv==Z_STREAM_END)
|
|
break;
|
|
if (rv!=Z_OK) {
|
|
DBG_ERROR(0, "Error on inflate (%d) [%d, %d]",
|
|
rv, z.avail_out, z.avail_in);
|
|
deflateEnd(&z);
|
|
return -1;
|
|
}
|
|
if (z.avail_in==0)
|
|
mode=Z_FINISH;
|
|
if (z.avail_out==0) {
|
|
GWEN_Buffer_AppendBytes(buf, outbuf, sizeof(outbuf));
|
|
z.next_out=(unsigned char*)outbuf;
|
|
z.avail_out=sizeof(outbuf);
|
|
}
|
|
}
|
|
|
|
if (z.avail_out!=sizeof(outbuf)) {
|
|
GWEN_Buffer_AppendBytes(buf, outbuf, sizeof(outbuf)-z.avail_out);
|
|
z.next_out=(unsigned char*)outbuf;
|
|
z.avail_out=sizeof(outbuf);
|
|
}
|
|
|
|
inflateEnd(&z);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testDB(int argc, char **argv) {
|
|
GWEN_DB_NODE *cfg;
|
|
int rv;
|
|
const char *p;
|
|
GWEN_DB_NODE *dbT;
|
|
|
|
fprintf(stderr,"Creating DB\n");
|
|
cfg=GWEN_DB_Group_new("Config");
|
|
|
|
/* test var 1 */
|
|
fprintf(stderr, "Setting char values\n");
|
|
rv=GWEN_DB_SetCharValue(cfg,
|
|
GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"testgroup/charvar",
|
|
"charvalue1");
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not set value1.\n");
|
|
return 2;
|
|
}
|
|
|
|
dbT=GWEN_DB_GetGroup(cfg, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "testgroup");
|
|
if (!dbT) {
|
|
fprintf(stderr, "ERROR: Could not get group \"testgroup\".\n");
|
|
return 2;
|
|
}
|
|
p=GWEN_DB_GetCharValue(dbT, "charvar", 0, NULL);
|
|
if (p==NULL) {
|
|
fprintf(stderr, "ERROR: Could not get charvar.\n");
|
|
return 2;
|
|
}
|
|
if (strcmp(p, "charvalue1")!=0) {
|
|
fprintf(stderr, "ERROR: Value for charvar does not equal.\n");
|
|
return 2;
|
|
}
|
|
|
|
p=GWEN_DB_GetCharValue(cfg, "testgroup/charvar", 0, NULL);
|
|
if (p==NULL) {
|
|
fprintf(stderr, "ERROR: Could not get charvar with path.\n");
|
|
return 2;
|
|
}
|
|
if (strcmp(p, "charvalue1")!=0) {
|
|
fprintf(stderr, "ERROR: Value for charvar from path does not equal.\n");
|
|
return 2;
|
|
}
|
|
|
|
/* test var 2 */
|
|
fprintf(stderr, "Setting char values 2\n");
|
|
rv=GWEN_DB_SetCharValue(cfg,
|
|
0,
|
|
"testgroup/charvar",
|
|
"charvalue2");
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not set value2.\n");
|
|
return 2;
|
|
}
|
|
|
|
/* test whether charvar1 has changed (it should not) */
|
|
dbT=GWEN_DB_GetGroup(cfg, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "testgroup");
|
|
if (!dbT) {
|
|
fprintf(stderr, "ERROR: Could not get group \"testgroup\".\n");
|
|
return 2;
|
|
}
|
|
p=GWEN_DB_GetCharValue(dbT, "charvar", 0, NULL);
|
|
if (p==NULL) {
|
|
fprintf(stderr, "ERROR: Could not get charvar.\n");
|
|
return 2;
|
|
}
|
|
if (strcmp(p, "charvalue1")!=0) {
|
|
fprintf(stderr,
|
|
"ERROR: Value 1 for charvar does not equal [%s]!=[%s].\n",
|
|
p, "charvalue1");
|
|
return 2;
|
|
}
|
|
|
|
p=GWEN_DB_GetCharValue(cfg, "testgroup/charvar", 0, NULL);
|
|
if (p==NULL) {
|
|
fprintf(stderr, "ERROR: Could not get charvar with path.\n");
|
|
return 2;
|
|
}
|
|
if (strcmp(p, "charvalue1")!=0) {
|
|
fprintf(stderr, "ERROR: Value for charvar from path does not equal.\n");
|
|
return 2;
|
|
}
|
|
|
|
/* test whether charvar value 2 exists (it should) */
|
|
p=GWEN_DB_GetCharValue(dbT, "charvar", 1, NULL);
|
|
if (p==NULL) {
|
|
fprintf(stderr, "ERROR: Could not get charvar 2.\n");
|
|
return 2;
|
|
}
|
|
if (strcmp(p, "charvalue2")!=0) {
|
|
fprintf(stderr, "ERROR: Value 2 for charvar does not equal.\n");
|
|
return 2;
|
|
}
|
|
|
|
p=GWEN_DB_GetCharValue(cfg, "testgroup/charvar", 1, NULL);
|
|
if (p==NULL) {
|
|
fprintf(stderr, "ERROR: Could not get charvar with path.\n");
|
|
return 2;
|
|
}
|
|
if (strcmp(p, "charvalue2")!=0) {
|
|
fprintf(stderr, "ERROR: Value for charvar 2 from path does not equal.\n");
|
|
return 2;
|
|
}
|
|
|
|
|
|
/* test var 2 again, this time overwrite*/
|
|
fprintf(stderr, "Setting char values 2 (overwrite)\n");
|
|
rv=GWEN_DB_SetCharValue(cfg,
|
|
GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"testgroup/charvar",
|
|
"charvalue2");
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not overwrite value2.\n");
|
|
return 2;
|
|
}
|
|
|
|
/* test whether charvar1 has changed (it should have) */
|
|
dbT=GWEN_DB_GetGroup(cfg, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "testgroup");
|
|
if (!dbT) {
|
|
fprintf(stderr, "ERROR: Could not get group \"testgroup\".\n");
|
|
return 2;
|
|
}
|
|
p=GWEN_DB_GetCharValue(dbT, "charvar", 0, NULL);
|
|
if (p==NULL) {
|
|
fprintf(stderr, "ERROR: Could not get charvar.\n");
|
|
return 2;
|
|
}
|
|
if (strcmp(p, "charvalue2")!=0) {
|
|
fprintf(stderr,
|
|
"ERROR: Value 2 (overwrite) for charvar does not "
|
|
"equal [%s]!=[%s].\n",
|
|
p, "charvalue2");
|
|
return 2;
|
|
}
|
|
|
|
p=GWEN_DB_GetCharValue(cfg, "testgroup/charvar", 0, NULL);
|
|
if (p==NULL) {
|
|
fprintf(stderr, "ERROR: Could not get charvar with path.\n");
|
|
return 2;
|
|
}
|
|
if (strcmp(p, "charvalue2")!=0) {
|
|
fprintf(stderr,
|
|
"ERROR: Value for overwritten charvar from "
|
|
"path does not equal.\n");
|
|
return 2;
|
|
}
|
|
|
|
/* test whether charvar value 2 exists (it should not) */
|
|
p=GWEN_DB_GetCharValue(dbT, "charvar", 1, NULL);
|
|
if (p!=NULL) {
|
|
fprintf(stderr, "ERROR: charvar 2 should have been overwritten.\n");
|
|
return 2;
|
|
}
|
|
|
|
p=GWEN_DB_GetCharValue(cfg, "testgroup/charvar", 1, NULL);
|
|
if (p!=NULL) {
|
|
fprintf(stderr, "ERROR: Could not get charvar with path.\n");
|
|
return 2;
|
|
}
|
|
|
|
/* test int values */
|
|
fprintf(stderr, "Setting int values\n");
|
|
rv=GWEN_DB_SetIntValue(cfg,
|
|
GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"testgroup/intvar",
|
|
11);
|
|
|
|
rv=GWEN_DB_SetIntValue(cfg,
|
|
0,
|
|
"testgroup/intvar",
|
|
22);
|
|
fprintf(stderr, "Retrieving int values\n");
|
|
rv=GWEN_DB_GetIntValue(cfg,
|
|
"testgroup/intvar", 0,
|
|
-1);
|
|
if (rv!=11) {
|
|
fprintf(stderr,"ERROR: int value 1 is not 11: %d\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
rv=GWEN_DB_GetIntValue(cfg,
|
|
"testgroup/intvar", 1,
|
|
-1);
|
|
if (rv!=22) {
|
|
fprintf(stderr,"ERROR: int value 1 is not 22: %d\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
GWEN_DB_Dump(cfg, stderr, 2);
|
|
|
|
fprintf(stderr,"Releasing DB\n");
|
|
GWEN_DB_Group_free(cfg);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testDB2(int argc, char **argv) {
|
|
GWEN_DB_NODE *cfg;
|
|
int rv;
|
|
const char *p;
|
|
|
|
fprintf(stderr,"Creating DB\n");
|
|
cfg=GWEN_DB_Group_new("Config");
|
|
|
|
fprintf(stderr, "Setting char values\n");
|
|
GWEN_DB_GetGroup(cfg, GWEN_PATH_FLAGS_CREATE_GROUP, "testgroup");
|
|
GWEN_DB_GetGroup(cfg, GWEN_PATH_FLAGS_CREATE_GROUP, "testgroup");
|
|
|
|
rv=GWEN_DB_SetCharValue(cfg,
|
|
GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"testgroup[1]/charvar",
|
|
"charvalue1");
|
|
rv=GWEN_DB_SetCharValue(cfg,
|
|
0,
|
|
"testgroup[1]/charvar",
|
|
"charvalue2");
|
|
|
|
fprintf(stderr, "Retrieving char values\n");
|
|
p=GWEN_DB_GetCharValue(cfg,
|
|
"testgroup[1]/charvar", 0,
|
|
"defaultValue");
|
|
fprintf(stderr," Retrieved value 1 is: %s\n", p);
|
|
|
|
p=GWEN_DB_GetCharValue(cfg,
|
|
"testgroup[1]/charvar", 1,
|
|
"defaultValue");
|
|
fprintf(stderr," Retrieved value 2 is: %s\n", p);
|
|
|
|
fprintf(stderr, "Setting int values\n");
|
|
rv=GWEN_DB_SetIntValue(cfg,
|
|
GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"testgroup[1]/intvar",
|
|
11);
|
|
|
|
rv=GWEN_DB_SetIntValue(cfg,
|
|
0,
|
|
"testgroup[1]/intvar",
|
|
22);
|
|
fprintf(stderr, "Retrieving int values\n");
|
|
rv=GWEN_DB_GetIntValue(cfg,
|
|
"testgroup[1]/intvar", 0,
|
|
-1);
|
|
fprintf(stderr," Retrieved int value 1 is: %d\n", rv);
|
|
|
|
rv=GWEN_DB_GetIntValue(cfg,
|
|
"testgroup[1]/intvar", 1,
|
|
-1);
|
|
fprintf(stderr," Retrieved int value 2 is: %d\n", rv);
|
|
|
|
GWEN_DB_Dump(cfg, stderr, 2);
|
|
|
|
fprintf(stderr,"Releasing DB\n");
|
|
GWEN_DB_Group_free(cfg);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testDBfile(int argc, char **argv) {
|
|
GWEN_DB_NODE *db;
|
|
|
|
fprintf(stderr,"Creating DB\n");
|
|
db=GWEN_DB_Group_new("Config");
|
|
|
|
fprintf(stderr,"Reading file\n");
|
|
if (GWEN_DB_ReadFile(db, "test.db",
|
|
GWEN_DB_FLAGS_DEFAULT |
|
|
GWEN_PATH_FLAGS_CREATE_GROUP)) {
|
|
fprintf(stderr,"Error reading file.\n");
|
|
return 1;
|
|
}
|
|
fprintf(stderr, "DB is:\n");
|
|
GWEN_DB_Dump(db, stderr, 2);
|
|
fprintf(stderr,"Releasing DB\n");
|
|
GWEN_DB_Group_free(db);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testDBfile2(int argc, char **argv) {
|
|
GWEN_DB_NODE *db;
|
|
|
|
if (argc<4) {
|
|
fprintf(stderr, "%s dbfile2 src dest\n", argv[0]);
|
|
return 1;
|
|
}
|
|
fprintf(stderr,"Creating DB\n");
|
|
db=GWEN_DB_Group_new("Config");
|
|
|
|
fprintf(stderr,"Reading file\n");
|
|
if (GWEN_DB_ReadFile(db, argv[2],
|
|
GWEN_DB_FLAGS_DEFAULT |
|
|
GWEN_PATH_FLAGS_CREATE_GROUP)) {
|
|
fprintf(stderr,"Error reading file.\n");
|
|
return 1;
|
|
}
|
|
|
|
if (GWEN_DB_WriteFile(db, argv[3],
|
|
GWEN_DB_FLAGS_DEFAULT
|
|
&~GWEN_DB_FLAGS_ESCAPE_CHARVALUES)) {
|
|
fprintf(stderr,"Error writing file.\n");
|
|
return 1;
|
|
}
|
|
|
|
fprintf(stderr,"Releasing DB\n");
|
|
GWEN_DB_Group_free(db);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testDBfile3(int argc, char **argv) {
|
|
GWEN_DB_NODE *db;
|
|
|
|
if (argc<4) {
|
|
fprintf(stderr, "%s dbfile3 src dest\n", argv[0]);
|
|
return 1;
|
|
}
|
|
fprintf(stderr,"Creating DB\n");
|
|
db=GWEN_DB_Group_new("Config");
|
|
|
|
fprintf(stderr,"Reading file\n");
|
|
if (GWEN_DB_ReadFile(db, argv[2],
|
|
GWEN_DB_FLAGS_DEFAULT |
|
|
GWEN_PATH_FLAGS_CREATE_GROUP)) {
|
|
fprintf(stderr,"Error reading file.\n");
|
|
return 1;
|
|
}
|
|
|
|
if (GWEN_DB_WriteFile(db, argv[3],
|
|
GWEN_DB_FLAGS_DEFAULT
|
|
&~GWEN_DB_FLAGS_ESCAPE_CHARVALUES)) {
|
|
fprintf(stderr,"Error writing file.\n");
|
|
return 1;
|
|
}
|
|
|
|
fprintf(stderr,"Releasing DB\n");
|
|
GWEN_DB_Group_free(db);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testDBfile4(int argc, char **argv) {
|
|
GWEN_DB_NODE *db;
|
|
|
|
fprintf(stderr,"Creating DB\n");
|
|
db=GWEN_DB_Group_new("Config");
|
|
|
|
fprintf(stderr,"Reading file\n");
|
|
if (GWEN_DB_ReadFile(db, "test.db",
|
|
GWEN_DB_FLAGS_DEFAULT |
|
|
GWEN_PATH_FLAGS_CREATE_GROUP)) {
|
|
fprintf(stderr,"Error reading file.\n");
|
|
return 1;
|
|
}
|
|
fprintf(stderr,"Releasing DB\n");
|
|
GWEN_DB_Group_free(db);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
int testXML(int argc, char **argv) {
|
|
GWEN_XMLNODE *n;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Name of testfile needed.\n");
|
|
return 1;
|
|
}
|
|
n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"root");
|
|
GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Debug);
|
|
GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Verbous);
|
|
if (GWEN_XML_ReadFile(n, argv[2],
|
|
GWEN_XML_FLAGS_DEFAULT |
|
|
GWEN_XML_FLAGS_HANDLE_HEADERS |
|
|
GWEN_XML_FLAGS_TOLERANT_ENDTAGS |
|
|
GWEN_XML_FLAGS_HANDLE_OPEN_HTMLTAGS)) {
|
|
fprintf(stderr, "Error reading XML file.\n");
|
|
return 1;
|
|
}
|
|
fprintf(stderr, "XML file:\n");
|
|
GWEN_XMLNode_Dump(n, stdout, 2);
|
|
GWEN_XMLNode_free(n);
|
|
|
|
fprintf(stderr, "Memory before collection:\n");
|
|
GWEN_Memory_Dump();
|
|
GWEN_Memory_Collect();
|
|
fprintf(stderr, "Memory after collection:\n");
|
|
GWEN_Memory_Dump();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testXML2(int argc, char **argv) {
|
|
GWEN_XMLNODE *n;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Name of testfile needed.\n");
|
|
return 1;
|
|
}
|
|
n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"root");
|
|
GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Debug);
|
|
GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Verbous);
|
|
if (GWEN_XML_ReadFile(n, argv[2],
|
|
GWEN_XML_FLAGS_TOLERANT_ENDTAGS |
|
|
GWEN_XML_FLAGS_HANDLE_OPEN_HTMLTAGS |
|
|
GWEN_XML_FLAGS_DEFAULT)) {
|
|
fprintf(stderr, "Error reading XML file.\n");
|
|
return 1;
|
|
}
|
|
fprintf(stderr, "XML file:\n");
|
|
GWEN_XMLNode_Dump(n, stderr, 2);
|
|
if (GWEN_XMLNode_WriteFile(n, "xml.out",
|
|
GWEN_XML_FLAGS_DEFAULT)){
|
|
fprintf(stderr, "Could not write file xml.out\n");
|
|
return 2;
|
|
}
|
|
GWEN_XMLNode_free(n);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testXML3(int argc, char **argv) {
|
|
GWEN_XMLNODE *n;
|
|
GWEN_XMLNODE *nXml;
|
|
int rv;
|
|
GWEN_XMLNODE_NAMESPACE_LIST *l;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Name of testfile needed.\n");
|
|
return 1;
|
|
}
|
|
n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"root");
|
|
GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Debug);
|
|
GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Verbous);
|
|
if (GWEN_XML_ReadFile(n, argv[2],
|
|
GWEN_XML_FLAGS_TOLERANT_ENDTAGS |
|
|
GWEN_XML_FLAGS_HANDLE_OPEN_HTMLTAGS |
|
|
GWEN_XML_FLAGS_HANDLE_NAMESPACES |
|
|
GWEN_XML_FLAGS_DEFAULT)) {
|
|
fprintf(stderr, "Error reading XML file.\n");
|
|
return 1;
|
|
}
|
|
|
|
nXml=GWEN_XMLNode_GetFirstTag(n);
|
|
assert(nXml);
|
|
|
|
l=GWEN_XMLNode_GetNameSpaces(nXml);
|
|
if (l) {
|
|
GWEN_XMLNODE_NAMESPACE *ns;
|
|
|
|
ns=GWEN_XMLNode_NameSpace_List_First(l);
|
|
while(ns) {
|
|
fprintf(stderr, "- [%s] = [%s]\n",
|
|
GWEN_XMLNode_NameSpace_GetName(ns),
|
|
GWEN_XMLNode_NameSpace_GetUrl(ns));
|
|
ns=GWEN_XMLNode_NameSpace_List_Next(ns);
|
|
}
|
|
}
|
|
|
|
rv=GWEN_XMLNode_Globalize(nXml);
|
|
if (rv) {
|
|
fprintf(stderr, "Could not globalize (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
if (GWEN_XMLNode_WriteFile(n, "xml.out",
|
|
GWEN_XML_FLAGS_HANDLE_NAMESPACES |
|
|
GWEN_XML_FLAGS_DEFAULT)){
|
|
fprintf(stderr, "Could not write file xml.out\n");
|
|
return 2;
|
|
}
|
|
GWEN_XMLNode_free(n);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testXML4(int argc, char **argv) {
|
|
GWEN_XMLNODE *n;
|
|
time_t startTime;
|
|
time_t stopTime;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Name of testfile needed.\n");
|
|
return 1;
|
|
}
|
|
n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"root");
|
|
GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Debug);
|
|
startTime=time(0);
|
|
if (GWEN_XML_ReadFile(n, argv[2], GWEN_XML_FLAGS_DEFAULT)) {
|
|
fprintf(stderr, "Error reading XML file.\n");
|
|
return 1;
|
|
}
|
|
stopTime=time(0);
|
|
GWEN_XMLNode_free(n);
|
|
|
|
fprintf(stderr, "Time for loading: %d secs\n",
|
|
(int)(difftime(stopTime, startTime)));
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testXML5(int argc, char **argv) {
|
|
#ifdef USE_LIBXML2
|
|
xmlDocPtr doc;
|
|
time_t startTime;
|
|
time_t stopTime;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Name of testfile needed.\n");
|
|
return 1;
|
|
}
|
|
startTime=time(0);
|
|
doc=xmlParseFile(argv[2]);
|
|
stopTime=time(0);
|
|
if (doc==0) {
|
|
fprintf(stderr, "Error loading file \"%s\"", argv[2]);
|
|
return -1;
|
|
}
|
|
|
|
fprintf(stderr, "Time for loading: %d secs\n",
|
|
(int)(difftime(stopTime, startTime)));
|
|
#else
|
|
fprintf(stderr, "Compiled without support for LibXML\n");
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testMsg(int argc, char **argv) {
|
|
GWEN_XMLNODE *n;
|
|
GWEN_MSGENGINE *e;
|
|
GWEN_XMLNODE *sn;
|
|
GWEN_DB_NODE *da;
|
|
GWEN_DB_NODE *din;
|
|
GWEN_BUFFER *gbuf;
|
|
|
|
e=GWEN_MsgEngine_new();
|
|
n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"root");
|
|
da=GWEN_DB_Group_new("Data");
|
|
din=GWEN_DB_Group_new("ParsedData");
|
|
gbuf=GWEN_Buffer_new(0, 1024,0,1);
|
|
|
|
if (GWEN_XML_ReadFile(n, "test.xml", GWEN_XML_FLAGS_DEFAULT)) {
|
|
fprintf(stderr, "Error reading XML file.\n");
|
|
return 1;
|
|
}
|
|
|
|
GWEN_MsgEngine_SetDefinitions(e, n, 1);
|
|
sn=GWEN_MsgEngine_FindNodeByProperty(e,
|
|
"SEG",
|
|
"code",
|
|
1,
|
|
"PING");
|
|
if (!sn) {
|
|
fprintf(stderr, "Segment not found.\n");
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Node:\n");
|
|
GWEN_XMLNode_Dump(sn, stderr, 2);
|
|
|
|
GWEN_DB_SetCharValue(da,
|
|
GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"name",
|
|
"Gwenhyfwar-Test");
|
|
GWEN_DB_SetCharValue(da,
|
|
GWEN_DB_FLAGS_OVERWRITE_VARS,
|
|
"version",
|
|
"0.0.1");
|
|
|
|
if (GWEN_MsgEngine_CreateMessageFromNode(e,
|
|
sn,
|
|
gbuf,
|
|
da)) {
|
|
fprintf(stderr, "Error creating message.\n");
|
|
return 3;
|
|
}
|
|
|
|
GWEN_Text_DumpString(GWEN_Buffer_GetStart(gbuf),
|
|
GWEN_Buffer_GetUsedBytes(gbuf),
|
|
stderr, 1);
|
|
|
|
GWEN_Buffer_SetPos(gbuf, 0);
|
|
if (GWEN_MsgEngine_ParseMessage(e,
|
|
sn,
|
|
gbuf,
|
|
din,
|
|
GWEN_MSGENGINE_READ_FLAGS_TRUSTINFO)) {
|
|
fprintf(stderr, "Error parsing message.\n");
|
|
return 3;
|
|
}
|
|
|
|
GWEN_Buffer_free(gbuf);
|
|
GWEN_MsgEngine_free(e);
|
|
GWEN_DB_Group_free(da);
|
|
GWEN_DB_Group_free(din);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testListMsg(int argc, char **argv) {
|
|
GWEN_XMLNODE *n;
|
|
GWEN_MSGENGINE *e;
|
|
GWEN_XMLNODE *sn;
|
|
const char *segname;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Segment name needed.\n");
|
|
return 1;
|
|
}
|
|
segname=argv[2];
|
|
|
|
e=GWEN_MsgEngine_new();
|
|
n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"root");
|
|
|
|
if (GWEN_XML_ReadFile(n, "test.xml", GWEN_XML_FLAGS_DEFAULT)) {
|
|
fprintf(stderr, "Error reading XML file.\n");
|
|
return 1;
|
|
}
|
|
|
|
GWEN_MsgEngine_SetDefinitions(e, n, 1);
|
|
|
|
sn=GWEN_MsgEngine_ListMessage(e,
|
|
"SEG",
|
|
segname,
|
|
0,
|
|
/*GWEN_MSGENGINE_SHOW_FLAGS_NOSET*/ 0);
|
|
if (!sn) {
|
|
fprintf(stderr, "Error listing message.\n");
|
|
return 3;
|
|
}
|
|
|
|
fprintf(stderr, "Node:\n");
|
|
GWEN_XMLNode_Dump(sn, stderr, 2);
|
|
|
|
GWEN_MsgEngine_free(e);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
int testSnprintf(int argc, char **argv) {
|
|
unsigned int i;
|
|
char buffer[256];
|
|
unsigned int p;
|
|
|
|
p=0xdeadbeef;
|
|
i=GWEN_Debug_Snprintf(buffer, sizeof(buffer),
|
|
"Test %010x %s [%s]\n", p, "Some crazy cow", 0);
|
|
buffer[sizeof(buffer)-1]=0;
|
|
fprintf(stderr, "Result: \"%s\" (%d)\n",
|
|
buffer, i);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testProcess(int argc, char **argv) {
|
|
GWEN_Logger_Open(0, "test", "gwentest.log", GWEN_LoggerType_File,
|
|
GWEN_LoggerFacility_User);
|
|
GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Verbous);
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "%s process client|server\n", argv[0]);
|
|
return 1;
|
|
}
|
|
fprintf(stderr, "Ping...\n");
|
|
fprintf(stderr, "argv2 is \"%s\"\n", argv[2]);
|
|
if (strcasecmp(argv[2], "server")==0) {
|
|
GWEN_PROCESS *pr;
|
|
GWEN_PROCESS_STATE pst;
|
|
GWEN_SYNCIO *sio;
|
|
GWEN_BUFFER *tbuf;
|
|
int err;
|
|
|
|
fprintf(stderr, "Creating process\n");
|
|
pr=GWEN_Process_new();
|
|
fprintf(stderr, "Creating process: done\n");
|
|
fprintf(stderr, "Setting flags\n");
|
|
GWEN_Process_AddFlags(pr, GWEN_PROCESS_FLAGS_REDIR_STDOUT);
|
|
fprintf(stderr, "Setting flags: done\n");
|
|
|
|
fprintf(stderr, "Starting process\n");
|
|
pst=GWEN_Process_Start(pr, argv[0], "process client");
|
|
//pst=GWEN_ProcessStateNotStarted;
|
|
if (pst!=GWEN_ProcessStateRunning) {
|
|
fprintf(stderr, "Bad process state \"%d\"", pst);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Started process\n");
|
|
//Sleep(15000);
|
|
//return 0;
|
|
|
|
sio=GWEN_Process_GetStdout(pr);
|
|
assert(sio);
|
|
sio=GWEN_SyncIo_Buffered_new(sio);
|
|
assert(sio);
|
|
tbuf=GWEN_Buffer_new(0, 512, 0, 1);
|
|
do {
|
|
fprintf(stderr, "Will read from client\n");
|
|
err=GWEN_SyncIo_Buffered_ReadLineToBuffer(sio, tbuf);
|
|
if (err<0) {
|
|
fprintf(stderr, "ERROR: Reading from clients output (%d)\n", err);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "DATA: %s\n", GWEN_Buffer_GetStart(tbuf));
|
|
} while(err>=0);
|
|
err=GWEN_SyncIo_Disconnect(sio);
|
|
if (err<0) {
|
|
fprintf(stderr, "ERROR: Closing clients output stream (%d)\n", err);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "INFO: Client disconnected.\n");
|
|
return 0;
|
|
} /* if server */
|
|
else {
|
|
fprintf(stderr, "Hello, I'm the client...\n");
|
|
if (fprintf(stdout, "Hello, I'm the client...\n")<1) {
|
|
fprintf(stderr, "ERROR: Client could not write.\n");
|
|
}
|
|
sleep(10);
|
|
fprintf(stderr, "Client exiting\n");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int testOptions(int argc, char **argv) {
|
|
int rv;
|
|
GWEN_DB_NODE *db;
|
|
GWEN_BUFFER *ubuf;
|
|
const GWEN_ARGS args[]={
|
|
{
|
|
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
|
GWEN_ArgsType_Char, /* type */
|
|
"charOption", /* name */
|
|
1, /* minnum */
|
|
0, /* maxnum */
|
|
"c", /* short option */
|
|
"char", /* long option */
|
|
"char option", /* short description */
|
|
"this is a char option" /* long description */
|
|
},
|
|
{
|
|
0, /* flags */
|
|
GWEN_ArgsType_Int, /* type */
|
|
"boolOption", /* name */
|
|
0, /* minnum */
|
|
0, /* maxnum */
|
|
"b", /* short option */
|
|
"bool", /* long option */
|
|
"bool option", /* short description */
|
|
"This is a bool option.\n" /* long description */
|
|
"It is used to show how the mere existence of an option is interpreted\n"
|
|
"by the command line argument parser"
|
|
},
|
|
{
|
|
GWEN_ARGS_FLAGS_HAS_ARGUMENT | GWEN_ARGS_FLAGS_LAST, /* flags */
|
|
GWEN_ArgsType_Int, /* type */
|
|
"intOption", /* name */
|
|
0, /* minnum */
|
|
0, /* maxnum */
|
|
"i", /* short option */
|
|
"int", /* long option */
|
|
"int option", /* short description */
|
|
"this is an int option" /* long description */
|
|
}
|
|
};
|
|
|
|
db=GWEN_DB_Group_new("arguments");
|
|
rv=GWEN_Args_Check(argc, argv, 1,
|
|
GWEN_ARGS_MODE_ALLOW_FREEPARAM,
|
|
args,
|
|
db);
|
|
if (rv<1) {
|
|
fprintf(stderr, "ERROR: Could not parse (%d)\n", rv);
|
|
}
|
|
else {
|
|
GWEN_DB_Dump(db, stderr, 2);
|
|
}
|
|
|
|
GWEN_DB_Group_free(db);
|
|
|
|
ubuf=GWEN_Buffer_new(0, 1024, 0, 1);
|
|
if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) {
|
|
fprintf(stderr, "ERROR: Could not create help string\n");
|
|
return 1;
|
|
}
|
|
fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf));
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testBase64(int argc, char **argv) {
|
|
GWEN_BUFFER *dst;
|
|
GWEN_BUFFER *src;
|
|
GWEN_BUFFER *tmp;
|
|
FILE *f;
|
|
char buffer[1024];
|
|
int i;
|
|
|
|
if (argc<2) {
|
|
fprintf(stderr, "Name of a file needed\n");
|
|
return 1;
|
|
}
|
|
|
|
dst=GWEN_Buffer_new(0, 600000, 0, 1);
|
|
src=GWEN_Buffer_new(0, 600000, 0, 1);
|
|
f=fopen(argv[2], "r");
|
|
if (!f) {
|
|
perror(argv[2]);
|
|
return 1;
|
|
}
|
|
while(!feof(f)) {
|
|
i=fread(buffer, 1, sizeof(buffer), f);
|
|
if (i<1) {
|
|
perror("fread");
|
|
return 2;
|
|
}
|
|
GWEN_Buffer_AppendBytes(src, buffer, i);
|
|
} /* while */
|
|
fclose(f);
|
|
|
|
if (GWEN_Base64_Encode(/* GCC4 pointer-signedness fix: */ (unsigned char*)GWEN_Buffer_GetStart(src),
|
|
GWEN_Buffer_GetUsedBytes(src),
|
|
dst, 76)) {
|
|
fprintf(stderr, "Error encoding file.\n");
|
|
return 3;
|
|
}
|
|
|
|
f=fopen("base64.out", "w+");
|
|
if (!f) {
|
|
perror(argv[2]);
|
|
return 1;
|
|
}
|
|
if (fwrite(GWEN_Buffer_GetStart(dst),
|
|
GWEN_Buffer_GetUsedBytes(dst), 1, f)!=1) {
|
|
perror("fwrite");
|
|
return 4;
|
|
}
|
|
if (fclose(f)) {
|
|
perror("fclose");
|
|
return 4;
|
|
}
|
|
|
|
tmp=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(src), 0, 1);
|
|
if (GWEN_Base64_Decode(/* GCC4 pointer-signedness fix: */ (unsigned char*)GWEN_Buffer_GetStart(dst),
|
|
GWEN_Buffer_GetUsedBytes(src),
|
|
tmp)) {
|
|
fprintf(stderr, "Error decoding file.\n");
|
|
return 3;
|
|
}
|
|
|
|
f=fopen("base64.out.bin", "w+");
|
|
if (!f) {
|
|
perror(argv[2]);
|
|
return 1;
|
|
}
|
|
if (fwrite(GWEN_Buffer_GetStart(tmp),
|
|
GWEN_Buffer_GetUsedBytes(tmp), 1, f)!=1) {
|
|
perror("fwrite");
|
|
return 4;
|
|
}
|
|
if (fclose(f)) {
|
|
perror("fclose");
|
|
return 4;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int testBase64_2(int argc, char **argv) {
|
|
GWEN_BUFFER *dst;
|
|
GWEN_BUFFER *src;
|
|
FILE *f;
|
|
char buffer[1024];
|
|
int i;
|
|
|
|
if (argc<2) {
|
|
fprintf(stderr, "Name of a file needed\n");
|
|
return 1;
|
|
}
|
|
|
|
dst=GWEN_Buffer_new(0, 600000, 0, 1);
|
|
src=GWEN_Buffer_new(0, 600000, 0, 1);
|
|
f=fopen(argv[2], "r");
|
|
if (!f) {
|
|
perror(argv[2]);
|
|
return 1;
|
|
}
|
|
while(!feof(f)) {
|
|
i=fread(buffer, 1, sizeof(buffer), f);
|
|
if (i<1) {
|
|
perror("fread");
|
|
return 2;
|
|
}
|
|
GWEN_Buffer_AppendBytes(src, buffer, i);
|
|
} /* while */
|
|
fclose(f);
|
|
|
|
DBG_ERROR(0, "Size of src data: %d bytes",
|
|
GWEN_Buffer_GetUsedBytes(src));
|
|
|
|
removeCTRL(src);
|
|
DBG_ERROR(0, "Size of raw data: %d bytes",
|
|
GWEN_Buffer_GetUsedBytes(src));
|
|
|
|
if (GWEN_Base64_Decode(/* GCC4 pointer-signedness fix: */ (unsigned char*)GWEN_Buffer_GetStart(src),
|
|
0,
|
|
dst)) {
|
|
fprintf(stderr, "Error decoding file.\n");
|
|
return 3;
|
|
}
|
|
|
|
f=fopen("base64.out.bin", "w+");
|
|
if (!f) {
|
|
perror(argv[2]);
|
|
return 1;
|
|
}
|
|
if (fwrite(GWEN_Buffer_GetStart(dst),
|
|
GWEN_Buffer_GetUsedBytes(dst), 1, f)!=1) {
|
|
perror("fwrite");
|
|
return 4;
|
|
}
|
|
if (fclose(f)) {
|
|
perror("fclose");
|
|
return 4;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
int testTime(int argc, char **argv) {
|
|
GWEN_TIME *ti1;
|
|
GWEN_TIME *ti2;
|
|
GWEN_DB_NODE *db1;
|
|
GWEN_DB_NODE *db2;
|
|
|
|
ti1=GWEN_CurrentTime();
|
|
assert(ti1);
|
|
|
|
db1=GWEN_DB_Group_new("time");
|
|
if (GWEN_Time_toDb(ti1, db1)) {
|
|
fprintf(stderr, "Error saving time.\n");
|
|
return 1;
|
|
}
|
|
DBG_NOTICE(0, "Time 1:");
|
|
GWEN_DB_Dump(db1, stderr, 2);
|
|
|
|
ti2=GWEN_Time_fromDb(db1);
|
|
db2=GWEN_DB_Group_new("time");
|
|
if (GWEN_Time_toDb(ti2, db2)) {
|
|
fprintf(stderr, "Error saving time.\n");
|
|
return 1;
|
|
}
|
|
DBG_NOTICE(0, "Time 2:");
|
|
GWEN_DB_Dump(db2, stderr, 2);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testTimeToString(int argc, char **argv) {
|
|
GWEN_TIME *t;
|
|
GWEN_BUFFER *tbuf;
|
|
const char *tmpl;
|
|
|
|
if (argc<3)
|
|
tmpl="YYYY/MM/DD hh:mm:ss";
|
|
else
|
|
tmpl=argv[2];
|
|
|
|
t=GWEN_CurrentTime();
|
|
assert(t);
|
|
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
if (GWEN_Time_toString(t, tmpl, tbuf)) {
|
|
fprintf(stderr, "Could not convert time to string.\n");
|
|
return 2;
|
|
}
|
|
fprintf(stdout, "Current date/time: %s\n",
|
|
GWEN_Buffer_GetStart(tbuf));
|
|
GWEN_Buffer_Reset(tbuf);
|
|
|
|
if (GWEN_Time_toUtcString(t, tmpl, tbuf)) {
|
|
fprintf(stderr, "Could not convert time to string.\n");
|
|
return 2;
|
|
}
|
|
fprintf(stdout, "Current UTC date/time: %s\n",
|
|
GWEN_Buffer_GetStart(tbuf));
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testTimeFromString(int argc, char **argv) {
|
|
GWEN_TIME *t;
|
|
const char *s;
|
|
const char *tmpl;
|
|
GWEN_BUFFER *tbuf;
|
|
|
|
if (argc!=4) {
|
|
fprintf(stderr, "Arguments needed: %s %s TEMPLATE DATA\n",
|
|
argv[0], argv[1]);
|
|
return 1;
|
|
}
|
|
|
|
tmpl=argv[2];
|
|
s=argv[3];
|
|
|
|
t=GWEN_Time_fromUtcString(s, tmpl);
|
|
if (!t) {
|
|
fprintf(stderr, "Could not convert string to time.\n");
|
|
return 2;
|
|
}
|
|
|
|
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
if (GWEN_Time_toUtcString(t, "YYYY/MM/DD-hh:mm:ss", tbuf)) {
|
|
fprintf(stderr, "Could not convert time to string.\n");
|
|
return 2;
|
|
}
|
|
fprintf(stdout, "UTC date/time \"%s\": %s\n",
|
|
s, GWEN_Buffer_GetStart(tbuf));
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testOldDbImport(int argc, char **argv) {
|
|
GWEN_DB_NODE *db;
|
|
GWEN_DB_NODE *dbParams;
|
|
|
|
db=GWEN_DB_Group_new("test");
|
|
dbParams=GWEN_DB_Group_new("params");
|
|
if (GWEN_DB_ReadFileAs(db,
|
|
"test.olddb",
|
|
"olddb",
|
|
dbParams,
|
|
GWEN_DB_FLAGS_DEFAULT |
|
|
GWEN_PATH_FLAGS_CREATE_GROUP)) {
|
|
DBG_ERROR(0, "Could not read test file");
|
|
return 2;
|
|
}
|
|
|
|
if (GWEN_DB_WriteFile(db,
|
|
"test.out",
|
|
GWEN_DB_FLAGS_DEFAULT)) {
|
|
DBG_ERROR(0, "Could not write outfile");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testRfc822Import(int argc, char **argv) {
|
|
GWEN_DB_NODE *db;
|
|
GWEN_DB_NODE *dbParams;
|
|
|
|
db=GWEN_DB_Group_new("test");
|
|
dbParams=GWEN_DB_Group_new("params");
|
|
if (GWEN_DB_ReadFileAs(db,
|
|
"test.822",
|
|
"rfc822",
|
|
dbParams,
|
|
GWEN_PATH_FLAGS_CREATE_GROUP |
|
|
GWEN_DB_FLAGS_UNTIL_EMPTY_LINE)) {
|
|
GWEN_DB_Dump(db, stderr, 2);
|
|
DBG_ERROR(0, "Could not read test file");
|
|
return 2;
|
|
}
|
|
|
|
if (GWEN_DB_WriteFile(db,
|
|
"test.out",
|
|
GWEN_DB_FLAGS_DEFAULT)) {
|
|
DBG_ERROR(0, "Could not write outfile");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testRfc822Export(int argc, char **argv) {
|
|
GWEN_DB_NODE *db;
|
|
GWEN_DB_NODE *dbParams;
|
|
GWEN_GUI *gui;
|
|
|
|
fprintf(stderr, "Creating gui.\n");
|
|
gui=GWEN_Gui_CGui_new();
|
|
GWEN_Gui_SetGui(gui);
|
|
|
|
db=GWEN_DB_Group_new("test");
|
|
dbParams=GWEN_DB_Group_new("params");
|
|
if (GWEN_DB_ReadFileAs(db,
|
|
"test.822",
|
|
"rfc822",
|
|
dbParams,
|
|
GWEN_PATH_FLAGS_CREATE_GROUP |
|
|
GWEN_DB_FLAGS_UNTIL_EMPTY_LINE)) {
|
|
DBG_ERROR(0, "Could not read test file");
|
|
return 2;
|
|
}
|
|
|
|
//GWEN_DB_Dump(db, stderr, 2);
|
|
|
|
if (GWEN_DB_WriteFileAs(db,
|
|
"test.822.out",
|
|
"rfc822",
|
|
dbParams,
|
|
GWEN_DB_FLAGS_DEFAULT)) {
|
|
DBG_ERROR(0, "Could not write outfile");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testFsLock(int argc, char **argv) {
|
|
GWEN_FSLOCK *fl;
|
|
GWEN_FSLOCK_RESULT res;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Usage: %s fslock FILENAME\n", argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
fl=GWEN_FSLock_new(argv[2], GWEN_FSLock_TypeFile);
|
|
fprintf(stderr, "Locking %s\n", argv[2]);
|
|
res=GWEN_FSLock_Lock(fl, 30000, 0);
|
|
if (res!=GWEN_FSLock_ResultOk) {
|
|
fprintf(stderr, "Error locking %s: %d\n", argv[2], res);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Holding lock on %s ...\n", argv[2]);
|
|
sleep(10);
|
|
fprintf(stderr, "Unlocking %s\n", argv[2]);
|
|
res=GWEN_FSLock_Unlock(fl);
|
|
if (res!=GWEN_FSLock_ResultOk) {
|
|
fprintf(stderr, "Error unlocking %s: %d\n", argv[2], res);
|
|
return 3;
|
|
}
|
|
fprintf(stderr, "Success.\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testFsLock2(int argc, char **argv) {
|
|
GWEN_FSLOCK *fl;
|
|
GWEN_FSLOCK_RESULT res;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Usage: %s fslock2 FOLDERNAME\n", argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
fl=GWEN_FSLock_new(argv[2], GWEN_FSLock_TypeDir);
|
|
fprintf(stderr, "Locking %s\n", argv[2]);
|
|
res=GWEN_FSLock_Lock(fl, 3000, 0);
|
|
if (res!=GWEN_FSLock_ResultOk) {
|
|
fprintf(stderr, "Error locking %s: %d\n", argv[2], res);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Holding lock on %s ...\n", argv[2]);
|
|
sleep(10);
|
|
fprintf(stderr, "Unlocking %s\n", argv[2]);
|
|
res=GWEN_FSLock_Unlock(fl);
|
|
if (res!=GWEN_FSLock_ResultOk) {
|
|
fprintf(stderr, "Error unlocking %s: %d\n", argv[2], res);
|
|
return 3;
|
|
}
|
|
fprintf(stderr, "Success.\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testPtr(int argc, char **argv) {
|
|
GWEN_REFPTR *rp;
|
|
GWEN_REFPTR *rp2;
|
|
char *dp1;
|
|
char *dp2;
|
|
|
|
dp1=strdup("Hello, World");
|
|
dp2=strdup("Goodbye ;-)");
|
|
rp=GWEN_RefPtr_new(dp1, 0);
|
|
|
|
fprintf(stderr, "Data is: %s\n",
|
|
(char*)GWEN_RefPtr_GetData(rp));
|
|
GWEN_RefPtr_SetData(rp, dp2, 0);
|
|
fprintf(stderr, "Data is now: %s\n",
|
|
(char*)GWEN_RefPtr_GetData(rp));
|
|
|
|
rp2=GWEN_RefPtr_dup(rp);
|
|
fprintf(stderr, "Data2 is: %s\n",
|
|
(char*)GWEN_RefPtr_GetData(rp2));
|
|
GWEN_RefPtr_SetData(rp2, dp2, 0);
|
|
fprintf(stderr, "Data2 is now: %s\n",
|
|
(char*)GWEN_RefPtr_GetData(rp2));
|
|
|
|
GWEN_RefPtr_free(rp);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testStringList2(int argc, char **argv) {
|
|
GWEN_STRINGLIST2 *sl2;
|
|
GWEN_STRINGLIST2 *sl2copy;
|
|
GWEN_STRINGLIST2_ITERATOR *it;
|
|
|
|
GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Info);
|
|
|
|
sl2=GWEN_StringList2_new();
|
|
GWEN_StringList2_AppendString(sl2, "1:First string", 0,
|
|
GWEN_StringList2_IntertMode_NoDouble);
|
|
GWEN_StringList2_AppendString(sl2, "2:Second string", 0,
|
|
GWEN_StringList2_IntertMode_NoDouble);
|
|
GWEN_StringList2_AppendString(sl2, "3:Third string", 0,
|
|
GWEN_StringList2_IntertMode_NoDouble);
|
|
GWEN_StringList2_AppendString(sl2, "4:Fourth string", 0,
|
|
GWEN_StringList2_IntertMode_NoDouble);
|
|
|
|
fprintf(stderr, "List:\n");
|
|
it=GWEN_StringList2_First(sl2);
|
|
if (it) {
|
|
const char *t;
|
|
int i;
|
|
|
|
t=GWEN_StringList2Iterator_Data(it);
|
|
i=0;
|
|
while(t) {
|
|
fprintf(stderr, "String %d: %s [%d]\n", i, t,
|
|
GWEN_StringList2Iterator_GetLinkCount(it));
|
|
t=GWEN_StringList2Iterator_Next(it);
|
|
}
|
|
GWEN_StringList2Iterator_free(it);
|
|
}
|
|
|
|
GWEN_StringList2_AppendString(sl2, strdup("3:Third string"), 1,
|
|
GWEN_StringList2_IntertMode_NoDouble);
|
|
|
|
fprintf(stderr, "List:\n");
|
|
it=GWEN_StringList2_First(sl2);
|
|
if (it) {
|
|
const char *t;
|
|
int i;
|
|
|
|
t=GWEN_StringList2Iterator_Data(it);
|
|
i=0;
|
|
while(t) {
|
|
fprintf(stderr, "String %d: %s [%d]\n", i, t,
|
|
GWEN_StringList2Iterator_GetLinkCount(it));
|
|
t=GWEN_StringList2Iterator_Next(it);
|
|
}
|
|
GWEN_StringList2Iterator_free(it);
|
|
}
|
|
|
|
GWEN_StringList2_AppendString(sl2, "3:Third string", 0,
|
|
GWEN_StringList2_IntertMode_Reuse);
|
|
|
|
fprintf(stderr, "List:\n");
|
|
it=GWEN_StringList2_First(sl2);
|
|
if (it) {
|
|
const char *t;
|
|
int i;
|
|
|
|
t=GWEN_StringList2Iterator_Data(it);
|
|
i=0;
|
|
while(t) {
|
|
fprintf(stderr, "String %d: %s [%d]\n", i, t,
|
|
GWEN_StringList2Iterator_GetLinkCount(it));
|
|
t=GWEN_StringList2Iterator_Next(it);
|
|
}
|
|
GWEN_StringList2Iterator_free(it);
|
|
}
|
|
|
|
GWEN_StringList2_RemoveString(sl2, "3:Third string");
|
|
fprintf(stderr, "List:\n");
|
|
it=GWEN_StringList2_First(sl2);
|
|
if (it) {
|
|
const char *t;
|
|
int i;
|
|
|
|
t=GWEN_StringList2Iterator_Data(it);
|
|
i=0;
|
|
while(t) {
|
|
fprintf(stderr, "String %d: %s [%d]\n", i, t,
|
|
GWEN_StringList2Iterator_GetLinkCount(it));
|
|
t=GWEN_StringList2Iterator_Next(it);
|
|
}
|
|
GWEN_StringList2Iterator_free(it);
|
|
}
|
|
|
|
sl2copy=GWEN_StringList2_dup(sl2);
|
|
fprintf(stderr, "CopyList:\n");
|
|
it=GWEN_StringList2_First(sl2copy);
|
|
if (it) {
|
|
const char *t;
|
|
int i;
|
|
|
|
t=GWEN_StringList2Iterator_Data(it);
|
|
i=0;
|
|
while(t) {
|
|
fprintf(stderr, "String %d: %s [%d]\n", i, t,
|
|
GWEN_StringList2Iterator_GetLinkCount(it));
|
|
t=GWEN_StringList2Iterator_Next(it);
|
|
}
|
|
GWEN_StringList2Iterator_free(it);
|
|
}
|
|
|
|
GWEN_StringList2_RemoveString(sl2, "3:Third string");
|
|
fprintf(stderr, "List:\n");
|
|
it=GWEN_StringList2_First(sl2);
|
|
if (it) {
|
|
const char *t;
|
|
int i;
|
|
|
|
t=GWEN_StringList2Iterator_Data(it);
|
|
i=0;
|
|
while(t) {
|
|
fprintf(stderr, "String %d: %s [%d]\n", i, t,
|
|
GWEN_StringList2Iterator_GetLinkCount(it));
|
|
t=GWEN_StringList2Iterator_Next(it);
|
|
}
|
|
GWEN_StringList2Iterator_free(it);
|
|
}
|
|
fprintf(stderr, "CopyList:\n");
|
|
it=GWEN_StringList2_First(sl2copy);
|
|
if (it) {
|
|
const char *t;
|
|
int i;
|
|
|
|
t=GWEN_StringList2Iterator_Data(it);
|
|
i=0;
|
|
while(t) {
|
|
fprintf(stderr, "String %d: %s [%d]\n", i, t,
|
|
GWEN_StringList2Iterator_GetLinkCount(it));
|
|
t=GWEN_StringList2Iterator_Next(it);
|
|
}
|
|
GWEN_StringList2Iterator_free(it);
|
|
}
|
|
|
|
GWEN_StringList2_RemoveString(sl2copy, "2:Second string");
|
|
fprintf(stderr, "List:\n");
|
|
it=GWEN_StringList2_First(sl2);
|
|
if (it) {
|
|
const char *t;
|
|
int i;
|
|
|
|
t=GWEN_StringList2Iterator_Data(it);
|
|
i=0;
|
|
while(t) {
|
|
fprintf(stderr, "String %d: %s [%d]\n", i, t,
|
|
GWEN_StringList2Iterator_GetLinkCount(it));
|
|
t=GWEN_StringList2Iterator_Next(it);
|
|
}
|
|
GWEN_StringList2Iterator_free(it);
|
|
}
|
|
fprintf(stderr, "CopyList:\n");
|
|
it=GWEN_StringList2_First(sl2copy);
|
|
if (it) {
|
|
const char *t;
|
|
int i;
|
|
|
|
t=GWEN_StringList2Iterator_Data(it);
|
|
i=0;
|
|
while(t) {
|
|
fprintf(stderr, "String %d: %s [%d]\n", i, t,
|
|
GWEN_StringList2Iterator_GetLinkCount(it));
|
|
t=GWEN_StringList2Iterator_Next(it);
|
|
}
|
|
GWEN_StringList2Iterator_free(it);
|
|
}
|
|
|
|
|
|
GWEN_StringList2_free(sl2);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testFuzzy(int argc, char **argv) {
|
|
const char *w1, *w2;
|
|
uint32_t score = 0;
|
|
|
|
if (argc<4) {
|
|
fprintf(stderr, "Two extra-arguments needed.\n");
|
|
return 1;
|
|
}
|
|
w1=argv[2];
|
|
w2=argv[3];
|
|
|
|
//score=GWEN_Text_FuzzyCompare(w1, w2);
|
|
fprintf(stderr, "Similarity: %u\n", score);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testSort(int argc, char **argv) {
|
|
GWEN_STRINGLIST *sl;
|
|
GWEN_STRINGLISTENTRY *se;
|
|
unsigned int j;
|
|
char *x;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "At least one argument for stringlist needed.\n");
|
|
return 1;
|
|
}
|
|
sl=GWEN_StringList_new();
|
|
GWEN_StringList_SetSenseCase(sl, 1);
|
|
for (j=2; j<argc; j++) {
|
|
GWEN_StringList_AppendString(sl, argv[j], 0, 1);
|
|
fprintf(stderr, "Adding string \"%s\"\n", argv[j]);
|
|
}
|
|
GWEN_StringList_Sort(sl, 0, 0);
|
|
|
|
se=GWEN_StringList_FirstEntry(sl);
|
|
while(se) {
|
|
const char *s;
|
|
|
|
s=GWEN_StringListEntry_Data(se);
|
|
fprintf(stderr, "- %s\n", s);
|
|
se=GWEN_StringListEntry_Next(se);
|
|
}
|
|
|
|
x=strdup("Simple test");
|
|
free(x);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testMem(int argc, char **argv) {
|
|
GWEN_XMLNODE *n;
|
|
char *s;
|
|
|
|
n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"root");
|
|
s=strdup("test");
|
|
fprintf(stderr, "String: %s\n", s);
|
|
free(s);
|
|
GWEN_XMLNode_free(n);
|
|
fprintf(stderr, "Memory before collection:\n");
|
|
GWEN_Memory_Dump();
|
|
GWEN_Memory_Collect();
|
|
fprintf(stderr, "Memory after collection:\n");
|
|
GWEN_Memory_Dump();
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testBuffer2(int argc, char **argv) {
|
|
GWEN_BUFFER *buf;
|
|
unsigned int bsize;
|
|
char *ptr;
|
|
|
|
buf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
|
|
GWEN_Buffer_AppendString(buf, "Test");
|
|
GWEN_Buffer_AllocRoom(buf, 512);
|
|
bsize=GWEN_Buffer_GetMaxUnsegmentedWrite(buf);
|
|
ptr=GWEN_Buffer_GetPosPointer(buf);
|
|
memset(ptr, 'X', bsize);
|
|
GWEN_Buffer_IncrementPos(buf, bsize);
|
|
GWEN_Buffer_AdjustUsedBytes(buf);
|
|
GWEN_Buffer_AppendString(buf, "Behind");
|
|
|
|
GWEN_Buffer_Dump(buf, stderr, 2);
|
|
GWEN_Buffer_free(buf);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int testFloatDouble(int argc, char **argv) {
|
|
fprintf(stderr, "Sizeof double: %d float: %d\n",
|
|
(int)sizeof(double), (int)sizeof(float));
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testMap(int argc, char **argv) {
|
|
GWEN_IDMAP *map;
|
|
const char *s1="Test-String1";
|
|
const char *s2="Test-String2";
|
|
const char *s3="Test-String3";
|
|
const char *s;
|
|
uint32_t id;
|
|
GWEN_IDMAP_RESULT res;
|
|
|
|
map=GWEN_IdMap_new(GWEN_IdMapAlgo_Hex4);
|
|
|
|
res=GWEN_IdMap_Insert(map, 1, (void*)s1);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not set pointer1 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_IdMap_Insert(map, 2, (void*)s2);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not set pointer2 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_IdMap_Insert(map, 0x1234, (void*)s3);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not set pointer3 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
s=(const char*)GWEN_IdMap_Find(map, 1);
|
|
if (s && strcasecmp(s, s1)==0) {
|
|
fprintf(stderr, " Pointer1: Ok.\n");
|
|
}
|
|
else {
|
|
fprintf(stderr, "FAILED: Bad pointer1 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
s=(const char*)GWEN_IdMap_Find(map, 2);
|
|
if (s && strcasecmp(s, s2)==0) {
|
|
fprintf(stderr, " Pointer2: Ok.\n");
|
|
}
|
|
else {
|
|
fprintf(stderr, "FAILED: Bad pointer2 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
s=(const char*)GWEN_IdMap_Find(map, 0x1234);
|
|
if (s && strcasecmp(s, s3)==0) {
|
|
fprintf(stderr, " Pointer3: Ok.\n");
|
|
}
|
|
else {
|
|
fprintf(stderr, "FAILED: Bad pointer3 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_IdMap_GetFirst(map, &id);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Not found first pointer (%d).\n", res);
|
|
return 2;
|
|
}
|
|
if (id!=1) {
|
|
fprintf(stderr, "FAILED: First pointer is not 1 (%x).\n", id);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_IdMap_GetNext(map, &id);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Not found 2nd pointer (%d).\n", res);
|
|
return 2;
|
|
}
|
|
if (id!=2) {
|
|
fprintf(stderr, "FAILED: 2nd pointer is not 2 (%x).\n", id);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_IdMap_GetNext(map, &id);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Not found 3rd pointer (%d).\n", res);
|
|
return 2;
|
|
}
|
|
if (id!=0x1234) {
|
|
fprintf(stderr, "FAILED: 3rd pointer is not 0x1234 (%x).\n", id);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_IdMap_GetNext(map, &id);
|
|
if (res!=GWEN_IdMapResult_NotFound) {
|
|
fprintf(stderr,
|
|
"FAILED: Found more pointers than there should be (%d) [%x].\n",
|
|
res, id);
|
|
return 2;
|
|
}
|
|
|
|
|
|
res=GWEN_IdMap_Remove(map, 1);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not reset pointer1 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_IdMap_Remove(map, 2);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not reset pointer1 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_IdMap_Remove(map, 0x1234);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not reset pointer3 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
#define TEST_MAP2_MANY 1000000
|
|
int testMap2(int argc, char **argv) {
|
|
GWEN_IDMAP *map;
|
|
const char *s1="Test-String1";
|
|
const char *s2="Test-String2";
|
|
int i;
|
|
uint32_t id;
|
|
GWEN_IDMAP_RESULT res;
|
|
|
|
map=GWEN_IdMap_new(GWEN_IdMapAlgo_Hex4);
|
|
|
|
fprintf(stderr, " Storing many pointers...");
|
|
for (i=0; i<TEST_MAP2_MANY; i++) {
|
|
const char *s;
|
|
|
|
s=(i & 1)?s2:s1;
|
|
res=GWEN_IdMap_Insert(map, i, (void*)s);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not set pointer %x (%d).\n",
|
|
id, res);
|
|
return 2;
|
|
}
|
|
}
|
|
fprintf(stderr, " done\n");
|
|
|
|
fprintf(stderr, " Reading many pointers...");
|
|
i=0;
|
|
for (res=GWEN_IdMap_GetFirst(map, &id);
|
|
res==GWEN_IdMapResult_Ok;
|
|
res=GWEN_IdMap_GetNext(map, &id)) {
|
|
const char *s;
|
|
const char *sc;
|
|
|
|
if (id!=i) {
|
|
fprintf(stderr,
|
|
"FAILED: Unexpected id %x.\n", id);
|
|
return 2;
|
|
}
|
|
sc=(id & 1)?s2:s1;
|
|
s=(const char*)GWEN_IdMap_Find(map, id);
|
|
if (s!=sc) {
|
|
fprintf(stderr,
|
|
"FAILED: Unexpected pointer for id %x [%s].\n",
|
|
id, s);
|
|
return 2;
|
|
}
|
|
i++;
|
|
}
|
|
if (res!=GWEN_IdMapResult_NotFound) {
|
|
fprintf(stderr,
|
|
"FAILED: Unexpected result (%d).\n", res);
|
|
return 2;
|
|
}
|
|
if (i!=TEST_MAP2_MANY) {
|
|
fprintf(stderr,
|
|
"FAILED: Bad number of ids returned (%d).\n", i);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, " done\n");
|
|
|
|
fprintf(stderr, " Resetting many pointers...");
|
|
for (i=0; i<TEST_MAP2_MANY; i++) {
|
|
const char *s;
|
|
|
|
s=(i & 1)?s2:s1;
|
|
res=GWEN_IdMap_Remove(map, i);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not reset pointer (%d).\n", res);
|
|
return 2;
|
|
}
|
|
}
|
|
fprintf(stderr, " done\n");
|
|
|
|
GWEN_IdMap_free(map);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
GWEN_IDMAP_FUNCTION_DEFS(GWEN_BUFFER, GWEN_Buffer)
|
|
GWEN_IDMAP_FUNCTIONS(GWEN_BUFFER, GWEN_Buffer)
|
|
|
|
|
|
int testMap3(int argc, char **argv) {
|
|
GWEN_BUFFER_IDMAP *map;
|
|
uint32_t id;
|
|
GWEN_IDMAP_RESULT res;
|
|
GWEN_BUFFER *buf1;
|
|
GWEN_BUFFER *buf2;
|
|
GWEN_BUFFER *buf;
|
|
|
|
map=GWEN_Buffer_IdMap_new(GWEN_IdMapAlgo_Hex4);
|
|
buf1=GWEN_Buffer_new(0, 256, 0, 1);
|
|
GWEN_Buffer_AppendString(buf1, "TestBuffer1");
|
|
buf2=GWEN_Buffer_new(0, 256, 0, 1);
|
|
GWEN_Buffer_AppendString(buf2, "TestBuffer2");
|
|
|
|
res=GWEN_Buffer_IdMap_Insert(map, 10, buf1);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not set pointer1 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_Buffer_IdMap_Insert(map, 2, buf2);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not set pointer2 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
buf=GWEN_Buffer_IdMap_Find(map, 10);
|
|
if (buf==buf1) {
|
|
fprintf(stderr, " Pointer1: Ok.\n");
|
|
}
|
|
else {
|
|
fprintf(stderr, "FAILED: Bad pointer1 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
buf=GWEN_Buffer_IdMap_Find(map, 2);
|
|
if (buf==buf2) {
|
|
fprintf(stderr, " Pointer2: Ok.\n");
|
|
}
|
|
else {
|
|
fprintf(stderr, "FAILED: Bad pointer2 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_Buffer_IdMap_GetFirst(map, &id);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Not found first pointer (%d).\n", res);
|
|
return 2;
|
|
}
|
|
if (id!=2) {
|
|
fprintf(stderr, "FAILED: First pointer is not 2 (%x).\n", id);
|
|
GWEN_IdMap_Dump(map, stderr, 2);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_Buffer_IdMap_GetNext(map, &id);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Not found 2nd pointer (%d).\n", res);
|
|
return 2;
|
|
}
|
|
if (id!=10) {
|
|
fprintf(stderr, "FAILED: 2nd pointer is not 10 (%x).\n", id);
|
|
GWEN_IdMap_Dump(map, stderr, 2);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_Buffer_IdMap_GetNext(map, &id);
|
|
if (res!=GWEN_IdMapResult_NotFound) {
|
|
fprintf(stderr,
|
|
"FAILED: Found more pointers than there should be (%d) [%x].\n",
|
|
res, id);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "IdMap:\n");
|
|
GWEN_IdMap_Dump(map, stderr, 2);
|
|
|
|
|
|
res=GWEN_Buffer_IdMap_Remove(map, 10);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not reset pointer1 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_Buffer_IdMap_Remove(map, 2);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not reset pointer1 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testMap4(int argc, char **argv) {
|
|
GWEN_BUFFER_IDMAP *map;
|
|
uint32_t id;
|
|
GWEN_IDMAP_RESULT res;
|
|
GWEN_BUFFER *buf1;
|
|
GWEN_BUFFER *buf2;
|
|
GWEN_BUFFER *buf;
|
|
|
|
map=GWEN_Buffer_IdMap_new(GWEN_IdMapAlgo_Hex4);
|
|
buf1=GWEN_Buffer_new(0, 256, 0, 1);
|
|
GWEN_Buffer_AppendString(buf1, "TestBuffer1");
|
|
buf2=GWEN_Buffer_new(0, 256, 0, 1);
|
|
GWEN_Buffer_AppendString(buf2, "TestBuffer2");
|
|
|
|
res=GWEN_Buffer_IdMap_Insert(map, 10, buf1);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not set pointer1 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
buf=GWEN_Buffer_IdMap_Find(map, 10);
|
|
if (buf==buf1) {
|
|
fprintf(stderr, " Pointer1: Ok.\n");
|
|
}
|
|
else {
|
|
fprintf(stderr, "FAILED: Bad pointer1 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_Buffer_IdMap_GetFirst(map, &id);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Not found first pointer (%d).\n", res);
|
|
return 2;
|
|
}
|
|
if (id!=2) {
|
|
fprintf(stderr, "FAILED: First pointer is not 2 (%x).\n", id);
|
|
return 2;
|
|
}
|
|
|
|
res=GWEN_Buffer_IdMap_GetNext(map, &id);
|
|
if (res!=GWEN_IdMapResult_NotFound) {
|
|
fprintf(stderr,
|
|
"FAILED: Found more pointers than there should be (%d) [%x].\n",
|
|
res, id);
|
|
return 2;
|
|
}
|
|
|
|
|
|
res=GWEN_Buffer_IdMap_Remove(map, 10);
|
|
if (res!=GWEN_IdMapResult_Ok) {
|
|
fprintf(stderr, "FAILED: Could not reset pointer1 (%d).\n", res);
|
|
return 2;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testIdList(int argc, char **argv) {
|
|
GWEN_IDLIST *idl;
|
|
uint32_t id;
|
|
uint32_t hdl;
|
|
int rv;
|
|
|
|
idl=GWEN_IdList_new();
|
|
|
|
rv=GWEN_IdList_AddId(idl, 1);
|
|
if (rv) {
|
|
fprintf(stderr, "FAILED: Could not add id (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
rv=GWEN_IdList_AddId(idl, 2);
|
|
if (rv) {
|
|
fprintf(stderr, "FAILED: Could not add id (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
rv=GWEN_IdList_AddId(idl, 0x1234);
|
|
if (rv) {
|
|
fprintf(stderr, "FAILED: Could not add id (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
rv=GWEN_IdList_HasId(idl, 1);
|
|
if (rv==0) {
|
|
fprintf(stderr, "FAILED: Could not find id 1 (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
rv=GWEN_IdList_HasId(idl, 2);
|
|
if (rv==0) {
|
|
fprintf(stderr, "FAILED: Could not find id 2 (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
rv=GWEN_IdList_HasId(idl, 0x1234);
|
|
if (rv==0) {
|
|
fprintf(stderr, "FAILED: Could not find id 0x1234 (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
id=GWEN_IdList_GetFirstId2(idl, &hdl);
|
|
if (id==0) {
|
|
fprintf(stderr, "FAILED: Not found first id.\n");
|
|
return 2;
|
|
}
|
|
if (id!=1) {
|
|
fprintf(stderr, "FAILED: First id is not 1 (%x).\n", id);
|
|
return 2;
|
|
}
|
|
|
|
id=GWEN_IdList_GetNextId2(idl, &hdl);
|
|
if (id==0) {
|
|
fprintf(stderr, "FAILED: Not found 2nd id.\n");
|
|
return 2;
|
|
}
|
|
if (id!=2) {
|
|
fprintf(stderr, "FAILED: 2nd id is not 2 (%x).\n", id);
|
|
return 2;
|
|
}
|
|
|
|
id=GWEN_IdList_GetNextId2(idl, &hdl);
|
|
if (id==0) {
|
|
fprintf(stderr, "FAILED: Not found 3rd id.\n");
|
|
return 2;
|
|
}
|
|
if (id!=0x1234) {
|
|
fprintf(stderr, "FAILED: 3rd id is not 0x1234 (%x).\n", id);
|
|
return 2;
|
|
}
|
|
|
|
id=GWEN_IdList_GetNextId2(idl, &hdl);
|
|
if (id!=0) {
|
|
fprintf(stderr,
|
|
"FAILED: Found more ids than there should be [%x].\n",
|
|
id);
|
|
return 2;
|
|
}
|
|
|
|
GWEN_IdList_free(idl);
|
|
|
|
fprintf(stderr, "PASSED.\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testXmlDbExport(int argc, char **argv) {
|
|
GWEN_DB_NODE *db;
|
|
GWEN_DB_NODE *dbT;
|
|
GWEN_DB_NODE *dbParams;
|
|
const char *x="BIN_0123456789ABCDEF";
|
|
|
|
db=GWEN_DB_Group_new("RootGroup");
|
|
dbParams=GWEN_DB_Group_new("params");
|
|
|
|
GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT,
|
|
"rootElement", "RootElement");
|
|
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
"TextVar0_1", "CharValue0_1");
|
|
GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
"IntVar0_2", 12345);
|
|
GWEN_DB_SetBinValue(db, GWEN_DB_FLAGS_DEFAULT,
|
|
"BinVar0_3", x, strlen(x));
|
|
|
|
dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "SubGroup1");
|
|
assert(dbT);
|
|
|
|
GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_DEFAULT,
|
|
"TextVar1_1", "CharValue1_1");
|
|
GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_DEFAULT,
|
|
"IntVar1_2", 12345);
|
|
GWEN_DB_SetBinValue(dbT, GWEN_DB_FLAGS_DEFAULT,
|
|
"BinVar1_3", x, strlen(x));
|
|
|
|
dbT=GWEN_DB_GetGroup(dbT, GWEN_DB_FLAGS_DEFAULT, "SubGroup2");
|
|
assert(dbT);
|
|
|
|
GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_DEFAULT,
|
|
"TextVar2_1", "CharValue2_1");
|
|
GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_DEFAULT,
|
|
"IntVar2_2", 12345);
|
|
GWEN_DB_SetBinValue(dbT, GWEN_DB_FLAGS_DEFAULT,
|
|
"BinVar2_3", x, strlen(x));
|
|
|
|
if (GWEN_DB_WriteFileAs(db,
|
|
"test.xmldb.out",
|
|
"xmldb",
|
|
dbParams,
|
|
GWEN_DB_FLAGS_DEFAULT)) {
|
|
DBG_ERROR(0, "Could not write outfile");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testXmlDbImport(int argc, char **argv) {
|
|
GWEN_DB_NODE *db;
|
|
GWEN_DB_NODE *dbParams;
|
|
|
|
db=GWEN_DB_Group_new("TestGroup");
|
|
dbParams=GWEN_DB_Group_new("params");
|
|
GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT,
|
|
"rootElement", "RootElement");
|
|
|
|
if (GWEN_DB_ReadFileAs(db,
|
|
"test.xmldb.out",
|
|
"xmldb",
|
|
dbParams,
|
|
GWEN_DB_FLAGS_DEFAULT |
|
|
GWEN_PATH_FLAGS_CREATE_GROUP)) {
|
|
DBG_ERROR(0, "Could not read test file");
|
|
return 2;
|
|
}
|
|
|
|
if (GWEN_DB_WriteFile(db,
|
|
"test.out",
|
|
GWEN_DB_FLAGS_DEFAULT)) {
|
|
DBG_ERROR(0, "Could not write outfile");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testSignalsFunc(GWEN_SLOT *slot,
|
|
void *userData,
|
|
void *pArg1,
|
|
void *pArg2,
|
|
int iArg3,
|
|
int iArg4) {
|
|
const char *text1;
|
|
const char *text2;
|
|
|
|
text1=(const char*)pArg1;
|
|
text2=(const char*)pArg2;
|
|
DBG_ERROR(0, "Slot %p: \"%s\", \"%s\", %d, %d",
|
|
slot, text1, text2, iArg3, iArg4);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testSignals1(int argc, char **argv) {
|
|
GWEN_SIGNALOBJECT *so1;
|
|
GWEN_SIGNALOBJECT *so2;
|
|
GWEN_SIGNAL *sigTextChanged;
|
|
GWEN_SLOT *slotTextChanged1;
|
|
GWEN_SLOT *slotTextChanged2;
|
|
|
|
so1=GWEN_SignalObject_new(0, 0);
|
|
so2=GWEN_SignalObject_new(0, 0);
|
|
sigTextChanged=GWEN_Signal_new(so1, 0, "sigTextChanged",
|
|
"const char", "const char");
|
|
slotTextChanged1=GWEN_Slot_new(so1, 0,
|
|
"slotTextChanged",
|
|
"const char", "const char",
|
|
testSignalsFunc,
|
|
0);
|
|
|
|
slotTextChanged2=GWEN_Slot_new(so2, 0,
|
|
"slotTextChanged",
|
|
"const char", "const char",
|
|
testSignalsFunc,
|
|
0);
|
|
|
|
GWEN_Signal_Connect(sigTextChanged, slotTextChanged1);
|
|
GWEN_Signal_Connect(sigTextChanged, slotTextChanged2);
|
|
GWEN_Signal_Emit(sigTextChanged,
|
|
"New Text-A", "Text-B", 1, 2);
|
|
|
|
GWEN_SignalObject_free(so2);
|
|
GWEN_SignalObject_free(so1);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testSignals2(int argc, char **argv) {
|
|
GWEN_SIGNALOBJECT *so1;
|
|
GWEN_SIGNALOBJECT *so2;
|
|
GWEN_SIGNAL *sigTextChanged;
|
|
GWEN_SLOT *slotTextChanged1;
|
|
GWEN_SLOT *slotTextChanged2;
|
|
|
|
so1=GWEN_SignalObject_new(0, 0);
|
|
so2=GWEN_SignalObject_new(0, 0);
|
|
sigTextChanged=GWEN_Signal_new(so1, 0, "sigTextChanged",
|
|
"const char", "const char");
|
|
slotTextChanged1=GWEN_Slot_new(so1, 0,
|
|
"slotTextChanged",
|
|
"const char", "const char",
|
|
testSignalsFunc,
|
|
0);
|
|
|
|
slotTextChanged2=GWEN_Slot_new(so2, 0,
|
|
"slotTextChanged",
|
|
"const char", "const char",
|
|
testSignalsFunc,
|
|
0);
|
|
|
|
GWEN_Signal_Connect(sigTextChanged, slotTextChanged1);
|
|
GWEN_Signal_Connect(sigTextChanged, slotTextChanged2);
|
|
GWEN_Signal_Emit(sigTextChanged,
|
|
"New Text-A", "Text-B", 1, 2);
|
|
|
|
GWEN_Signal_Disconnect(sigTextChanged, slotTextChanged2);
|
|
GWEN_Signal_Emit(sigTextChanged,
|
|
"New Text2-A", "Text2-B", 1, 2);
|
|
|
|
GWEN_SignalObject_free(so2);
|
|
GWEN_SignalObject_free(so1);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testSignals3(int argc, char **argv) {
|
|
GWEN_SIGNALOBJECT *so1;
|
|
GWEN_SIGNALOBJECT *so2;
|
|
GWEN_SIGNAL *sigTextChanged;
|
|
GWEN_SLOT *slotTextChanged1;
|
|
GWEN_SLOT *slotTextChanged2;
|
|
|
|
so1=GWEN_SignalObject_new(0, 0);
|
|
so2=GWEN_SignalObject_new(0, 0);
|
|
sigTextChanged=GWEN_Signal_new(so1, 0, "sigTextChanged",
|
|
"const char", "const char");
|
|
slotTextChanged1=GWEN_Slot_new(so1, 0,
|
|
"slotTextChanged",
|
|
"const char", "const char",
|
|
testSignalsFunc,
|
|
0);
|
|
|
|
slotTextChanged2=GWEN_Slot_new(so2, 0,
|
|
"slotTextChanged",
|
|
"const char", 0,
|
|
testSignalsFunc,
|
|
0);
|
|
|
|
if (GWEN_Signal_Connect(sigTextChanged, slotTextChanged1)) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Could not connect signal and slot");
|
|
}
|
|
if (GWEN_Signal_Connect(sigTextChanged, slotTextChanged2)) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "Could not connect signal and slot");
|
|
}
|
|
GWEN_Signal_Emit(sigTextChanged,
|
|
"New Text-A", "Text-B", 1, 2);
|
|
|
|
GWEN_SignalObject_free(so2);
|
|
GWEN_SignalObject_free(so1);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testUrl(int argc, char **argv) {
|
|
const char *urlString;
|
|
GWEN_URL *url;
|
|
GWEN_DB_NODE *db;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "%s %s URL\n", argv[0], argv[1]);
|
|
return 1;
|
|
}
|
|
urlString=argv[2];
|
|
|
|
url=GWEN_Url_fromString(urlString);
|
|
assert(url);
|
|
|
|
db=GWEN_DB_Group_new("url");
|
|
GWEN_Url_toDb(url, db);
|
|
GWEN_DB_Dump(db, stderr, 2);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testNewXML(int argc, char **argv) {
|
|
GWEN_XMLNODE *n;
|
|
time_t startTime;
|
|
time_t stopTime;
|
|
GWEN_XML_CONTEXT *ctx;
|
|
GWEN_SYNCIO *sio;
|
|
int rv;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Name of testfile needed.\n");
|
|
return 1;
|
|
}
|
|
|
|
sio=GWEN_SyncIo_File_new(argv[2], GWEN_SyncIo_File_CreationMode_OpenExisting);
|
|
GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ);
|
|
rv=GWEN_SyncIo_Connect(sio);
|
|
if (rv<0) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
|
|
GWEN_SyncIo_free(sio);
|
|
return rv;
|
|
}
|
|
|
|
n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
|
|
//GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Debug);
|
|
GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Error);
|
|
GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Verbous);
|
|
//GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Error);
|
|
|
|
ctx=GWEN_XmlCtxStore_new(n,
|
|
GWEN_XML_FLAGS_DEFAULT |
|
|
GWEN_XML_FLAGS_TOLERANT_ENDTAGS |
|
|
GWEN_XML_FLAGS_HANDLE_HEADERS);
|
|
|
|
startTime=time(0);
|
|
|
|
if (GWEN_XMLContext_ReadFromIo(ctx, sio)) {
|
|
fprintf(stderr, "Error reading XML file.\n");
|
|
return 1;
|
|
}
|
|
|
|
stopTime=time(0);
|
|
|
|
if (GWEN_XMLNode_WriteFile(n, "xml.out",
|
|
GWEN_XML_FLAGS_DEFAULT|GWEN_XML_FLAGS_SIMPLE|GWEN_XML_FLAGS_HANDLE_HEADERS)){
|
|
fprintf(stderr, "Could not write file xml.out\n");
|
|
return 2;
|
|
}
|
|
|
|
|
|
GWEN_XmlCtx_free(ctx);
|
|
GWEN_XMLNode_free(n);
|
|
|
|
fprintf(stderr, "Time for loading: %d secs\n",
|
|
(int)(difftime(stopTime, startTime)));
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testCrypt3Rsa(int argc, char **argv) {
|
|
int rv;
|
|
GWEN_CRYPT_KEY *pubKey;
|
|
GWEN_CRYPT_KEY *secretKey;
|
|
uint8_t testData[]=
|
|
"This is the test data "
|
|
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
|
|
uint8_t buffer[256];
|
|
uint32_t len;
|
|
uint8_t buffer2[256];
|
|
uint32_t len2;
|
|
|
|
fprintf(stderr, "Generating key pair...\n");
|
|
rv=GWEN_Crypt_KeyRsa_GeneratePair(768, 1, &pubKey, &secretKey);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not generate key pair (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Generating key pair... done.\n");
|
|
|
|
fprintf(stderr, "Signing message...\n");
|
|
len=sizeof(buffer);
|
|
rv=GWEN_Crypt_Key_Sign(secretKey, testData, sizeof(testData)-1, buffer, &len);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not sign (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Signing message... done\n");
|
|
|
|
rv=GWEN_Crypt_Key_Verify(pubKey, testData, sizeof(testData)-1, buffer, len);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not verify (%d).\n", rv);
|
|
GWEN_Text_DumpString((const char*)buffer, len, stderr, 1);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Signature is valid.\n");
|
|
|
|
|
|
fprintf(stderr, "Encrypting message...\n");
|
|
len=sizeof(buffer);
|
|
rv=GWEN_Crypt_Key_Encipher(pubKey, testData, sizeof(testData)-1, buffer, &len);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not encipher (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Encrypting message... done (%d)\n", len);
|
|
|
|
fprintf(stderr, "Decrypting message...\n");
|
|
len2=sizeof(buffer2);
|
|
rv=GWEN_Crypt_Key_Decipher(secretKey, buffer, len, buffer2, &len2);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not decipher (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Encrypting message... done\n");
|
|
|
|
if ((sizeof(testData)-1)!=len2) {
|
|
fprintf(stderr, "Length of deciphered message does not match that of src (%d!=%d)\n",
|
|
len, len2);
|
|
GWEN_Text_DumpString((const char*)buffer2, len2, stderr, 1);
|
|
return 2;
|
|
}
|
|
if (memcmp(testData, buffer2, len2)) {
|
|
fprintf(stderr, "Deciphered message does not match src\n");
|
|
GWEN_Text_DumpString((const char*)buffer2, len2, stderr, 1);
|
|
return 2;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testCrypt3Rsa2(int argc, char **argv) {
|
|
int rv;
|
|
GWEN_CRYPT_KEY *pubKey;
|
|
GWEN_CRYPT_KEY *secretKey;
|
|
GWEN_DB_NODE *dbPubKey;
|
|
GWEN_DB_NODE *dbSecretKey;
|
|
uint8_t testData[]=
|
|
"This is the test data "
|
|
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
|
|
uint8_t buffer[256];
|
|
uint32_t len;
|
|
uint8_t buffer2[256];
|
|
uint32_t len2;
|
|
|
|
fprintf(stderr, "Generating key pair...\n");
|
|
rv=GWEN_Crypt_KeyRsa_GeneratePair(768, 1, &pubKey, &secretKey);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not generate key pair (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Generating key pair... done.\n");
|
|
|
|
dbPubKey=GWEN_DB_Group_new("PublicKey");
|
|
rv=GWEN_Crypt_KeyRsa_toDb(pubKey, dbPubKey, 1);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not store public key (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
GWEN_Crypt_Key_free(pubKey);
|
|
|
|
dbSecretKey=GWEN_DB_Group_new("SecretKey");
|
|
rv=GWEN_Crypt_KeyRsa_toDb(secretKey, dbSecretKey, 0);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not store secret key (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
GWEN_Crypt_Key_free(secretKey);
|
|
|
|
pubKey=GWEN_Crypt_KeyRsa_fromDb(dbPubKey);
|
|
if (pubKey==NULL) {
|
|
fprintf(stderr, "ERROR: Could not read public key from db\n");
|
|
GWEN_DB_Dump(dbPubKey, stderr, 2);
|
|
return 2;
|
|
}
|
|
|
|
secretKey=GWEN_Crypt_KeyRsa_fromDb(dbSecretKey);
|
|
if (secretKey==NULL) {
|
|
fprintf(stderr, "ERROR: Could not read secret key from db\n");
|
|
GWEN_DB_Dump(dbSecretKey, stderr, 2);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Signing message...\n");
|
|
len=sizeof(buffer);
|
|
rv=GWEN_Crypt_Key_Sign(secretKey, testData, sizeof(testData)-1, buffer, &len);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not sign (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Signing message... done\n");
|
|
|
|
rv=GWEN_Crypt_Key_Verify(pubKey, testData, sizeof(testData)-1, buffer, len);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not verify (%d).\n", rv);
|
|
GWEN_Text_DumpString((const char*)buffer, len, stderr, 1);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Signature is valid.\n");
|
|
|
|
|
|
fprintf(stderr, "Encrypting message...\n");
|
|
len=sizeof(buffer);
|
|
rv=GWEN_Crypt_Key_Encipher(pubKey, testData, sizeof(testData)-1, buffer, &len);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not encipher (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Encrypting message... done (%d)\n", len);
|
|
|
|
fprintf(stderr, "Decrypting message...\n");
|
|
len2=sizeof(buffer2);
|
|
rv=GWEN_Crypt_Key_Decipher(secretKey, buffer, len, buffer2, &len2);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not decipher (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Decrypting message... done\n");
|
|
|
|
if ((sizeof(testData)-1)!=len2) {
|
|
fprintf(stderr, "Length of deciphered message does not match that of src (%d!=%d)\n",
|
|
len, len2);
|
|
GWEN_Text_DumpString((const char*)buffer2, len2, stderr, 1);
|
|
return 2;
|
|
}
|
|
if (memcmp(testData, buffer2, len2)) {
|
|
fprintf(stderr, "Deciphered message does not match src\n");
|
|
GWEN_Text_DumpString((const char*)buffer2, len2, stderr, 1);
|
|
return 2;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testGnutls(int argc, char **argv) {
|
|
gnutls_session_t session;
|
|
gnutls_certificate_credentials_t credentials;
|
|
int rv;
|
|
/* Use long int here because on 64bit platforms the cast at
|
|
gnutls_transport_set_ptr() would give an error otherwise. See
|
|
http://www.mail-archive.com/help-gnutls@gnu.org/msg00286.html */
|
|
long int sd;
|
|
struct sockaddr *address;
|
|
struct sockaddr_in *aptr;
|
|
int size;
|
|
|
|
address=(struct sockaddr*)malloc(sizeof(struct sockaddr_in));
|
|
assert(address);
|
|
aptr=(struct sockaddr_in*)(address);
|
|
size=sizeof(struct sockaddr_in);
|
|
memset(address,0,size);
|
|
#ifdef PF_INET
|
|
aptr->sin_family=PF_INET;
|
|
#else
|
|
aptr->sin_family=AF_INET;
|
|
#endif
|
|
DBG_ERROR(0, "ping");
|
|
aptr->sin_addr.s_addr=inet_addr("85.10.225.70");
|
|
aptr->sin_port=htons(443);
|
|
|
|
DBG_ERROR(0, "ping");
|
|
sd=socket(PF_INET, SOCK_STREAM,0);
|
|
if (sd==-1) {
|
|
DBG_ERROR(0, "socket: %s", strerror(errno));
|
|
return 2;
|
|
}
|
|
DBG_ERROR(0, "ping");
|
|
rv=connect(sd, address, size);
|
|
DBG_ERROR(0, "ping");
|
|
if (rv) {
|
|
DBG_ERROR(0, "connect: %s", strerror(errno));
|
|
return 2;
|
|
}
|
|
|
|
DBG_ERROR(0, "ping");
|
|
rv=gnutls_init(&session, GNUTLS_CLIENT);
|
|
if (rv) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "gnutls_init: %d (%s)", rv, gnutls_strerror(rv));
|
|
return GWEN_ERROR_GENERIC;
|
|
}
|
|
|
|
rv=gnutls_set_default_priority(session);
|
|
if (rv) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "gnutls_set_default_priority: %d (%s)", rv, gnutls_strerror(rv));
|
|
return GWEN_ERROR_GENERIC;
|
|
}
|
|
|
|
rv=gnutls_certificate_allocate_credentials(&credentials);
|
|
if (rv) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "gnutls_certificate_allocate_credentials: %d (%s)", rv, gnutls_strerror(rv));
|
|
return GWEN_ERROR_GENERIC;
|
|
}
|
|
|
|
rv=gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, credentials);
|
|
if (rv<0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "gnutls_credentials_set: %d (%s)", rv, gnutls_strerror(rv));
|
|
gnutls_certificate_free_credentials(credentials);
|
|
gnutls_deinit(session);
|
|
return GWEN_ERROR_GENERIC;
|
|
}
|
|
|
|
gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t)sd);
|
|
|
|
DBG_ERROR(0, "ping");
|
|
rv=gnutls_handshake(session);
|
|
if (rv<0) {
|
|
DBG_ERROR(GWEN_LOGDOMAIN, "gnutls_handshake: %d (%s)", rv, gnutls_strerror(rv));
|
|
return GWEN_ERROR_GENERIC;
|
|
}
|
|
|
|
DBG_ERROR(0, "Ok.");
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
print_mpi (const char *text, gcry_mpi_t a)
|
|
{
|
|
char *buf;
|
|
void *bufaddr = &buf;
|
|
gcry_error_t rc;
|
|
|
|
rc = gcry_mpi_aprint (GCRYMPI_FMT_HEX, bufaddr, NULL, a);
|
|
if (rc)
|
|
fprintf (stderr, "%s=[error printing number: %s]\n",
|
|
text, gpg_strerror (rc));
|
|
else
|
|
{
|
|
fprintf (stderr, "%s=0x%s\n", text, buf);
|
|
gcry_free (buf);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
check_generated_rsa_key (gcry_sexp_t key, unsigned long expected_e){
|
|
gcry_sexp_t skey, pkey, list;
|
|
|
|
pkey = gcry_sexp_find_token (key, "public-key", 0);
|
|
if (!pkey) {
|
|
DBG_ERROR(0, "public part missing in return value");
|
|
exit(2);
|
|
}
|
|
else {
|
|
gcry_mpi_t e = NULL;
|
|
|
|
list = gcry_sexp_find_token (pkey, "e", 0);
|
|
if (!list || !(e=gcry_sexp_nth_mpi (list, 1, 0)) ) {
|
|
DBG_ERROR(0, "public exponent not found");
|
|
exit(2);
|
|
}
|
|
else if (!expected_e) {
|
|
print_mpi ("e", e);
|
|
}
|
|
else {
|
|
if ( gcry_mpi_cmp_ui (e, expected_e)){
|
|
print_mpi ("e", e);
|
|
fprintf(stderr, "public exponent is not %lu\n", expected_e);
|
|
exit(2);
|
|
}
|
|
else {
|
|
fprintf(stderr, "public exponent is as expected\n");
|
|
print_mpi ("e", e);
|
|
}
|
|
}
|
|
gcry_sexp_release (list);
|
|
gcry_mpi_release (e);
|
|
gcry_sexp_release (pkey);
|
|
}
|
|
|
|
skey = gcry_sexp_find_token (key, "private-key", 0);
|
|
if (!skey) {
|
|
DBG_ERROR(0, "private part missing in return value");
|
|
exit(2);
|
|
}
|
|
else {
|
|
int rc = gcry_pk_testkey (skey);
|
|
if (rc) {
|
|
DBG_ERROR(0, "gcry_pk_testkey failed: %s", gpg_strerror (rc));
|
|
exit(2);
|
|
}
|
|
gcry_sexp_release (skey);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
check_rsa_keys (void){
|
|
gcry_sexp_t keyparm, key;
|
|
int rc;
|
|
|
|
fprintf (stderr, "creating 1024 bit RSA key using old interface\n");
|
|
rc = gcry_sexp_new (&keyparm,
|
|
"(genkey\n"
|
|
" (rsa\n"
|
|
" (nbits 4:1024)\n"
|
|
" ))", 0, 1);
|
|
if (rc) {
|
|
DBG_ERROR(0, "error creating S-expression: %s", gpg_strerror (rc));
|
|
exit(2);
|
|
}
|
|
rc = gcry_pk_genkey (&key, keyparm);
|
|
gcry_sexp_release (keyparm);
|
|
if (rc) {
|
|
DBG_ERROR(0, "error generating RSA key: %s", gpg_strerror (rc));
|
|
exit(2);
|
|
}
|
|
|
|
check_generated_rsa_key (key, 65537);
|
|
gcry_sexp_release (key);
|
|
|
|
fprintf (stderr, "creating 512 bit RSA key with e=257\n");
|
|
rc = gcry_sexp_new (&keyparm,
|
|
"(genkey\n"
|
|
" (rsa\n"
|
|
" (nbits 3:512)\n"
|
|
" (rsa-use-e 3:257)\n"
|
|
" ))", 0, 1);
|
|
if (rc) {
|
|
DBG_ERROR(0, "error creating S-expression: %s", gpg_strerror (rc));
|
|
exit(2);
|
|
}
|
|
rc = gcry_pk_genkey (&key, keyparm);
|
|
gcry_sexp_release (keyparm);
|
|
if (rc) {
|
|
DBG_ERROR(0, "error generating RSA key: %s", gpg_strerror (rc));
|
|
exit(2);
|
|
}
|
|
|
|
check_generated_rsa_key (key, 257);
|
|
gcry_sexp_release (key);
|
|
|
|
fprintf (stderr, "creating 512 bit RSA key with default e\n");
|
|
rc = gcry_sexp_new (&keyparm,
|
|
"(genkey\n"
|
|
" (rsa\n"
|
|
" (nbits 3:512)\n"
|
|
" (rsa-use-e 1:0)\n"
|
|
" ))", 0, 1);
|
|
if (rc) {
|
|
DBG_ERROR(0, "error creating S-expression: %s", gpg_strerror (rc));
|
|
exit(2);
|
|
}
|
|
rc = gcry_pk_genkey (&key, keyparm);
|
|
gcry_sexp_release (keyparm);
|
|
if (rc) {
|
|
DBG_ERROR(0, "error generating RSA key: %s", gpg_strerror (rc));
|
|
exit(2);
|
|
}
|
|
|
|
check_generated_rsa_key (key, 0); /* We don't expect a constant exponent. */
|
|
gcry_sexp_release (key);
|
|
|
|
|
|
fprintf (stderr, "creating 768 bit RSA key with e=65537\n");
|
|
rc = gcry_sexp_new (&keyparm,
|
|
"(genkey\n"
|
|
" (rsa\n"
|
|
" (nbits 3:768)\n"
|
|
" (rsa-use-e 5:65537)\n"
|
|
" ))", 0, 1);
|
|
if (rc) {
|
|
DBG_ERROR(0, "error creating S-expression: %s", gpg_strerror (rc));
|
|
exit(2);
|
|
}
|
|
rc = gcry_pk_genkey (&key, keyparm);
|
|
gcry_sexp_release (keyparm);
|
|
if (rc) {
|
|
DBG_ERROR(0, "error generating RSA key: %s", gpg_strerror (rc));
|
|
exit(2);
|
|
}
|
|
|
|
check_generated_rsa_key (key, 65537);
|
|
gcry_sexp_release (key);
|
|
|
|
}
|
|
|
|
|
|
|
|
int testHttpSession(int argc, char **argv) {
|
|
GWEN_GUI *gui;
|
|
const char *urlString;
|
|
GWEN_HTTP_SESSION *sess;
|
|
int rv;
|
|
GWEN_BUFFER *buf;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "%s %s URL\n", argv[0], argv[1]);
|
|
return 1;
|
|
}
|
|
urlString=argv[2];
|
|
|
|
fprintf(stderr, "Creating gui.\n");
|
|
gui=GWEN_Gui_CGui_new();
|
|
GWEN_Gui_SetGui(gui);
|
|
|
|
sess=GWEN_HttpSession_new(urlString, "http", 80);
|
|
rv=GWEN_HttpSession_Init(sess);
|
|
if (rv<0) {
|
|
fprintf(stderr, "ERROR: Could not init http session.\n");
|
|
return 3;
|
|
}
|
|
|
|
rv=GWEN_HttpSession_SendPacket(sess, "GET", NULL, 0);
|
|
if (rv<0) {
|
|
fprintf(stderr, "ERROR: Could not send request.\n");
|
|
return 3;
|
|
}
|
|
|
|
buf=GWEN_Buffer_new(0, 1024, 0, 1);
|
|
rv=GWEN_HttpSession_RecvPacket(sess, buf);
|
|
if (rv<0) {
|
|
fprintf(stderr, "ERROR: Could not receive response.\n");
|
|
return 3;
|
|
}
|
|
|
|
GWEN_Buffer_Dump(buf, stderr, 2);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testDES(int argc, char **argv) {
|
|
GWEN_CRYPT_KEY *skey;
|
|
GWEN_BUFFER *buf1;
|
|
GWEN_BUFFER *buf2;
|
|
GWEN_BUFFER *buf3;
|
|
uint32_t l;
|
|
int rv;
|
|
const char testString[]={
|
|
0x90, 0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20,
|
|
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
|
0x09, 0x18, 0x27, 0x36, 0x45, 0x54, 0x63, 0x72,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
|
|
};
|
|
|
|
skey=GWEN_Crypt_KeyDes3K_Generate(GWEN_Crypt_CryptMode_Cbc, 24, 2);
|
|
if (skey==NULL) {
|
|
DBG_ERROR(0, "Unable to generate DES key");
|
|
return 2;
|
|
}
|
|
|
|
buf1=GWEN_Buffer_new(0, sizeof(testString), 0, 1);
|
|
buf2=GWEN_Buffer_new(0, sizeof(testString), 0, 1);
|
|
buf3=GWEN_Buffer_new(0, sizeof(testString), 0, 1);
|
|
|
|
GWEN_Buffer_AppendBytes(buf1, testString, sizeof(testString));
|
|
|
|
/* encrypt buf1 */
|
|
l=GWEN_Buffer_GetMaxUnsegmentedWrite(buf2);
|
|
rv=GWEN_Crypt_Key_Encipher(skey,
|
|
(uint8_t*)GWEN_Buffer_GetStart(buf1),
|
|
GWEN_Buffer_GetUsedBytes(buf1),
|
|
(uint8_t*)GWEN_Buffer_GetPosPointer(buf2),
|
|
&l);
|
|
if (rv<0) {
|
|
DBG_ERROR(0, "Unable to encipher");
|
|
return 2;
|
|
}
|
|
GWEN_Buffer_IncrementPos(buf2, l);
|
|
GWEN_Buffer_AdjustUsedBytes(buf2);
|
|
|
|
/* decrypt buf2 */
|
|
l=GWEN_Buffer_GetMaxUnsegmentedWrite(buf3);
|
|
rv=GWEN_Crypt_Key_Decipher(skey,
|
|
(uint8_t*)GWEN_Buffer_GetStart(buf2),
|
|
GWEN_Buffer_GetUsedBytes(buf2),
|
|
(uint8_t*)GWEN_Buffer_GetPosPointer(buf3),
|
|
&l);
|
|
if (rv<0) {
|
|
DBG_ERROR(0, "Unable to decipher");
|
|
return 2;
|
|
}
|
|
GWEN_Buffer_IncrementPos(buf3, l);
|
|
GWEN_Buffer_AdjustUsedBytes(buf3);
|
|
|
|
if (GWEN_Buffer_GetUsedBytes(buf1)!=
|
|
GWEN_Buffer_GetUsedBytes(buf3)) {
|
|
DBG_ERROR(0, "Buffer size does not match");
|
|
return 2;
|
|
}
|
|
|
|
if (memcmp(GWEN_Buffer_GetStart(buf1),
|
|
GWEN_Buffer_GetStart(buf3),
|
|
GWEN_Buffer_GetUsedBytes(buf1))!=0) {
|
|
DBG_ERROR(0, "Buffers do not match");
|
|
DBG_ERROR(0, "Expected:");
|
|
GWEN_Buffer_Dump(buf1, stderr, 2);
|
|
DBG_ERROR(0, "Found:");
|
|
GWEN_Buffer_Dump(buf3, stderr, 2);
|
|
DBG_ERROR(0, "Encrypted:");
|
|
GWEN_Buffer_Dump(buf2, stderr, 2);
|
|
return 2;
|
|
}
|
|
|
|
GWEN_Buffer_free(buf3);
|
|
GWEN_Buffer_free(buf2);
|
|
GWEN_Buffer_free(buf1);
|
|
GWEN_Crypt_Key_free(skey);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testDES2(int argc, char **argv) {
|
|
GWEN_CRYPT_KEY *skey;
|
|
GWEN_BUFFER *buf1;
|
|
GWEN_BUFFER *buf2;
|
|
GWEN_BUFFER *buf3;
|
|
uint32_t l;
|
|
int rv;
|
|
uint8_t kd[24];
|
|
const char testString[]={
|
|
0x90, 0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20,
|
|
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
|
0x09, 0x18, 0x27, 0x36, 0x45, 0x54, 0x63, 0x72,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
|
|
};
|
|
|
|
GWEN_Crypt_Random(2, kd, 16);
|
|
memmove(kd+16, kd, 8);
|
|
|
|
skey=GWEN_Crypt_KeyDes3K_fromData(GWEN_Crypt_CryptMode_Cbc,
|
|
24,
|
|
kd,
|
|
24);
|
|
if (skey==NULL) {
|
|
DBG_ERROR(0, "Unable to generate DES key");
|
|
return 2;
|
|
}
|
|
|
|
buf1=GWEN_Buffer_new(0, sizeof(testString), 0, 1);
|
|
buf2=GWEN_Buffer_new(0, sizeof(testString), 0, 1);
|
|
buf3=GWEN_Buffer_new(0, sizeof(testString), 0, 1);
|
|
|
|
GWEN_Buffer_AppendBytes(buf1, testString, sizeof(testString));
|
|
|
|
/* encrypt buf1 */
|
|
l=GWEN_Buffer_GetMaxUnsegmentedWrite(buf2);
|
|
rv=GWEN_Crypt_Key_Encipher(skey,
|
|
(uint8_t*)GWEN_Buffer_GetStart(buf1),
|
|
GWEN_Buffer_GetUsedBytes(buf1),
|
|
(uint8_t*)GWEN_Buffer_GetPosPointer(buf2),
|
|
&l);
|
|
if (rv<0) {
|
|
DBG_ERROR(0, "Unable to encipher");
|
|
return 2;
|
|
}
|
|
GWEN_Buffer_IncrementPos(buf2, l);
|
|
GWEN_Buffer_AdjustUsedBytes(buf2);
|
|
|
|
/* decrypt buf2 */
|
|
l=GWEN_Buffer_GetMaxUnsegmentedWrite(buf3);
|
|
rv=GWEN_Crypt_Key_Decipher(skey,
|
|
(uint8_t*)GWEN_Buffer_GetStart(buf2),
|
|
GWEN_Buffer_GetUsedBytes(buf2),
|
|
(uint8_t*)GWEN_Buffer_GetPosPointer(buf3),
|
|
&l);
|
|
if (rv<0) {
|
|
DBG_ERROR(0, "Unable to decipher");
|
|
return 2;
|
|
}
|
|
GWEN_Buffer_IncrementPos(buf3, l);
|
|
GWEN_Buffer_AdjustUsedBytes(buf3);
|
|
|
|
if (GWEN_Buffer_GetUsedBytes(buf1)!=
|
|
GWEN_Buffer_GetUsedBytes(buf3)) {
|
|
DBG_ERROR(0, "Buffer size does not match");
|
|
return 2;
|
|
}
|
|
|
|
if (memcmp(GWEN_Buffer_GetStart(buf1),
|
|
GWEN_Buffer_GetStart(buf3),
|
|
GWEN_Buffer_GetUsedBytes(buf1))!=0) {
|
|
DBG_ERROR(0, "Buffers do not match");
|
|
DBG_ERROR(0, "Expected:");
|
|
GWEN_Buffer_Dump(buf1, stderr, 2);
|
|
DBG_ERROR(0, "Found:");
|
|
GWEN_Buffer_Dump(buf3, stderr, 2);
|
|
DBG_ERROR(0, "Encrypted:");
|
|
GWEN_Buffer_Dump(buf2, stderr, 2);
|
|
return 2;
|
|
}
|
|
|
|
GWEN_Buffer_free(buf3);
|
|
GWEN_Buffer_free(buf2);
|
|
GWEN_Buffer_free(buf1);
|
|
GWEN_Crypt_Key_free(skey);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testDES3(int argc, char **argv) {
|
|
GWEN_CRYPT_KEY *skey;
|
|
uint32_t l2;
|
|
uint32_t l3;
|
|
int rv;
|
|
const uint8_t iv[8]={
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
const uint8_t testString[]={
|
|
0x90, 0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20,
|
|
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
|
0x09, 0x18, 0x27, 0x36, 0x45, 0x54, 0x63, 0x72,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
|
|
0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22,
|
|
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
|
|
};
|
|
uint8_t buf2[sizeof(testString)];
|
|
uint8_t buf3[sizeof(testString)];
|
|
|
|
skey=GWEN_Crypt_KeyDes3K_Generate(GWEN_Crypt_CryptMode_Cbc, 24, 2);
|
|
if (skey==NULL) {
|
|
DBG_ERROR(0, "Unable to generate DES key");
|
|
return 2;
|
|
}
|
|
|
|
/* encrypt buf1 */
|
|
l2=sizeof(buf2);
|
|
rv=GWEN_Crypt_Key_Encipher(skey,
|
|
testString,
|
|
sizeof(testString),
|
|
buf2,
|
|
&l2);
|
|
if (rv<0) {
|
|
DBG_ERROR(0, "Unable to encipher");
|
|
return 2;
|
|
}
|
|
|
|
GWEN_Crypt_KeyDes3K_SetIV(skey, iv, sizeof(iv));
|
|
|
|
/* decrypt buf2 */
|
|
l3=sizeof(buf3);
|
|
rv=GWEN_Crypt_Key_Decipher(skey,
|
|
buf2,
|
|
l2,
|
|
buf3,
|
|
&l3);
|
|
if (rv<0) {
|
|
DBG_ERROR(0, "Unable to decipher");
|
|
return 2;
|
|
}
|
|
|
|
if (l2!=l3) {
|
|
DBG_ERROR(0, "Buffer size does not match");
|
|
return 2;
|
|
}
|
|
|
|
if (l2!=sizeof(testString)) {
|
|
DBG_ERROR(0, "Buffer size does not match size of testString");
|
|
return 2;
|
|
}
|
|
|
|
if (memcmp(testString, buf3, l3)!=0) {
|
|
DBG_ERROR(0, "Buffers do not match");
|
|
DBG_ERROR(0, "Expected:");
|
|
GWEN_Text_DumpString((const char*)testString, sizeof(testString),
|
|
stderr, 2);
|
|
DBG_ERROR(0, "Found:");
|
|
GWEN_Text_DumpString((const char*)buf3, l3, stderr, 2);
|
|
DBG_ERROR(0, "Encrypted:");
|
|
GWEN_Text_DumpString((const char*)buf2, l2, stderr, 2);
|
|
return 2;
|
|
}
|
|
|
|
GWEN_Crypt_Key_free(skey);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testDES4(int argc, char **argv) {
|
|
GWEN_CRYPT_KEY *skey;
|
|
GWEN_BUFFER *buf1;
|
|
GWEN_BUFFER *buf2;
|
|
GWEN_BUFFER *buf3;
|
|
uint32_t l;
|
|
int rv;
|
|
const char *fname;
|
|
#ifdef NEU1
|
|
const uint8_t keyData[]={
|
|
0x2a, 0x79, 0xc4, 0x45, 0xbc, 0x13, 0x5d, 0x13,
|
|
0xe0, 0xec, 0xe6, 0x43, 0x6d, 0x73, 0x91, 0x0b
|
|
};
|
|
#else
|
|
const uint8_t keyData[]={
|
|
0x01, 0x3e, 0x1f, 0xf1, 0xab, 0xbf, 0x13, 0x79,
|
|
0x5b, 0x68, 0x9d, 0x26, 0x31, 0xdc, 0xe0, 0x52
|
|
};
|
|
#endif
|
|
|
|
if (argc<3) {
|
|
DBG_ERROR(0, "Missing filename");
|
|
return 1;
|
|
}
|
|
fname=argv[2];
|
|
|
|
skey=GWEN_Crypt_KeyDes3K_fromData(GWEN_Crypt_CryptMode_Cbc, 16,
|
|
keyData, 16);
|
|
if (skey==NULL) {
|
|
DBG_ERROR(0, "Unable to create DES key");
|
|
return 2;
|
|
}
|
|
|
|
buf1=GWEN_Buffer_new(0, 256, 0, 1);
|
|
rv=readFile(fname, buf1);
|
|
if (rv<0) {
|
|
DBG_ERROR(0, "Unable to read file [%s]: %d",
|
|
fname, rv);
|
|
return 2;
|
|
}
|
|
#ifdef NEU1
|
|
GWEN_Buffer_FillWithBytes(buf1, 0, 7);
|
|
#endif
|
|
|
|
buf2=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(buf1)+16, 0, 1);
|
|
|
|
/* decrypt buf1 */
|
|
fprintf(stderr, "Decrypting %d bytes", GWEN_Buffer_GetUsedBytes(buf1));
|
|
l=GWEN_Buffer_GetMaxUnsegmentedWrite(buf2);
|
|
|
|
GWEN_Crypt_KeyDes3K_SetIV(skey, NULL, 0);
|
|
|
|
rv=GWEN_Crypt_Key_Decipher(skey,
|
|
(uint8_t*)GWEN_Buffer_GetStart(buf1),
|
|
GWEN_Buffer_GetUsedBytes(buf1),
|
|
(uint8_t*)GWEN_Buffer_GetPosPointer(buf2),
|
|
&l);
|
|
if (rv<0) {
|
|
DBG_ERROR(0, "Unable to decipher");
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Decrypted %d bytes", l);
|
|
GWEN_Buffer_IncrementPos(buf2, l);
|
|
GWEN_Buffer_AdjustUsedBytes(buf2);
|
|
|
|
writeFile("des4.out1",
|
|
GWEN_Buffer_GetStart(buf2),
|
|
GWEN_Buffer_GetUsedBytes(buf2));
|
|
|
|
buf3=GWEN_Buffer_new(0, 256, 0, 1);
|
|
rv=zip_inflate(GWEN_Buffer_GetStart(buf2),
|
|
GWEN_Buffer_GetUsedBytes(buf2),
|
|
buf3);
|
|
|
|
writeFile("des4.out2",
|
|
GWEN_Buffer_GetStart(buf3),
|
|
GWEN_Buffer_GetUsedBytes(buf3));
|
|
|
|
if (rv<0) {
|
|
DBG_ERROR(0, "Unable to unzip");
|
|
return 2;
|
|
}
|
|
|
|
GWEN_Buffer_free(buf2);
|
|
GWEN_Buffer_free(buf1);
|
|
GWEN_Crypt_Key_free(skey);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testCryptMgr1(int argc, char **argv) {
|
|
int rv;
|
|
GWEN_CRYPT_KEY *pubKey;
|
|
GWEN_CRYPT_KEY *secretKey;
|
|
GWEN_CRYPTMGR *cm;
|
|
uint8_t testData[]=
|
|
"This is the test data "
|
|
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
|
|
GWEN_BUFFER *tbuf1;
|
|
GWEN_BUFFER *tbuf2;
|
|
|
|
fprintf(stderr, "Generating key pair...\n");
|
|
rv=GWEN_Crypt_KeyRsa_GeneratePair(2048/8, 1, &pubKey, &secretKey);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not generate key pair (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Generating key pair... done.\n");
|
|
|
|
GWEN_Crypt_KeyRsa_AddFlags(pubKey, GWEN_CRYPT_KEYRSA_FLAGS_DIRECTSIGN);
|
|
GWEN_Crypt_KeyRsa_AddFlags(secretKey, GWEN_CRYPT_KEYRSA_FLAGS_DIRECTSIGN);
|
|
|
|
cm=GWEN_CryptMgrKeys_new("local", secretKey, "local", pubKey, 1);
|
|
assert(cm);
|
|
|
|
fprintf(stderr, "Signing message...\n");
|
|
tbuf1=GWEN_Buffer_new(0, 256, 0, 1);
|
|
rv=GWEN_CryptMgr_Sign(cm, testData, sizeof(testData)-1, tbuf1);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not sign (%d).\n", rv);
|
|
GWEN_Buffer_Dump(tbuf1, stderr, 2);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Signing message... done\n");
|
|
|
|
fprintf(stderr, "Verifying message...\n");
|
|
tbuf2=GWEN_Buffer_new(0, 256, 0, 1);
|
|
rv=GWEN_CryptMgr_Verify(cm,
|
|
(const uint8_t*)GWEN_Buffer_GetStart(tbuf1),
|
|
GWEN_Buffer_GetUsedBytes(tbuf1),
|
|
tbuf2);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not verify (%d).\n", rv);
|
|
GWEN_Buffer_Dump(tbuf2, stderr, 2);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Verifying message... done\n");
|
|
|
|
fprintf(stderr, "Signature is valid.\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testCryptMgr2(int argc, char **argv) {
|
|
int rv;
|
|
GWEN_CRYPT_KEY *pubKey;
|
|
GWEN_CRYPT_KEY *secretKey;
|
|
GWEN_CRYPTMGR *cm;
|
|
uint8_t testData[]=
|
|
"This is the test data "
|
|
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
|
|
GWEN_BUFFER *tbuf1;
|
|
GWEN_BUFFER *tbuf2;
|
|
|
|
fprintf(stderr, "Generating key pair...\n");
|
|
rv=GWEN_Crypt_KeyRsa_GeneratePair(2048/8, 1, &pubKey, &secretKey);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not generate key pair (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Generating key pair... done.\n");
|
|
|
|
GWEN_Crypt_KeyRsa_AddFlags(pubKey, GWEN_CRYPT_KEYRSA_FLAGS_DIRECTSIGN);
|
|
GWEN_Crypt_KeyRsa_AddFlags(secretKey, GWEN_CRYPT_KEYRSA_FLAGS_DIRECTSIGN);
|
|
|
|
cm=GWEN_CryptMgrKeys_new("local", secretKey, "local", pubKey, 1);
|
|
assert(cm);
|
|
|
|
fprintf(stderr, "Encrypting message...\n");
|
|
tbuf1=GWEN_Buffer_new(0, 256, 0, 1);
|
|
rv=GWEN_CryptMgr_Encrypt(cm, testData, sizeof(testData)-1, tbuf1);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not encrypt (%d).\n", rv);
|
|
GWEN_Buffer_Dump(tbuf1, stderr, 2);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Encrypting message... done\n");
|
|
|
|
fprintf(stderr, "Decrypting message...\n");
|
|
tbuf2=GWEN_Buffer_new(0, 256, 0, 1);
|
|
rv=GWEN_CryptMgr_Decrypt(cm,
|
|
(const uint8_t*)GWEN_Buffer_GetStart(tbuf1),
|
|
GWEN_Buffer_GetUsedBytes(tbuf1),
|
|
tbuf2);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not verify (%d).\n", rv);
|
|
GWEN_Buffer_Dump(tbuf2, stderr, 2);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Decrypting message... done\n");
|
|
|
|
if (sizeof(testData)-1!=GWEN_Buffer_GetUsedBytes(tbuf2)) {
|
|
fprintf(stderr, "Crypto-Error (size):\n");
|
|
GWEN_Buffer_Dump(tbuf1, stderr, 2);
|
|
GWEN_Buffer_Dump(tbuf2, stderr, 2);
|
|
return 2;
|
|
}
|
|
|
|
if (memcmp(testData, GWEN_Buffer_GetStart(tbuf2), GWEN_Buffer_GetUsedBytes(tbuf2))!=0) {
|
|
fprintf(stderr, "Crypto-Error (content):\n");
|
|
GWEN_Buffer_Dump(tbuf1, stderr, 2);
|
|
GWEN_Buffer_Dump(tbuf2, stderr, 2);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Crypto-stuff ok.\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testCryptMgr3(int argc, char **argv) {
|
|
int rv;
|
|
GWEN_CRYPT_KEY *pubKey;
|
|
GWEN_CRYPT_KEY *secretKey;
|
|
GWEN_CRYPTMGR *cm;
|
|
uint8_t testData[]=
|
|
"This is the test data "
|
|
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
|
|
GWEN_BUFFER *tbuf1;
|
|
GWEN_BUFFER *tbuf2;
|
|
|
|
fprintf(stderr, "Generating key pair...\n");
|
|
rv=GWEN_Crypt_KeyRsa_GeneratePair(2048/8, 1, &pubKey, &secretKey);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not generate key pair (%d).\n", rv);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Generating key pair... done.\n");
|
|
|
|
GWEN_Crypt_KeyRsa_AddFlags(pubKey, GWEN_CRYPT_KEYRSA_FLAGS_DIRECTSIGN);
|
|
GWEN_Crypt_KeyRsa_AddFlags(secretKey, GWEN_CRYPT_KEYRSA_FLAGS_DIRECTSIGN);
|
|
|
|
cm=GWEN_CryptMgrKeys_new("local", secretKey, "local", pubKey, 1);
|
|
assert(cm);
|
|
|
|
fprintf(stderr, "Encoding message...\n");
|
|
tbuf1=GWEN_Buffer_new(0, 256, 0, 1);
|
|
rv=GWEN_CryptMgr_Encode(cm, testData, sizeof(testData)-1, tbuf1);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not encrypt (%d).\n", rv);
|
|
GWEN_Buffer_Dump(tbuf1, stderr, 2);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Encoding message... done\n");
|
|
|
|
fprintf(stderr, "Decoding message...\n");
|
|
tbuf2=GWEN_Buffer_new(0, 256, 0, 1);
|
|
rv=GWEN_CryptMgr_Decode(cm,
|
|
(const uint8_t*)GWEN_Buffer_GetStart(tbuf1),
|
|
GWEN_Buffer_GetUsedBytes(tbuf1),
|
|
tbuf2);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Could not verify (%d).\n", rv);
|
|
GWEN_Buffer_Dump(tbuf2, stderr, 2);
|
|
return 2;
|
|
}
|
|
fprintf(stderr, "Decoding message... done\n");
|
|
|
|
if (sizeof(testData)-1!=GWEN_Buffer_GetUsedBytes(tbuf2)) {
|
|
fprintf(stderr, "Crypto-Error (size):\n");
|
|
GWEN_Buffer_Dump(tbuf1, stderr, 2);
|
|
GWEN_Buffer_Dump(tbuf2, stderr, 2);
|
|
return 2;
|
|
}
|
|
|
|
if (memcmp(testData, GWEN_Buffer_GetStart(tbuf2), GWEN_Buffer_GetUsedBytes(tbuf2))!=0) {
|
|
fprintf(stderr, "Crypto-Error (content):\n");
|
|
GWEN_Buffer_Dump(tbuf1, stderr, 2);
|
|
GWEN_Buffer_Dump(tbuf2, stderr, 2);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Crypto-stuff ok.\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testPss1(int argc, char **argv) {
|
|
uint8_t em[]={
|
|
0x57, 0xa4, 0x11, 0xc3, 0x48, 0x99, 0xf6, 0x8e, 0xb8, 0x93, 0x83, 0x6a, 0xe5, 0xc6, 0xe1, 0xc3,
|
|
0x11, 0x45, 0xea, 0x6e, 0x8c, 0xf7, 0xd3, 0xb1, 0xc6, 0x17, 0xb6, 0x55, 0xf9, 0xc6, 0x64, 0x7a,
|
|
0xa8, 0xe1, 0x07, 0x1b, 0xa0, 0xc6, 0x08, 0xfa, 0x70, 0xfd, 0xbb, 0xa4, 0x52, 0xb6, 0xa9, 0xcb,
|
|
0x42, 0x31, 0xb0, 0x5a, 0x70, 0xe4, 0xa7, 0x09, 0xb0, 0x37, 0x15, 0xe4, 0xc5, 0x89, 0xd1, 0xc1,
|
|
0x24, 0x0f, 0x65, 0xa9, 0x7a, 0x1a, 0x20, 0xe0, 0x2a, 0xd8, 0x91, 0x00, 0xb2, 0x8a, 0xf7, 0x93,
|
|
0x5b, 0x86, 0x4e, 0x40, 0xb8, 0x20, 0x15, 0xb5, 0x34, 0x0a, 0xe5, 0x4c, 0xf2, 0x29, 0x02, 0x1d,
|
|
0x8c, 0x15, 0xcf, 0x1e, 0x81, 0x6a, 0x7d, 0x33, 0x12, 0xc6, 0x39, 0xe6, 0xa4, 0x1e, 0x2d, 0x95,
|
|
0x07, 0xe4, 0x2d, 0x23, 0xb5, 0x8a, 0xd6, 0xb2, 0xef, 0x1c, 0xed, 0x92, 0x5a, 0x7c, 0xa9, 0x1f,
|
|
0xb0, 0xce, 0xb9, 0x2b, 0x1c, 0xa8, 0x73, 0x25, 0xa2, 0x82, 0xed, 0x13, 0x50, 0x47, 0x58, 0xd5,
|
|
0xdf, 0xd9, 0x94, 0x5f, 0x3a, 0x7e, 0x73, 0xbe, 0xd0, 0x09, 0xa8, 0xcf, 0xdf, 0xd8, 0x71, 0x77,
|
|
0x0c, 0x70, 0xe6, 0xb3, 0xc0, 0x10, 0x96, 0x70, 0x27, 0x31, 0x4d, 0x8b, 0x17, 0x5b, 0x30, 0x92,
|
|
0xdb, 0xac, 0x62, 0x41, 0x90, 0x8e, 0x6b, 0xac, 0xcf, 0x7b, 0x42, 0x63, 0x66, 0xe7, 0xb3, 0xee,
|
|
0xd4, 0x32, 0xab, 0x2d, 0xa4, 0xf0, 0x5d, 0x71, 0x25, 0x4a, 0x6f, 0x8c, 0x0d, 0xda, 0x43, 0xf0,
|
|
0x53, 0xb5, 0x80, 0xc3, 0xd6, 0x77, 0xed, 0x5f, 0xe6, 0x1b, 0x3c, 0x5a, 0xa7, 0x23, 0xd7, 0x0b,
|
|
0xa6, 0x0c, 0xdc, 0xbd, 0xd6, 0x59, 0x12, 0xfa, 0x37, 0x9b, 0xcd, 0xa1, 0x78, 0x06, 0x07, 0x2e,
|
|
0x35, 0xa7, 0x7d, 0x11, 0xf5, 0xa7, 0xac, 0xbc
|
|
};
|
|
uint8_t hash[]={
|
|
0x00, 0x6d, 0x9d, 0x67, 0x58, 0xa9, 0x23, 0xf5, 0x46, 0xdc, 0x6d, 0x2b, 0xd7, 0xea, 0x78, 0xab,
|
|
0x1d, 0xcf, 0x6d, 0x47, 0x37, 0x35, 0xae, 0x93, 0xa9, 0x3b, 0x69, 0x17, 0xcc, 0xe1, 0xf5, 0x05
|
|
};
|
|
GWEN_MDIGEST *md;
|
|
int rv;
|
|
|
|
md=GWEN_MDigest_Sha256_new();
|
|
rv=GWEN_Padd_VerifyPkcs1Pss(em, sizeof(em),
|
|
1984,
|
|
hash, sizeof(hash),
|
|
32,
|
|
md);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error decoding em\n");
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Success\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testPss2(int argc, char **argv) {
|
|
uint8_t m[]={"This is the test message"};
|
|
uint8_t em[1024];
|
|
uint8_t hash[32];
|
|
GWEN_MDIGEST *md;
|
|
int rv;
|
|
|
|
md=GWEN_MDigest_Sha256_new();
|
|
|
|
/* hash message */
|
|
rv=GWEN_MDigest_Begin(md);
|
|
if (rv<0) {
|
|
DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
|
|
return rv;
|
|
}
|
|
|
|
rv=GWEN_MDigest_Update(md, m, sizeof(m));
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error hashing m (update: %d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
rv=GWEN_MDigest_End(md);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error hashing m (end: %d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
memmove(hash,
|
|
GWEN_MDigest_GetDigestPtr(md),
|
|
GWEN_MDigest_GetDigestSize(md));
|
|
|
|
fprintf(stderr, "Message encoded.\n");
|
|
GWEN_MDigest_free(md);
|
|
|
|
md=GWEN_MDigest_Sha256_new();
|
|
rv=GWEN_Padd_AddPkcs1Pss(em, sizeof(em),
|
|
1984,
|
|
hash, sizeof(hash),
|
|
32,
|
|
md);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error decoding em\n");
|
|
return 2;
|
|
}
|
|
|
|
rv=GWEN_Padd_VerifyPkcs1Pss(em, rv,
|
|
1984,
|
|
hash, sizeof(hash),
|
|
32,
|
|
md);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error decoding em\n");
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Success\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testDialog(int argc, char **argv) {
|
|
GWEN_XMLNODE *n;
|
|
GWEN_XMLNODE *nDialog;
|
|
GWEN_DIALOG *dlg;
|
|
int rv;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Name of testfile needed.\n");
|
|
return 1;
|
|
}
|
|
n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"root");
|
|
GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Debug);
|
|
GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Verbous);
|
|
if (GWEN_XML_ReadFile(n, argv[2],
|
|
GWEN_XML_FLAGS_DEFAULT |
|
|
GWEN_XML_FLAGS_HANDLE_HEADERS)) {
|
|
fprintf(stderr, "Error reading XML file.\n");
|
|
return 1;
|
|
}
|
|
fprintf(stderr, "XML file:\n");
|
|
GWEN_XMLNode_Dump(n, stdout, 2);
|
|
|
|
nDialog=GWEN_XMLNode_FindFirstTag(n, "dialog", NULL, NULL);
|
|
if (nDialog==NULL) {
|
|
fprintf(stderr, "Dialog not found in XML file\n");
|
|
return 2;
|
|
}
|
|
|
|
|
|
dlg=GWEN_Dialog_new("testdialog");
|
|
rv=GWEN_Dialog_ReadXml(dlg, nDialog);
|
|
if (rv) {
|
|
fprintf(stderr, "Error reading widgets from XML node: %d\n", rv);
|
|
return 2;
|
|
}
|
|
GWEN_XMLNode_free(n);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testSyncIo1(int argc, char **argv) {
|
|
int rv;
|
|
const char *fname;
|
|
GWEN_SYNCIO *sio;
|
|
GWEN_BUFFER *tbuf;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Name of testfile needed.\n");
|
|
return 1;
|
|
}
|
|
|
|
fname=argv[2];
|
|
sio=GWEN_SyncIo_File_new(fname, GWEN_SyncIo_File_CreationMode_OpenExisting);
|
|
fprintf(stderr, "Opening file\n");
|
|
rv=GWEN_SyncIo_Connect(sio);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error opening file: %d\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
do {
|
|
uint8_t *p;
|
|
|
|
GWEN_Buffer_AllocRoom(tbuf, 1024);
|
|
p=(uint8_t*) GWEN_Buffer_GetPosPointer(tbuf);
|
|
rv=GWEN_SyncIo_Read(sio, p, 1024);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error reading file: %d\n", rv);
|
|
GWEN_Buffer_Dump(tbuf, stderr, 2);
|
|
return 2;
|
|
}
|
|
else if (rv>0) {
|
|
fprintf(stderr, "Received %d bytes\n", rv);
|
|
GWEN_Buffer_IncrementPos(tbuf, rv);
|
|
GWEN_Buffer_AdjustUsedBytes(tbuf);
|
|
}
|
|
else if (rv==0) {
|
|
fprintf(stderr, "EOF met.\n");
|
|
}
|
|
} while(rv>0);
|
|
|
|
fprintf(stderr, "File received.\n");
|
|
GWEN_Buffer_Dump(tbuf, stderr, 2);
|
|
|
|
rv=GWEN_SyncIo_Disconnect(sio);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error closing file: %d\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Finished.\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testSyncIo2(int argc, char **argv) {
|
|
int rv;
|
|
const char *fname;
|
|
GWEN_SYNCIO *baseIo;
|
|
GWEN_SYNCIO *sio;
|
|
GWEN_BUFFER *tbuf;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Name of testfile needed.\n");
|
|
return 1;
|
|
}
|
|
|
|
fname=argv[2];
|
|
baseIo=GWEN_SyncIo_File_new(fname, GWEN_SyncIo_File_CreationMode_OpenExisting);
|
|
sio=GWEN_SyncIo_Buffered_new(baseIo);
|
|
|
|
fprintf(stderr, "Opening file\n");
|
|
rv=GWEN_SyncIo_Connect(sio);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error opening file: %d\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
do {
|
|
uint8_t *p;
|
|
|
|
GWEN_Buffer_AllocRoom(tbuf, 1024);
|
|
p=(uint8_t*) GWEN_Buffer_GetPosPointer(tbuf);
|
|
rv=GWEN_SyncIo_Read(sio, p, 1024);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error reading file: %d\n", rv);
|
|
GWEN_Buffer_Dump(tbuf, stderr, 2);
|
|
return 2;
|
|
}
|
|
else if (rv>0) {
|
|
fprintf(stderr, "Received %d bytes\n", rv);
|
|
GWEN_Buffer_IncrementPos(tbuf, rv);
|
|
GWEN_Buffer_AdjustUsedBytes(tbuf);
|
|
if (p[rv-1]==10) {
|
|
fprintf(stderr, "Received line:\n");
|
|
GWEN_Buffer_Dump(tbuf, stderr, 2);
|
|
GWEN_Buffer_Reset(tbuf);
|
|
getchar();
|
|
}
|
|
}
|
|
else if (rv==0) {
|
|
fprintf(stderr, "EOF met.\n");
|
|
}
|
|
} while(rv>0);
|
|
|
|
rv=GWEN_SyncIo_Disconnect(sio);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error closing file: %d\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Finished.\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testSyncIo3(int argc, char **argv) {
|
|
int rv;
|
|
const char *fname;
|
|
GWEN_SYNCIO *baseIo;
|
|
GWEN_SYNCIO *sio;
|
|
GWEN_BUFFER *tbuf;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Name of testfile needed.\n");
|
|
return 1;
|
|
}
|
|
|
|
fname=argv[2];
|
|
baseIo=GWEN_SyncIo_File_new(fname, GWEN_SyncIo_File_CreationMode_OpenExisting);
|
|
sio=GWEN_SyncIo_Buffered_new(baseIo);
|
|
|
|
fprintf(stderr, "Opening file\n");
|
|
rv=GWEN_SyncIo_Connect(sio);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error opening file: %d\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
do {
|
|
uint8_t *p;
|
|
|
|
GWEN_Buffer_AllocRoom(tbuf, 1024);
|
|
p=(uint8_t*) GWEN_Buffer_GetPosPointer(tbuf);
|
|
rv=GWEN_SyncIo_Read(sio, p, 1024);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error reading file: %d\n", rv);
|
|
GWEN_Buffer_Dump(tbuf, stderr, 2);
|
|
return 2;
|
|
}
|
|
else if (rv>0) {
|
|
fprintf(stderr, "Received %d bytes\n", rv);
|
|
GWEN_Buffer_IncrementPos(tbuf, rv);
|
|
GWEN_Buffer_AdjustUsedBytes(tbuf);
|
|
if (p[rv-1]==10) {
|
|
fprintf(stderr, "Received line:\n");
|
|
GWEN_Buffer_Dump(tbuf, stderr, 2);
|
|
getchar();
|
|
}
|
|
}
|
|
else if (rv==0) {
|
|
fprintf(stderr, "EOF met.\n");
|
|
}
|
|
GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_TRANSPARENT);
|
|
} while(rv>0);
|
|
|
|
|
|
fprintf(stderr, "File received.\n");
|
|
GWEN_Buffer_Dump(tbuf, stderr, 2);
|
|
|
|
rv=GWEN_SyncIo_Disconnect(sio);
|
|
if (rv<0) {
|
|
fprintf(stderr, "Error closing file: %d\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Finished.\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testHttp1(int argc, char **argv) {
|
|
int rv;
|
|
const char *fname;
|
|
GWEN_SYNCIO *sio=NULL;
|
|
GWEN_SYNCIO *sioTls;
|
|
int firstRead=1;
|
|
int bodySize=-1;
|
|
int bytesRead=0;
|
|
GWEN_BUFFER *tbuf;
|
|
GWEN_GUI *gui;
|
|
GWEN_DB_NODE *db;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Name of testfile needed.\n");
|
|
return 1;
|
|
}
|
|
|
|
fprintf(stderr, "Creating gui.\n");
|
|
gui=GWEN_Gui_CGui_new();
|
|
GWEN_Gui_SetGui(gui);
|
|
|
|
fname=argv[2];
|
|
|
|
|
|
|
|
rv=GWEN_Gui_GetSyncIo(fname, "http", 80, &sio);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR: Could not get SyncIO (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
sioTls=GWEN_SyncIo_GetBaseIoByTypeName(sio, GWEN_SYNCIO_TLS_TYPE);
|
|
if (sioTls) {
|
|
GWEN_SyncIo_SubFlags(sioTls, GWEN_SYNCIO_TLS_FLAGS_FORCE_SSL_V3);
|
|
GWEN_SyncIo_AddFlags(sioTls, GWEN_SYNCIO_TLS_FLAGS_ALLOW_V1_CA_CRT);
|
|
GWEN_SyncIo_AddFlags(sioTls, GWEN_SYNCIO_TLS_FLAGS_ADD_TRUSTED_CAS);
|
|
fprintf(stderr, "Remote host: %s\n", GWEN_SyncIo_Tls_GetRemoteHostName(sioTls));
|
|
}
|
|
|
|
rv=GWEN_SyncIo_Connect(sio);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR: Could not connect (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
/* send request */
|
|
db=GWEN_SyncIo_Http_GetDbHeaderOut(sio);
|
|
GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", 0);
|
|
rv=GWEN_SyncIo_Write(sio, (uint8_t*)"", 0);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR: Could not write (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
/* get response */
|
|
tbuf=GWEN_Buffer_new(0, 1024, 0, 1);
|
|
for (;;) {
|
|
uint8_t *p;
|
|
uint32_t l;
|
|
|
|
rv=GWEN_Buffer_AllocRoom(tbuf, 1024);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR in check_syncio_http1: Could not allocRoom (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
p=(uint8_t*) GWEN_Buffer_GetPosPointer(tbuf);
|
|
l=GWEN_Buffer_GetMaxUnsegmentedWrite(tbuf);
|
|
do {
|
|
rv=GWEN_SyncIo_Read(sio, p, l-1);
|
|
} while(rv==GWEN_ERROR_INTERRUPTED);
|
|
if (rv==0)
|
|
break;
|
|
else if (rv<0) {
|
|
if (rv==GWEN_ERROR_EOF) {
|
|
if (bodySize!=-1 && bytesRead<bodySize) {
|
|
fprintf(stderr,
|
|
"ERROR: Received too few bytes (%d<%d)\n",
|
|
bytesRead, bodySize);
|
|
return 2;
|
|
}
|
|
}
|
|
fprintf(stderr,
|
|
"ERROR: Could not read (%d) [%d / %d]\n",
|
|
rv, bytesRead, bodySize);
|
|
return 2;
|
|
}
|
|
else {
|
|
GWEN_Buffer_IncrementPos(tbuf, rv);
|
|
GWEN_Buffer_AdjustUsedBytes(tbuf);
|
|
if (firstRead) {
|
|
GWEN_DB_NODE *db;
|
|
|
|
db=GWEN_SyncIo_Http_GetDbHeaderIn(sio);
|
|
bodySize=GWEN_DB_GetIntValue(db, "Content-length", 0, -1);
|
|
}
|
|
bytesRead+=rv;
|
|
}
|
|
|
|
if (bodySize!=-1 && bytesRead>=bodySize) {
|
|
break;
|
|
}
|
|
firstRead=0;
|
|
}
|
|
|
|
#if 1
|
|
fprintf(stderr, "Received:\n");
|
|
GWEN_Buffer_Dump(tbuf, stderr, 2);
|
|
#endif
|
|
GWEN_Buffer_free(tbuf);
|
|
|
|
rv=GWEN_SyncIo_Disconnect(sio);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR in check_syncio_http1: Could not disconnect (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Finished.\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testHttp2(int argc, char **argv) {
|
|
int rv;
|
|
const char *foutName;
|
|
const char *finName;
|
|
const char *url;
|
|
GWEN_SYNCIO *sio=NULL;
|
|
GWEN_SYNCIO *sioTls;
|
|
int firstRead=1;
|
|
int bodySize=-1;
|
|
int bytesRead=0;
|
|
GWEN_BUFFER *ibuf;
|
|
GWEN_BUFFER *tbuf;
|
|
GWEN_GUI *gui;
|
|
GWEN_DB_NODE *db;
|
|
|
|
if (argc<5) {
|
|
fprintf(stderr, "Usage: %s url sendfile recvfile\n", argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
fprintf(stderr, "Creating gui.\n");
|
|
gui=GWEN_Gui_CGui_new();
|
|
GWEN_Gui_SetGui(gui);
|
|
|
|
url=argv[2];
|
|
foutName=argv[3];
|
|
finName=argv[4];
|
|
|
|
ibuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
rv=readFile(foutName, ibuf);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR: Could not read file (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
rv=GWEN_Gui_GetSyncIo(url, "http", 80, &sio);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR: Could not get SyncIO (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
sioTls=GWEN_SyncIo_GetBaseIoByTypeName(sio, GWEN_SYNCIO_TLS_TYPE);
|
|
if (sioTls) {
|
|
GWEN_SyncIo_SubFlags(sioTls, GWEN_SYNCIO_TLS_FLAGS_FORCE_SSL_V3);
|
|
GWEN_SyncIo_AddFlags(sioTls, GWEN_SYNCIO_TLS_FLAGS_ALLOW_V1_CA_CRT);
|
|
GWEN_SyncIo_AddFlags(sioTls, GWEN_SYNCIO_TLS_FLAGS_ADD_TRUSTED_CAS);
|
|
fprintf(stderr, "Remote host: %s\n", GWEN_SyncIo_Tls_GetRemoteHostName(sioTls));
|
|
}
|
|
|
|
rv=GWEN_SyncIo_Connect(sio);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR: Could not connect (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
/* send request */
|
|
db=GWEN_SyncIo_Http_GetDbCommandOut(sio);
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Command", "POST");
|
|
|
|
db=GWEN_SyncIo_Http_GetDbHeaderOut(sio);
|
|
GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-Type", "application/x-www-form-urlencoded");
|
|
GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", GWEN_Buffer_GetUsedBytes(ibuf));
|
|
rv=GWEN_SyncIo_WriteForced(sio,
|
|
(uint8_t*) GWEN_Buffer_GetStart(ibuf),
|
|
GWEN_Buffer_GetUsedBytes(ibuf));
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR: Could not write (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
/* get response */
|
|
tbuf=GWEN_Buffer_new(0, 1024, 0, 1);
|
|
for (;;) {
|
|
uint8_t *p;
|
|
uint32_t l;
|
|
|
|
rv=GWEN_Buffer_AllocRoom(tbuf, 1024);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR in check_syncio_http1: Could not allocRoom (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
p=(uint8_t*) GWEN_Buffer_GetPosPointer(tbuf);
|
|
l=GWEN_Buffer_GetMaxUnsegmentedWrite(tbuf);
|
|
do {
|
|
rv=GWEN_SyncIo_Read(sio, p, l-1);
|
|
} while(rv==GWEN_ERROR_INTERRUPTED);
|
|
if (rv==0)
|
|
break;
|
|
else if (rv<0) {
|
|
if (rv==GWEN_ERROR_EOF) {
|
|
if (bodySize!=-1 && bytesRead<bodySize) {
|
|
fprintf(stderr,
|
|
"ERROR: Received too few bytes (%d<%d)\n",
|
|
bytesRead, bodySize);
|
|
return 2;
|
|
}
|
|
}
|
|
fprintf(stderr,
|
|
"ERROR: Could not read (%d) [%d / %d]\n",
|
|
rv, bytesRead, bodySize);
|
|
return 2;
|
|
}
|
|
else {
|
|
GWEN_Buffer_IncrementPos(tbuf, rv);
|
|
GWEN_Buffer_AdjustUsedBytes(tbuf);
|
|
if (firstRead) {
|
|
GWEN_DB_NODE *db;
|
|
|
|
db=GWEN_SyncIo_Http_GetDbHeaderIn(sio);
|
|
bodySize=GWEN_DB_GetIntValue(db, "Content-length", 0, -1);
|
|
}
|
|
bytesRead+=rv;
|
|
}
|
|
|
|
if (bodySize!=-1 && bytesRead>=bodySize) {
|
|
break;
|
|
}
|
|
firstRead=0;
|
|
}
|
|
|
|
rv=writeFile(finName, GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf));
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR in writeFile (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
#if 1
|
|
fprintf(stderr, "Received:\n");
|
|
GWEN_Buffer_Dump(tbuf, stderr, 2);
|
|
#endif
|
|
GWEN_Buffer_free(tbuf);
|
|
|
|
rv=GWEN_SyncIo_Disconnect(sio);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR in check_syncio_http1: Could not disconnect (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
fprintf(stderr, "Finished.\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testTresor1(int argc, char **argv) {
|
|
int rv;
|
|
const char *testData="This is the actual test data";
|
|
GWEN_BUFFER *buf1;
|
|
GWEN_BUFFER *buf2;
|
|
|
|
buf1=GWEN_Buffer_new(0, 256, 0, 1);
|
|
rv=GWEN_SmallTresor_Encrypt((const uint8_t*) testData,
|
|
strlen(testData),
|
|
"TESTPASSWORD",
|
|
buf1,
|
|
1546,
|
|
1937);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR in checkTresor1: Could not encrypt (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
buf2=GWEN_Buffer_new(0, 256, 0, 1);
|
|
rv=GWEN_SmallTresor_Decrypt((const uint8_t*) GWEN_Buffer_GetStart(buf1),
|
|
GWEN_Buffer_GetUsedBytes(buf1),
|
|
"TESTPASSWORD",
|
|
buf2,
|
|
1546,
|
|
1937);
|
|
if (rv<0) {
|
|
fprintf(stderr,
|
|
"ERROR in checkTresor1: Could not decrypt (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
DBG_ERROR(0, "Got this:");
|
|
GWEN_Buffer_Dump(buf2, stderr, 2);
|
|
|
|
fprintf(stderr, "Finished.\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int testHashTree(int argc, char **argv) {
|
|
int rv;
|
|
GWEN_MDIGEST *md;
|
|
GWEN_STRINGLIST *sl;
|
|
GWEN_STRINGLISTENTRY *se;
|
|
|
|
if (argc<3) {
|
|
fprintf(stderr, "Folder needed\n");
|
|
return 1;
|
|
}
|
|
|
|
sl=GWEN_StringList_new();
|
|
md=GWEN_MDigest_Rmd160_new();
|
|
rv=GWEN_MDigest_HashFileTree(md, argv[2], NULL, sl);
|
|
if (rv<0) {
|
|
fprintf(stderr, "ERROR on HASHTREE (%d)\n", rv);
|
|
return 2;
|
|
}
|
|
|
|
se=GWEN_StringList_FirstEntry(sl);
|
|
while(se) {
|
|
const char *s;
|
|
|
|
s=GWEN_StringListEntry_Data(se);
|
|
if (s && *s)
|
|
fprintf(stderr, " %s\n", s);
|
|
se=GWEN_StringListEntry_Next(se);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char **argv) {
|
|
int rv;
|
|
|
|
GWEN_Init();
|
|
GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Debug);
|
|
GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Info);
|
|
|
|
if (argc<2) {
|
|
fprintf(stderr, "Usage: %s <test>\n where <test> is one of db, dbfile, dbfile2, list, key, mkkey, cpkey, xml, xml2, sn, ssl, accept, connect\n", argv[0]);
|
|
GWEN_Fini();
|
|
return 1;
|
|
}
|
|
|
|
|
|
if (strcasecmp(argv[1], "dbfile")==0)
|
|
rv=testDBfile(argc, argv);
|
|
else if (strcasecmp(argv[1], "des")==0)
|
|
rv=testDES(argc, argv);
|
|
else if (strcasecmp(argv[1], "des2")==0)
|
|
rv=testDES2(argc, argv);
|
|
else if (strcasecmp(argv[1], "des3")==0)
|
|
rv=testDES3(argc, argv);
|
|
else if (strcasecmp(argv[1], "des4")==0)
|
|
rv=testDES4(argc, argv);
|
|
else if (strcasecmp(argv[1], "db")==0)
|
|
rv=testDB(argc, argv);
|
|
else if (strcasecmp(argv[1], "db2")==0)
|
|
rv=testDB2(argc, argv);
|
|
else if (strcasecmp(argv[1], "dbfile2")==0)
|
|
rv=testDBfile2(argc, argv);
|
|
else if (strcasecmp(argv[1], "dbfile3")==0)
|
|
rv=testDBfile3(argc, argv);
|
|
else if (strcasecmp(argv[1], "dbfile4")==0)
|
|
rv=testDBfile4(argc, argv);
|
|
else if (strcasecmp(argv[1], "list")==0)
|
|
rv=testListMsg(argc, argv);
|
|
else if (strcasecmp(argv[1], "xml")==0)
|
|
rv=testXML(argc, argv);
|
|
else if (strcasecmp(argv[1], "xml2")==0)
|
|
rv=testXML2(argc, argv);
|
|
else if (strcasecmp(argv[1], "xml3")==0)
|
|
rv=testXML3(argc, argv);
|
|
else if (strcasecmp(argv[1], "xml4")==0)
|
|
rv=testXML4(argc, argv);
|
|
else if (strcasecmp(argv[1], "xml5")==0)
|
|
rv=testXML5(argc, argv);
|
|
else if (strcasecmp(argv[1], "sn")==0)
|
|
rv=testSnprintf(argc, argv);
|
|
else if (strcasecmp(argv[1], "process")==0)
|
|
rv=testProcess(argc, argv);
|
|
else if (strcasecmp(argv[1], "option")==0)
|
|
rv=testOptions(argc, argv);
|
|
else if (strcasecmp(argv[1], "base64")==0)
|
|
rv=testBase64(argc, argv);
|
|
else if (strcasecmp(argv[1], "base64_2")==0)
|
|
rv=testBase64_2(argc, argv);
|
|
else if (strcasecmp(argv[1], "time")==0)
|
|
rv=testTime(argc, argv);
|
|
else if (strcasecmp(argv[1], "time2")==0)
|
|
rv=testTimeFromString(argc, argv);
|
|
else if (strcasecmp(argv[1], "time1")==0)
|
|
rv=testTimeToString(argc, argv);
|
|
else if (strcasecmp(argv[1], "olddb")==0)
|
|
rv=testOldDbImport(argc, argv);
|
|
else if (strcasecmp(argv[1], "822")==0)
|
|
rv=testRfc822Import(argc, argv);
|
|
else if (strcasecmp(argv[1], "822x")==0)
|
|
rv=testRfc822Export(argc, argv);
|
|
else if (strcasecmp(argv[1], "xmldb1")==0)
|
|
rv=testXmlDbExport(argc, argv);
|
|
else if (strcasecmp(argv[1], "xmldb2")==0)
|
|
rv=testXmlDbImport(argc, argv);
|
|
else if (strcasecmp(argv[1], "fslock")==0)
|
|
rv=testFsLock(argc, argv);
|
|
else if (strcasecmp(argv[1], "fslock2")==0)
|
|
rv=testFsLock2(argc, argv);
|
|
else if (strcasecmp(argv[1], "ptr")==0)
|
|
rv=testPtr(argc, argv);
|
|
else if (strcasecmp(argv[1], "sl2")==0)
|
|
rv=testStringList2(argc, argv);
|
|
else if (strcasecmp(argv[1], "fuzzy")==0)
|
|
rv=testFuzzy(argc, argv);
|
|
else if (strcasecmp(argv[1], "sort")==0)
|
|
rv=testSort(argc, argv);
|
|
else if (strcasecmp(argv[1], "buf2")==0)
|
|
rv=testBuffer2(argc, argv);
|
|
else if (strcasecmp(argv[1], "mem")==0)
|
|
rv=testMem(argc, argv);
|
|
else if (strcasecmp(argv[1], "floatdouble")==0)
|
|
rv=testFloatDouble(argc, argv);
|
|
else if (strcasecmp(argv[1], "map")==0)
|
|
rv=testMap(argc, argv);
|
|
else if (strcasecmp(argv[1], "map2")==0)
|
|
rv=testMap2(argc, argv);
|
|
else if (strcasecmp(argv[1], "map3")==0)
|
|
rv=testMap3(argc, argv);
|
|
else if (strcasecmp(argv[1], "map4")==0)
|
|
rv=testMap4(argc, argv);
|
|
else if (strcasecmp(argv[1], "idlist")==0)
|
|
rv=testIdList(argc, argv);
|
|
else if (strcasecmp(argv[1], "signals1")==0)
|
|
rv=testSignals1(argc, argv);
|
|
else if (strcasecmp(argv[1], "signals2")==0)
|
|
rv=testSignals2(argc, argv);
|
|
else if (strcasecmp(argv[1], "signals3")==0)
|
|
rv=testSignals3(argc, argv);
|
|
else if (strcasecmp(argv[1], "url")==0)
|
|
rv=testUrl(argc, argv);
|
|
else if (strcasecmp(argv[1], "newxml")==0)
|
|
rv=testNewXML(argc, argv);
|
|
else if (strcasecmp(argv[1], "3rsa")==0)
|
|
rv=testCrypt3Rsa(argc, argv);
|
|
else if (strcasecmp(argv[1], "3rsa2")==0)
|
|
rv=testCrypt3Rsa2(argc, argv);
|
|
else if (strcasecmp(argv[1], "gtls")==0)
|
|
rv=testGnutls(argc, argv);
|
|
else if (strcasecmp(argv[1], "httpsession")==0)
|
|
rv=testHttpSession(argc, argv);
|
|
else if (strcasecmp(argv[1], "rsa")==0) {
|
|
check_rsa_keys();
|
|
rv=0;
|
|
}
|
|
else if (strcasecmp(argv[1], "cryptmgr1")==0) {
|
|
rv=testCryptMgr1(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "cryptmgr2")==0) {
|
|
rv=testCryptMgr2(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "cryptmgr3")==0) {
|
|
rv=testCryptMgr3(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "pss1")==0) {
|
|
rv=testPss1(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "pss2")==0) {
|
|
rv=testPss2(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "dlg")==0) {
|
|
rv=testDialog(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "sio1")==0) {
|
|
rv=testSyncIo1(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "sio2")==0) {
|
|
rv=testSyncIo2(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "sio3")==0) {
|
|
rv=testSyncIo3(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "http1")==0) {
|
|
rv=testHttp1(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "http2")==0) {
|
|
rv=testHttp2(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "tresor1")==0) {
|
|
rv=testTresor1(argc, argv);
|
|
}
|
|
else if (strcasecmp(argv[1], "hashtree")==0) {
|
|
rv=testHashTree(argc, argv);
|
|
}
|
|
else {
|
|
fprintf(stderr, "Unknown command \"%s\"\n", argv[1]);
|
|
GWEN_Fini();
|
|
return 1;
|
|
}
|
|
|
|
GWEN_Fini();
|
|
return rv;
|
|
}
|
|
|