#define _POSIX_C_SOURCE 200809L #include "cable.h" #include "sleep_crypto.h" #include #include #include #include #include #include #include #include int main(void) { uint8_t key[32], parsed[32], plain[900], sealed[1000], opened[900]; char address[160],identity_dir[]="/tmp/cable-test-XXXXXX",identity_path[256];size_t n,sealed_n,opened_n;enum cable_address_scheme scheme; sleep_keypair_t alice,bob;cable_chat_message_t message,decoded; assert(sleep_crypto_init()==0); memset(key,0xa5,sizeof(key)); assert(cable_address_format(key,CABLE_ADDRESS_CABLE,address,sizeof(address))==0); assert(!strncmp(address,"cable://",8)); assert(cable_address_parse(address,parsed,&scheme)==0&&scheme==CABLE_ADDRESS_CABLE); assert(!memcmp(key,parsed,32)); assert(cable_address_parse("hyper://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",parsed,&scheme)==0); assert(scheme==CABLE_ADDRESS_HYPER); assert(cable_address_parse("dat://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",parsed,&scheme)<0); { cable_room_address_t room,parsed_room; char room_text[160]; memset(&room,0,sizeof(room));memset(room.key,0x11,32);memset(room.admin_key,0x22,32);room.has_admin=1; assert(cable_room_address_format(&room,CABLE_ADDRESS_CABAL,room_text,sizeof(room_text))==0); assert(strstr(room_text,"?admin=")!=NULL); assert(cable_room_address_parse(room_text,&parsed_room)==0); assert(parsed_room.has_admin&&memcmp(room.key,parsed_room.key,32)==0&&memcmp(room.admin_key,parsed_room.admin_key,32)==0); } assert(mkdtemp(identity_dir)!=NULL); assert(snprintf(identity_path,sizeof(identity_path),"%s/user-feed.key",identity_dir)>0); { sleep_keypair_t first,second;struct stat info; assert(cable_user_identity_load_or_create(identity_path,&first)==0); assert(stat(identity_path,&info)==0&&(info.st_mode&077)==0); assert(cable_user_address_format(first.pubkey,CABLE_ADDRESS_CABLE,address,sizeof(address))==0); assert(cable_user_identity_load_or_create(identity_path,&second)==0); assert(memcmp(first.pubkey,second.pubkey,32)==0&&memcmp(first.seckey,second.seckey,64)==0); sodium_memzero(&first,sizeof(first));sodium_memzero(&second,sizeof(second)); } assert(unlink(identity_path)==0);assert(rmdir(identity_dir)==0); { uint8_t room_a[32]={1},room_b[32]={2};char home[]="/tmp/cable-home-XXXXXX"; char path_a[512],path_b[512],dir_a[512],dir_b[512],feed_dir[520],rooms[512],base[512]; sleep_keypair_t a1,a2,b; sleep_feed_t feed; uint8_t user_key[32],*block=NULL; size_t block_length=0; assert(mkdtemp(home)!=NULL); assert(cable_user_identity_path(home,room_a,path_a,sizeof(path_a))==0); assert(cable_user_identity_path(home,room_b,path_b,sizeof(path_b))==0); assert(strcmp(path_a,path_b)!=0); assert(cable_user_identity_load_or_create(path_a,&a1)==0); assert(cable_user_identity_load_or_create(path_a,&a2)==0); assert(cable_user_identity_load_or_create(path_b,&b)==0); assert(memcmp(a1.pubkey,a2.pubkey,32)==0&&memcmp(a1.pubkey,b.pubkey,32)!=0); assert(cable_user_feed_publish(home,room_a,"about","cable-test-user",NULL,NULL,user_key)==0); assert(!memcmp(user_key,a1.pubkey,sizeof(user_key))); assert(cable_user_feed_publish(home,room_a,"chat/text",NULL,"test-channel", "Cabal-shaped message",user_key)==0); assert(cable_user_feed_open(home,room_a,&a2,&feed)==0); assert(sleep_feed_length(&feed)==2); assert(sleep_feed_read(&feed,1,&block,&block_length)==0); assert(strstr((const char *)block,"\"type\":\"chat/text\"")!=NULL); assert(strstr((const char *)block,"Cabal-shaped message")!=NULL); free(block);block=NULL;sleep_feed_close(&feed); strcpy(dir_a,path_a);*strrchr(dir_a,'/')='\0';strcpy(dir_b,path_b);*strrchr(dir_b,'/')='\0'; snprintf(feed_dir,sizeof(feed_dir),"%s/0",dir_a); { static const char *aliases[]={"feed.tree","feed.signatures","feed.bitfield","feed.data","feed.key","secret_key","localname"}; static const char *storage[]={"tree","signatures","bitfield","data","key"}; char file[600];size_t i; for(i=0;i