File: scrambledfile.cpp

package info (click to toggle)
spring 0.81.2.1%2Bdfsg1-6
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 28,496 kB
  • ctags: 37,096
  • sloc: cpp: 238,659; ansic: 13,784; java: 12,175; awk: 3,428; python: 1,159; xml: 738; perl: 405; sh: 297; makefile: 267; pascal: 228; objc: 192
file content (160 lines) | stat: -rw-r--r-- 3,850 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
 * scrambledfile.cpp
 * Encrypted file class implementation
 * Copyright (C) 2005 Christopher Han <xiphux@gmail.com>
 *
 * This file is part of hpiutil2.
 *
 * hpiutil2 is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * hpiutil2 is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with hpiutil2; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#include "scrambledfile.h"

/**
 * Constructor
 * @param fname name of scrambled file to open as a c string
 */
hpiutil::scrambledfile::scrambledfile(const char *fname)
{
	file.open(fname,std::ios::in|std::ios::binary);
	scrambled = false;
}

/**
 * Constructor
 * @param fname name of scrambled file to open as a c++ string
 */
hpiutil::scrambledfile::scrambledfile(std::string const &fname)
{
	file.open(fname.c_str(),std::ios::in|std::ios::binary);
	scrambled = false;
}

/**
 * Destructor
 */
hpiutil::scrambledfile::~scrambledfile()
{
	file.close();
}

/**
 * read
 * reads a single byte from the file
 * @return byte read
 */
boost::uint32_t hpiutil::scrambledfile::read()
{
	boost::uint32_t oldpos = file.tellg();
	boost::uint32_t ret = file.get();
	if (scrambled && (ret != EOF))
		ret = (char)(((key ^ oldpos) ^ ~ret)&0x00ff);
	return ret;
}

/**
 * read
 * reads data from the file into a buffer
 * @return number of bytes read
 * @param buf buffer to read into
 */
boost::uint32_t hpiutil::scrambledfile::read(boost::uint8_t *buf)
{
	boost::uint32_t oldpos = (boost::uint32_t)file.tellg();
	file.read((char*)buf,sizeof(buf));
	boost::uint32_t read = (boost::uint32_t)file.tellg() - oldpos;
	if (scrambled) {
		for (boost::uint32_t i = 0; i < read; i++)
			buf[i] = (boost::uint8_t)(((key ^ (oldpos+i)) ^ ~buf[i])&0x00ff);
	}
	return read;
}

/**
 * read
 * reads data from the file into a buffer
 * @return number of bytes read
 * @param buf buffer to read into
 * @param off offset in file to start reading from
 * @param len number of bytes to read
 */
boost::uint32_t hpiutil::scrambledfile::read(boost::uint8_t *buf, const boost::uint32_t off, const boost::uint32_t len)
{
	file.seekg(off);
	file.read((char*)buf,len);
	if (scrambled) {
		for (boost::uint32_t i = 0; i < len; i++)
			buf[i] = (boost::uint8_t)(((key ^ (i+off)) ^ ~buf[i])&0x00ff);
	}
	return ((boost::uint32_t)file.tellg()-off);
}

/**
 * readint
 * reads a 32-bit integer from the file,
 * byte swabbing if necessary
 * @return swabbed integer
 */
boost::uint32_t hpiutil::scrambledfile::readint()
{
	boost::uint32_t a = read();
	boost::uint32_t b = read();
	boost::uint32_t c = read();
	boost::uint32_t d = read();
	return (d<<24)|(c<<16)|(b<<8)|a;
}

/**
 * seek
 * seek to an offset in the file
 * @param pos offset to seek to
 */
void hpiutil::scrambledfile::seek(const boost::uint32_t pos)
{
	file.seekg(pos,std::ios::beg);
}

/**
 * setkey
 * set or unset decryption key to use to unscramble
 * @param k key to use (use 0 to disable)
 */
void hpiutil::scrambledfile::setkey(const boost::uint32_t k)
{
	if (k) {
		key = ~((k<<2)|(k>>6));
		scrambled = true;
	} else {
		key = 0;
		scrambled = false;
	}
}

/**
 * readstring
 * reads a string of data from the file terminated by NULL or EOF
 * @return string read
 */
std::string hpiutil::scrambledfile::readstring()
{
	std::string data;
	while (1) {
		char i = read();
		if ((i == 0)||(i == EOF))
			break;
		data.append(1,i);
	}
	return data;
}