Exemple #1
0
char	*do_crypt (char *str, Crypt *key, int flag)
{
    size_t	c;
    char	*free_it = NULL;

    c = strlen(str);
    if (flag)
    {
        if (key->prog)
            free_it = str = (char*)prog_crypt(str, &c, key, flag);
        else
            my_encrypt(str, c, key->key);
        str = enquote_it(str, c);
    }
    else
    {
        str = dequote_it(str, &c);
        if (key->prog)
            str = (char*)prog_crypt(free_it = str, &c, key, flag);
        else
            my_decrypt(str, c, key->key);
    }
    new_free(&free_it);
    return (str);
}
Exemple #2
0
void nap_chat(int snum)
{
GetFile *gf;
unsigned char buffer[3*BIG_BUFFER_SIZE+1];
SocketList *s;
long bytesread;
char *tmp, *p;

	if (!(s = get_socket(snum)) || !(gf = (GetFile *)s->info))
	{
		put_it("error get_socket(%d)", snum);
		nap_finished_file(snum, PREMATURE_FINISH);
		return;
	}
	if (gf->deleted)
	{
		if (gf->write != -1)
			close(gf->write);
		gf->write = -1;
		if (gf->deleted++ > 5)
			close_socketread(snum);
		return;
	}
	bytesread = new_dgets(buffer, snum, 1, BIG_BUFFER_SIZE);
	switch (bytesread)
	{
		case -1:
			say("Lost DCC CHAT to %s [%s]", gf->nick, 
				(dgets_errno == -1) ? "Remote End Closed Connection" : 
					strerror(dgets_errno));
			break_from_list((List **)&transfer_struct, (List *)gf);
			nap_finished_file(snum, PREMATURE_FINISH);
			break;
		case 0:
			break;
		default:
			tmp = buffer;
			if ((p = strrchr(tmp, '\r')))
				*p = 0;
			if ((p = strrchr(tmp, '\n')))
				*p = 0;
			my_decrypt(tmp, strlen(tmp), gf->passwd);
			gf->received += bytesread;
#ifdef ALLOW_DCC_COMMANDS
			if ((gf->flags & NAP_DCC_COMMANDS) == NAP_DCC_COMMANDS)
			{
				if (!my_strnicmp(tmp, ".cmd ", 5) && *(tmp+6))
					parse_line("DCC", tmp+5, NULL, 0, 0, 1);
			}
#endif
			put_it(FORMAT_DCC_MSG, gf->nick, gf->ip, tmp);
			break;
	}
}
Exemple #3
0
int main(void){
    char *source = (char *)malloc(24);
    memcpy(source,"Welcome to LinkC Project",24);
    source[24] = 0;
    const char *OPENSSLKEY  = "test.key";
    const char *PUBLICKEY   = "test_pub.key";
    char *ptr_en,*ptr_de;
    printf("source is    :%s\n",source);
    ptr_en=my_encrypt(source,PUBLICKEY);
    printf("after encrypt:%s\n",ptr_en);
    ptr_de=my_decrypt(ptr_en,OPENSSLKEY);
    printf("after decrypt:%s\n",ptr_de);
    if(ptr_en!=NULL){
        free(ptr_en);
    }   
    if(ptr_de!=NULL){
        free(ptr_de);
    }   
    return 0;
}
Exemple #4
0
int wrapfs_readpage(struct file *file, struct page *page)
{
	int err;
	struct file *lower_file;
	struct inode *inode;
	mm_segment_t old_fs;
	char *page_data = NULL;
	mode_t orig_mode;
#ifdef WRAPFS_CRYPTO
	char *decrypted_buf = NULL;
#endif

	wrapfs_debug_aops(WRAPFS_SB(file->f_dentry->d_sb)->wrapfs_debug_a_ops,
				"");
	wrapfs_debug("");
	lower_file = wrapfs_lower_file(file);
	BUG_ON(lower_file == NULL);

	inode = file->f_path.dentry->d_inode;
	page_data = (char *) kmap(page);

	/*
	 * Use vfs_read because some lower file systems don't have a
	 * readpage method, and some file systems (esp. distributed ones)
	 * don't like their pages to be accessed directly.  Using vfs_read
	 * may be a little slower, but a lot safer, as the VFS does a lot of
	 * the necessary magic for us.
	 */
	lower_file->f_pos = page_offset(page);
	old_fs = get_fs();
	set_fs(KERNEL_DS);
	/*
	 * generic_file_splice_write may call us on a file not opened for
	 * reading, so temporarily allow reading.
	 */
	orig_mode = lower_file->f_mode;
	lower_file->f_mode |= FMODE_READ;
	err = vfs_read(lower_file, page_data, PAGE_CACHE_SIZE,
			&lower_file->f_pos);
	lower_file->f_mode = orig_mode;
	set_fs(old_fs);

#ifdef WRAPFS_CRYPTO
	/* At this point, we have the entire page from lower file system in
	 * page_data. If WRAPFS_CRYPTO is set, we need to decrypt page_data
	 * and store it back in page_data. I have taken the decrypt function
	 * from HW1 and made necessary modifications.
	 */
	decrypted_buf = kmalloc(PAGE_CACHE_SIZE, GFP_KERNEL);
	if (decrypted_buf == NULL) {
		wrapfs_debug("kmalloc failed!!");
		kunmap(page);
		err = -ENOMEM;
		goto out;
	}
	if (my_decrypt(page_data, PAGE_CACHE_SIZE, decrypted_buf,
			PAGE_CACHE_SIZE,
			WRAPFS_SB(file->f_dentry->d_sb)->key,
			WRAPFS_CRYPTO_KEY_LEN) < 0) {
		wrapfs_debug("my_decrypt failed!!");
		kunmap(page);
		kfree(decrypted_buf);
		err = -EINVAL;
	}
	memcpy(page_data, decrypted_buf, PAGE_CACHE_SIZE);
#endif

	if (err >= 0 && err < PAGE_CACHE_SIZE)
		memset(page_data + err, 0, PAGE_CACHE_SIZE - err);
	kunmap(page);

	if (err < 0)
		goto out;
	err = 0;

	/* if vfs_read succeeded above, sync up our times */
	fsstack_copy_attr_times(inode, lower_file->f_path.dentry->d_inode);

	flush_dcache_page(page);

out:
	if (err == 0)
		SetPageUptodate(page);
	else
		ClearPageUptodate(page);
	unlock_page(page);
	wrapfs_debug_aops(WRAPFS_SB(file->f_dentry->d_sb)->wrapfs_debug_a_ops,
				"err : %d", err);
	return err;
}
Exemple #5
0
/*
 * get_file() - get a file from the server accessible via the given socket
 *              fd, and save it according to the save_name
 */
void get_file(int fd, char *get_name, char *save_name) {
    	
	const int MAXLINE = 10005;
	/* construct message send to server,GET file */
	size_t fileNameLen = strlen(get_name);
	if(fileNameLen > 39) {
		die("file error: ", "flie name is too long");
	}
	
	char message[105];
	bzero(message, 105);
	char* ptr_mes = message;
	sprintf(ptr_mes,"GET\n");
	ptr_mes += 4;
	sprintf(ptr_mes,"%s\n",get_name);

	size_t n = MAXLINE;
	ssize_t nsofar;
	size_t nremain = strlen(message);
	ptr_mes = message;
	while(nremain > 0) {
		if((nsofar = write(fd,ptr_mes,nremain)) <= 0) {
			if(errno != EINTR) {
				die("send GET message error: ",strerror(errno));
			}
			nsofar = 0;
		}
		nremain -= nsofar;
		ptr_mes += nsofar;
	}

	char buf[MAXLINE];
	bzero(buf,MAXLINE);
	nremain = n;
	char* bufp = buf;

	while (1) {
            if ((nsofar = read(fd, bufp, nremain)) < 0) {
                if (errno != EINTR)
                    die("read error: ", strerror(errno));
                continue;
            }
            /* in echo, server should never EOF */
            if (nsofar == 0)
                die("Server error: ", "received EOF");
            bufp += nsofar;
            nremain -= nsofar;
            if (*(bufp-1) == '\n') {
                *bufp = 0;
                break;
            }
        }
	
	bufp = buf;
	if(*bufp != 'O') {
		printf("%s\n",bufp);
		return ;	
	}
	MD5_CTX c;
	unsigned char _mMD5[17] = {0};
	char _mmd5str[40];
	char _md5str[40];
	bzero(_mmd5str,40);
	bzero(_md5str, 40);

	MD5_Init(&c);
	
	int i;
	int count = 0;
	size_t bytes = 0;
	char name[40];
	for(i = 0; bufp[i]; i++) {
		if(bufp[i] == '\n')
			count++;
		/*if(count == 1) {
			int k = 0;
			while(bufp[k + i + 1] != '\n') {
				if(bufp[k+i+1] != get_name[k])
					die("get file error","file name not match");
				else 
					k++;
			}
			i += k + 1;		
		}*/
		if(count == 2) {
			int k = 1;
			while(bufp[i+k] >= '0' && bufp[i+k] <= '9')	{
				bytes = bytes * 10 + bufp[i + k] - '0';
				k++;			
			}
			i += k + 5;	
		}
		if(count == 3) {
			strncpy(_md5str,bufp + i + 1,32);
			break;		
		}
	} 
	char* contents = (char*)malloc(bytes + 1);
	bzero(contents,bytes + 1);
	nsofar = write(fd,"OK\n",3);
	nsofar = read(fd,contents,bytes);
	MD5_Update(&c,contents,bytes);
	MD5_Final(_mMD5,&c);
	char md5data[10];
	for(i = 0; i < 16; ++i) {
		bzero(md5data,10);
		sprintf(md5data,"%02x",_mMD5[i]);
		strcat(_mmd5str,md5data);
	}
	printf("md5_1: %s\n",_md5str);
	printf("md5_2: %s\n",_mmd5str);
	int flag = 1;
	for(i = 0; i < 33; i++) {
		if(_mmd5str[i] != _md5str[i]) {
			flag = 0;
			break;		
		}	
	}
	if(flag) {
		int file_fd = open(save_name, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR );
		if(file_fd < 0) {
			die("creat save file error: ", strerror(errno));
		}
		size_t l = 0;
		char* p = (char*)malloc(257);
		while(l < bytes) {
			bzero(p,257);
			int k = 0;
        		for(;k < 256;k++)
				p[k] = contents[l + k];
			p = my_decrypt(p,OPENSSLKEY);
			write(file_fd,p,strlen(p));
			l += 256;	
		}

		close(file_fd);
	}
	else  {
		die("Get file error: ","MD5 check error");	
	}
}