示例#1
0
int hdd_io(int hdd_n, void *buff, u16 sectors, u64 start, int read)
{
	u8       sbuf[32];
	rm_ctx   ctx;
	u32      head, cyl;
	u8       dos_n = hdd2dos(hdd_n);
	hdd_inf *hdd   = &iodb.p_hdd[hdd_n];
	lba_p   *lba   = pv(0x580); /* this needed for avoid stupid actions by buggy BIOSes */	
	int      succs = 0;

	/* setup initial context */
	set_ctx(0, &ctx);

	if (hdd->flags & HDD_LBA)
	{
		/* save old buffer */
		mincpy(sbuf, lba, sizeof(sbuf));

		/* setup LBA block */
		lba->size    = sizeof(lba_p);
		lba->unk     = 0;
		lba->dst_sel = rm_seg(buff);
		lba->dst_off = rm_off(buff);
		lba->numb    = sectors; 
		lba->sector  = start;
		
		ctx.ah = read ? 0x42:0x43;
		ctx.dl = dos_n; 
		ctx.si = 0x180; 
		ctx.ds = 0x40; /* if DS can be 0x40, we can avoid AWARD BIOS bug of int13/AX=4B01 */ 
		/* set additional registers to serve buggy BIOSes. */
		ctx.es = ctx.ds;
		ctx.di = ctx.si;
		ctx.bx = ctx.si;
		ctx.cx = ctx.ds;
		/* do not check AH because some buggy USB BIOSes fail to clear AH on success */
		succs = bios_call(0x13, &ctx);

		/* restore saved buffer */
		mincpy(lba, sbuf, sizeof(sbuf));
	} else
	{
		head = d32(start) / hdd->max_sect;		
		cyl  = head / hdd->max_head;

		ctx.ah = read ? 0x02:0x03;
		ctx.al = d8(sectors);
		ctx.ch = d8(cyl);
		ctx.cl = d8(((cyl & 0x0300) >> 2) | (d32(start) % hdd->max_sect + 1));
		ctx.dh = head % hdd->max_head;
		ctx.dl = dos_n;
		ctx.es = rm_seg(buff);
		ctx.bx = rm_off(buff);

		/* do not check AH because some buggy USB BIOSes fail to clear AH on success */
		succs = bios_call(0x13, &ctx);
	}
	return succs;
}
void serpent256_decrypt(const unsigned char *in, unsigned char *out, serpent256_key *key)
{
	u32 b[4]; 
	int i;
	
	mincpy(b, in, SERPENT_BLOCK_SIZE);

	for (i = 31; i >= 0; i--) {
		if (i == 31) KXf(key->expkey, 32, b); else ITf(b); 
		sd_tab[i % 8](b); KXf(key->expkey, i, b);
	}
	mincpy(out, b, SERPENT_BLOCK_SIZE);
}
void serpent256_encrypt(const unsigned char *in, unsigned char *out, serpent256_key *key)
{
	u32 b[4];
	int i;
	
	mincpy(b, in, SERPENT_BLOCK_SIZE);

	for (i = 0; i < 32; i++) {
		KXf(key->expkey, i, b); se_tab[i % 8](b);	
		if (i == 31) KXf(key->expkey, 32, b); else LTf(b);
	}
	mincpy(out, b, SERPENT_BLOCK_SIZE);
}
void serpent256_set_key(const unsigned char *key, serpent256_key *skey)
{
	u32 W[140], i;

	mincpy(W, key, SERPENT_KEY_SIZE);

	for(i = 8; i != 140; ++i) {
		W[i] = ROL32(W[i-8] ^ W[i-5] ^ W[i-3] ^ W[i-1] ^ PHI ^ (i-8), 11);
	}
	for (i = 8; i <= 136; i += 4) {
		se_tab[7 - (((i / 4) + 2) % 8)](&W[i]);
	}
	mincpy(skey->expkey, W+8, SERPENT_EXPKEY_WORDS*sizeof(u32));
}
示例#5
0
static int set_to_val(HKEY h_key, wchar_t *v_name, wchar_t *name)
{
	wchar_t  buf[MAX_PATH];
	u32      len, cb;
	wchar_t *p;
	
	len = (u32)((wcslen(name) + 1) * sizeof(wchar_t));
	cb  = sizeof(buf); p = buf;

	if (RegQueryValueEx(h_key, v_name, NULL, NULL, p8(buf), &cb) != 0) {
		buf[0] = 0; cb = sizeof(wchar_t);
	}

	while (*p != 0) 
	{
		if (wcscmp(p, name) == 0) {
			p = NULL; break;
		} else {
			p = addof(p, (wcslen(p) * sizeof(wchar_t)) + sizeof(wchar_t));
		}
	}
	if (p == NULL) { return 1; }

	memmove(p8(buf) + len, buf, cb);
	mincpy(buf, name, len);
	cb += len;

	return RegSetValueEx(h_key, v_name, 0, REG_MULTI_SZ, p8(buf), cb) == 0;
}
示例#6
0
dc_pass *__get_pass_keyfiles(
		HWND h_pass,
		BOOL use_keyfiles,
		int  key_list
	)
{
	dc_pass *pass;
	wchar_t *s_pass;
	size_t   plen;
	int      rlt;

	if ( (pass = secure_alloc(sizeof(dc_pass))) == NULL )
	{
		return NULL;
	}
	if ( (s_pass = secure_alloc((MAX_PASSWORD + 1) * sizeof(wchar_t))) == NULL) 
	{
		return NULL;
	}
	GetWindowText( h_pass, s_pass, MAX_PASSWORD + 1 );
	if ( wcslen(s_pass) > 0 )
	{
		plen       = wcslen(s_pass) * sizeof(wchar_t);
		pass->size = d32( min( plen, MAX_PASSWORD * sizeof(wchar_t) ) );

		mincpy( &pass->pass, s_pass, pass->size );
		secure_free( s_pass );
	}
	if ( use_keyfiles )
	{
		_list_key_files *key_file;

		if ( key_file = _first_keyfile(key_list) )
		{
			do {
				rlt = dc_add_keyfiles( pass, key_file->path );
				if ( rlt != ST_OK )
				{
					__error_s( GetParent(h_pass), L"Keyfiles not loaded", rlt );

					secure_free( pass );
					pass = NULL;

					break;
				}
				key_file = _next_keyfile( key_file, key_list );

			} while ( key_file != NULL );
		} 
	}

	return pass;
}
示例#7
0
void sha512_pkcs5_2(
	   int i_count,
	   const void *pwd,  size_t pwd_len, 
	   const char *salt, size_t salt_len,
	   char *dk,   size_t dklen
	   )
{
	u8       buff[128];
	u8       blk[SHA512_DIGEST_SIZE];
	u8       hmac[SHA512_DIGEST_SIZE];
	u32      block = 1;
	size_t   c_len, j;
	int      i;

	while (dklen != 0)
	{
		/* first interation */
		mincpy(buff, salt, salt_len);
		p32(buff + salt_len)[0] = BE32(block);
		sha512_hmac(pwd, pwd_len, buff, salt_len + 4, hmac);
		autocpy(blk, hmac, SHA512_DIGEST_SIZE);

		/* next interations */
		for (i = 1; i < i_count; i++) 
		{
			sha512_hmac(pwd, pwd_len, hmac, SHA512_DIGEST_SIZE, hmac);

			for (j = 0; j < SHA512_DIGEST_SIZE; j++) {
				blk[j] ^= hmac[j];
			}
		}
		c_len = min(dklen, SHA512_DIGEST_SIZE);
		mincpy(dk, blk, c_len);
		dk += c_len; dklen -= c_len; block++;
	}
	/* prevent leaks */
	zeroauto(buff, sizeof(buff));
	zeroauto(blk,  sizeof(blk));
	zeroauto(hmac, sizeof(hmac));
}
示例#8
0
int bios_call(int num, rm_ctx *ctx)
{
	/* copy initial context to real mode buffer */
	if (ctx != NULL) {
		mincpy(&bdat->rmc, ctx, sizeof(rm_ctx));
	}
	/* get interrupt seg/off */
	if ( (num == 0x13) && (bdat->old_int13 != 0) ) {
		bdat->segoff = bdat->old_int13;
	} else {
		bdat->segoff = p32(0)[num];
	}
	bdat->rmc.efl = FL_IF;
	/* call to real mode */
	bdat->call_rm();
	
	/* copy changed context */
	if (ctx != NULL) {
		mincpy(ctx, &bdat->rmc, sizeof(rm_ctx));
	}
	return (bdat->rmc.efl & FL_CF) == 0;
}
示例#9
0
wchar_t *_mark(
		double   digit,
		wchar_t *text,
		wchar_t  dec
	)
{
	wchar_t  ws_dsp[100];
	wchar_t *result = text;
	wchar_t *pws_dsp = (wchar_t *)&ws_dsp;
	size_t   trim;
	size_t   k;

	_snwprintf( pws_dsp, 50, L"%.2f", digit );

	trim = wcslen(pws_dsp) % 3;
	mincpy( text, ws_dsp, trim );

	for ( pws_dsp += trim, text += trim,
		  k = wcslen(pws_dsp) / 3-1;
		  k; k-- ) 
	{
		if ( trim )
		{
			*text++ = '\x2c'; 
		} else {
			trim = 1;
		}
		mincpy( text, pws_dsp, 3 );
		text += 3; pws_dsp += 3;
	}
	if ( dec )
	{
		mincpy( text, pws_dsp, 3 );
	}
	*text = '\0';
	return result;

}
示例#10
0
void bios_jump_boot(int hdd_n, int n_mount)
{
	if (n_mount != 0) {
		/* setup backup data block */
		mincpy(addof(bdat->bd_base, bdat->bd_size - 384), bdat, offsetof(bd_data, ret_32));
	} else {
		/* clear boot data block signature */
		bdat->sign1 = 0; bdat->sign2 = 0;
	}
	bdat->boot_dsk = hdd2dos(hdd_n);
	bdat->rmc.dx   = 0x80;
	bdat->rmc.efl  = FL_IF; /* enable interrupts */
	bdat->segoff   = 0x7C00;
	bios_jump_rm();
}
示例#11
0
void sha512_hmac(const char *k, size_t k_len, const char *d, size_t d_len, char *out)
{
	sha512_ctx ctx;
	u8         buf[SHA512_BLOCK_SIZE];
	u8         hval[SHA512_DIGEST_SIZE];
	size_t     i;

	/* zero key buffer */
	zeroauto(buf, sizeof(buf));

	/* compress hmac key */
	if (k_len > SHA512_BLOCK_SIZE) {
		sha512_init(&ctx);
		sha512_hash(&ctx, k, k_len);
		sha512_done(&ctx, buf);
	} else {
		mincpy(buf, k, k_len);
	}

	/* create the hash initial vector */ 
	for (i = 0; i < SHA512_BLOCK_SIZE; i++) {
		buf[i] ^= 0x36;
	}

	/* hash key and data */
	sha512_init(&ctx);
	sha512_hash(&ctx, buf, SHA512_BLOCK_SIZE);
	sha512_hash(&ctx, d, d_len);
	sha512_done(&ctx, hval);

	/* create the second HMAC vector */
	for (i = 0; i < SHA512_BLOCK_SIZE; i++) {
        buf[i] ^= 0x6A;
    } 

	/* calculate "outer" hash */
	sha512_init(&ctx);
	sha512_hash(&ctx, buf, SHA512_BLOCK_SIZE);
	sha512_hash(&ctx, hval, SHA512_DIGEST_SIZE);
	sha512_done(&ctx, out);	

	/* prevent leaks */
	zeroauto(buf,  sizeof(buf));
	zeroauto(hval, sizeof(hval));
	zeroauto(&ctx, sizeof(ctx));
}
示例#12
0
static void add_smap(e820entry *map) 
{
	if ( (bdat->mem_map.n_map < E820MAX) && (map->size != 0) ) {
		mincpy(&bdat->mem_map.map[bdat->mem_map.n_map++], map, sizeof(e820entry));
	}
}
示例#13
0
static void int13_callback()
{
	rm_ctx ctx;
	u16      p_efl = bdat->push_fl;
	int      need  = 0;
	hdd_inf *hdd   = NULL;
	lba_p   *lba   = NULL;
	void    *buff;
	u16      numb;
	u64      start;
	int      hdd_n;

	if (bdat->rmc.dl == 0x80) {
		bdat->rmc.dl = bdat->boot_dsk;
	} else if (bdat->rmc.dl == bdat->boot_dsk) {
		bdat->rmc.dl = 0x80;
	}
	/* copy context to temporary buffer */
	mincpy(&ctx, &bdat->rmc, sizeof(rm_ctx));

	if ( ((hdd_n = dos2hdd(ctx.dl)) >= 0) && (hdd_n < iodb.n_hdd) ) {
		hdd = &iodb.p_hdd[hdd_n];
	}
	if (hdd != NULL)
	{
		if ( (ctx.ah == 0x02) || (ctx.ah == 0x03) )
		{
			start = ((ctx.ch + ((ctx.cl & 0xC0) << 2)) * 
				    hdd->max_head + ctx.dh) * hdd->max_sect + (ctx.cl & 0x3F) - 1;
			buff  = pm_off(ctx.es, ctx.bx);
			numb  = ctx.al;
			need  = 1; 
		}
		if ( (ctx.ah == 0x42) || (ctx.ah == 0x43) )
		{
			lba   = pm_off(ctx.ds, ctx.si);
			start = lba->sector;
			buff  = pm_off(lba->dst_sel, lba->dst_off);
			numb  = lba->numb;
			need  = 1; 
		}
	}

	if (need != 0) 
	{
		if (dc_disk_io(hdd_n, buff, numb, start, (ctx.ah == 0x02) || (ctx.ah == 0x42)) != 0) 
		{
			ctx.ah   = 0;
			ctx.efl &= ~FL_CF;

			if (lba != NULL) {
				lba->numb = numb;
			} else {
				ctx.al = d8(numb);
			}
		} else {
			ctx.efl |= FL_CF;
		}		
		/* setup new context */
		mincpy(&bdat->rmc, &ctx, sizeof(rm_ctx));
	} else 
	{
		/* interrupt is not processed, call original handler */
		bdat->rmc.efl = FL_IF; /* enable interrupts */
		bdat->segoff  = bdat->old_int13;
		bdat->call_rm();		
	}
	/* copy saved interrupt flag to exit context */
	bdat->rmc.efl = (bdat->rmc.efl & ~FL_IF) | (p_efl & FL_IF);
}