⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loop.c-2.0.diff

📁 Fast and transparent file system and swap encryption package for linux. No source code changes to li
💻 DIFF
字号:
--- loop.c-2.0.original	Sun Nov 15 20:32:52 1998+++ patched-loop.c	Fri Oct 31 16:08:00 2003@@ -34,7 +34,7 @@ #include <linux/idea.h> #endif -#include <linux/loop.h>		/* must follow des.h */+#include "patched-loop.h"		/* must follow des.h */  #define MAJOR_NR LOOP_MAJOR @@ -51,22 +51,24 @@ static struct loop_device loop_dev[MAX_LOOP]; static int loop_sizes[MAX_LOOP]; static int loop_blksizes[MAX_LOOP];+static int loop_hardsizes[MAX_LOOP];  /*  * Transfer functions  */ static int transfer_none(struct loop_device *lo, int cmd, char *raw_buf,-		  char *loop_buf, int size)+		  char *loop_buf, int size, int devSect) { 	if (cmd == READ) 		memcpy(loop_buf, raw_buf, size); 	else 		memcpy(raw_buf, loop_buf, size);+	if(need_resched) schedule(); 	return 0; }  static int transfer_xor(struct loop_device *lo, int cmd, char *raw_buf,-		 char *loop_buf, int size)+		 char *loop_buf, int size, int devSect) { 	char	*in, *out, *key; 	int	i, keysize;@@ -82,12 +84,13 @@ 	keysize = lo->lo_encrypt_key_size; 	for (i=0; i < size; i++) 		*out++ = *in++ ^ key[(i & 511) % keysize];+	if(need_resched) schedule(); 	return 0; }  #ifdef DES_AVAILABLE static int transfer_des(struct loop_device *lo, int cmd, char *raw_buf,-		  char *loop_buf, int size)+		  char *loop_buf, int size, int devSect) { 	unsigned long tmp[2]; 	unsigned long x0,x1,p0,p1;@@ -128,7 +131,7 @@ extern void idea_encrypt_block(idea_key,char *,char *,int);  static int transfer_idea(struct loop_device *lo, int cmd, char *raw_buf,-		  char *loop_buf, int size)+		  char *loop_buf, int size, int devSect) {   if (cmd==READ) {     idea_encrypt_block(lo->lo_idea_en_key,raw_buf,loop_buf,size);@@ -140,7 +143,12 @@ } #endif -static transfer_proc_t xfer_funcs[MAX_LOOP] = {+extern int transfer_aes(struct loop_device *, int, char *, char *, int, int);+extern int keySetup_aes(struct loop_device *, struct loop_info *);+extern int keyClean_aes(struct loop_device *);+extern int handleIoctl_aes(struct loop_device *, int, unsigned long);++static transfer_proc_t xfer_funcs[] = { 	transfer_none,		/* LO_CRYPT_NONE */ 	transfer_xor,		/* LO_CRYPT_XOR */ #ifdef DES_AVAILABLE@@ -149,10 +157,11 @@ 	NULL,			/* LO_CRYPT_DES */ #endif #ifdef IDEA_AVAILABLE           /* LO_CRYPT_IDEA */-	transfer_idea+	transfer_idea, #else-	NULL+	NULL, #endif+        0,0,0,0,0,0,0,0,0,0,0,0,transfer_aes/*16*/,0,0,0 };  @@ -213,7 +222,7 @@ 	} 	block += lo->lo_offset / blksize; 	offset += lo->lo_offset % blksize;-	if (offset > blksize) {+	if (offset >= blksize) { 		block++; 		offset -= blksize; 	}@@ -223,7 +232,7 @@ 		if (lo->lo_flags & LO_FLAGS_READ_ONLY) 			goto error_out; 	} else if (current_request->cmd != READ) {-		printk("unknown loop device command (%d)?!?", current_request->cmd);+		printk("unknown loop device command (%d)?!?\n", current_request->cmd); 		goto error_out; 	} 	while (len > 0) {@@ -237,7 +246,7 @@ 		} 		bh = getblk(lo->lo_device, real_block, blksize); 		if (!bh) {-			printk("loop: device %s: getblk(-, %d, %d) returned NULL",+			printk("loop: device %s: getblk(-, %d, %d) returned NULL\n", 			       kdevname(lo->lo_device), 			       block, blksize); 			goto error_out;@@ -256,7 +265,7 @@ 			size = len; 			    		if ((lo->transfer)(lo, current_request->cmd, bh->b_data + offset,-				   dest_addr, size)) {+				   dest_addr, size, (int)((((unsigned int)blksize >> 9) * (unsigned int)block) + ((unsigned int)offset >> 9)))) { 			printk("loop: transfer error block %d\n", block); 			brelse(bh); 			goto error_out;@@ -286,6 +295,7 @@ { 	struct file	*file; 	struct inode	*inode;+	int hardsz = 512;  	if (arg >= NR_OPEN || !(file = current->files->fd[arg])) 		return -EBADF;@@ -302,14 +312,20 @@ 			return error; 		lo->lo_device = inode->i_rdev; 		lo->lo_flags = 0;++		if(hardsect_size[MAJOR(lo->lo_device)]) {+			hardsz = hardsect_size[MAJOR(lo->lo_device)][MINOR(lo->lo_device)];+		} 	} else if (S_ISREG(inode->i_mode)) { 		lo->lo_device = inode->i_dev; 		lo->lo_flags = LO_FLAGS_DO_BMAP; 	} else 		return -EINVAL; -	if (IS_RDONLY (inode) || is_read_only(lo->lo_device)) {+	loop_hardsizes[MINOR(dev)] = hardsz;+	if ((S_ISREG(inode->i_mode) && IS_RDONLY(inode)) || is_read_only(lo->lo_device) || !(file->f_mode & FMODE_WRITE)) { 		lo->lo_flags |= LO_FLAGS_READ_ONLY;+		lo->lo_flags |= 0x200000; /* export to user space */ 		set_device_ro(dev, 1); 	} else { 		invalidate_inode_pages (inode);@@ -333,6 +349,7 @@ 	if (S_ISBLK(lo->lo_inode->i_mode)) 		blkdev_release (lo->lo_inode); 	iput(lo->lo_inode);+	if(lo->lo_encrypt_type == 16) keyClean_aes(lo); 	lo->lo_device = 0; 	lo->lo_inode = NULL; 	lo->lo_encrypt_type = 0;@@ -368,6 +385,9 @@ 		if (info.lo_encrypt_key_size <= 0) 			return -EINVAL; 		break;+	case 16:+	        if((err = keySetup_aes(lo, &info)) != 0) return(err);+	        break; #ifdef DES_AVAILABLE 	case LO_CRYPT_DES: 		if (info.lo_encrypt_key_size != 8)@@ -399,6 +419,8 @@ 	lo->lo_encrypt_type = info.lo_encrypt_type; 	lo->transfer = xfer_funcs[lo->lo_encrypt_type]; 	lo->lo_encrypt_key_size = info.lo_encrypt_key_size;+	lo->lo_init[0] = info.lo_init[0];+	lo->lo_init[1] = info.lo_init[1]; 	if (info.lo_encrypt_key_size) 		memcpy(lo->lo_encrypt_key, info.lo_encrypt_key, 		       info.lo_encrypt_key_size);@@ -431,6 +453,8 @@ 		info.lo_encrypt_key_size = lo->lo_encrypt_key_size; 		memcpy(info.lo_encrypt_key, lo->lo_encrypt_key, 		       lo->lo_encrypt_key_size);+		info.lo_init[0] = lo->lo_init[0];+		info.lo_init[1] = lo->lo_init[1]; 	} 	memcpy_tofs(arg, &info, sizeof(info)); 	return 0;@@ -470,8 +494,12 @@ 			return err; 		put_fs_long(loop_sizes[lo->lo_number] << 1, (long *) arg); 		return 0;-		default:+	default:+		if(lo->lo_encrypt_type == 16) {+			return handleIoctl_aes(lo, cmd, arg);+		} else { 			return -EINVAL;+		} 	} 	return 0; }@@ -565,8 +593,10 @@ 	} 	memset(&loop_sizes, 0, sizeof(loop_sizes)); 	memset(&loop_blksizes, 0, sizeof(loop_blksizes));+	memset(&loop_hardsizes, 0, sizeof(loop_hardsizes)); 	blk_size[MAJOR_NR] = loop_sizes; 	blksize_size[MAJOR_NR] = loop_blksizes;+	hardsect_size[MAJOR_NR] = loop_hardsizes;  	return 0; }@@ -576,5 +606,9 @@ cleanup_module( void ) {   if (unregister_blkdev(MAJOR_NR, "loop") != 0)     printk("loop: cleanup_module failed\n");++  blk_size[MAJOR_NR] = 0;+  blksize_size[MAJOR_NR] = 0;+  hardsect_size[MAJOR_NR] = 0; } #endif--- /dev/null	Sun Aug 25 20:57:30 2002+++ patched-loop.h	Fri Oct 31 16:08:00 2003@@ -0,0 +1,88 @@+#ifndef _LINUX_LOOP_H+#define _LINUX_LOOP_H++/*+ * include/linux/loop.h+ *+ * Written by Theodore Ts'o, 3/29/93.+ *+ * Copyright 1993 by Theodore Ts'o.  Redistribution of this file is+ * permitted under the GNU Public License.+ */++#define LO_NAME_SIZE	64+#define LO_KEY_SIZE	32++#ifdef __KERNEL__+       +struct loop_device {+	int		lo_number;+	struct inode	*lo_inode;+	int		lo_refcnt;+	kdev_t		lo_device;+	int		lo_offset;+	int		lo_encrypt_type;+	int		lo_encrypt_key_size;+	int		lo_flags;+	int		(*transfer)(struct loop_device *, int cmd,+				    char *raw_buf, char *loop_buf, int size, int); /* MODIFIED for loop-AES */+	char		lo_name[LO_NAME_SIZE];+	char		lo_encrypt_key[LO_KEY_SIZE];+#ifdef DES_AVAILABLE+	des_key_schedule lo_des_key;+	unsigned long	lo_des_init[2];+#endif+#ifdef IDEA_AVAILABLE+        idea_key        lo_idea_en_key;+        idea_key        lo_idea_de_key;+#endif+	void		*key_data;  /* MODIFIED for loop-AES */+	unsigned long	lo_init[2]; /* MODIFIED for loop-AES */+};++typedef	int (* transfer_proc_t)(struct loop_device *, int cmd,+				char *raw_buf, char *loop_buf, int size, int); /* MODIFIED for loop-AES */++/*+ * Loop flags+ */+#define LO_FLAGS_DO_BMAP	0x00000001+#define LO_FLAGS_READ_ONLY	0x00000002++#endif /* __KERNEL__ */++struct loop_info {+	int		lo_number;	/* ioctl r/o */+	dev_t		lo_device; 	/* ioctl r/o */+	unsigned long	lo_inode; 	/* ioctl r/o */+	dev_t		lo_rdevice; 	/* ioctl r/o */+	int		lo_offset;+	int		lo_encrypt_type;+	int		lo_encrypt_key_size; 	/* ioctl w/o */+	int		lo_flags;	/* ioctl r/o */+	char		lo_name[LO_NAME_SIZE];+	unsigned char	lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */+	unsigned long	lo_init[2];+	char		reserved[4];+};++/*+ * Loop encryption types --- LO_CRYPT_IDEA isn't supported yet+ */++#define LO_CRYPT_NONE	0+#define LO_CRYPT_XOR	1+#define LO_CRYPT_DES	2+#define LO_CRYPT_IDEA	3+#define MAX_LO_CRYPT	4++/*+ * IOCTL commands --- we will commandeer 0x4C ('L')+ */++#define LOOP_SET_FD	0x4C00+#define LOOP_CLR_FD	0x4C01+#define LOOP_SET_STATUS	0x4C02+#define LOOP_GET_STATUS	0x4C03++#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -