F´ Flight Software - C/C++ Documentation  NASA-v1.5.0
A framework for building embedded system applications to NASA flight quality standards.
ValidateFileCommon.cpp
Go to the documentation of this file.
1 #include <Os/ValidateFile.hpp>
2 #include <Os/File.hpp>
3 #include <Utils/Hash/Hash.hpp>
4 #include <Os/FileSystem.hpp>
5 
6 namespace Os {
7 
8  File::Status computeHash(const char* fileName, Utils::HashBuffer &hashBuffer) {
9 
10  File::Status status;
11 
12  // Open file:
13  File file;
14  status = file.open(fileName, File::OPEN_READ);
15  if( File::OP_OK != status ) {
16  return status;
17  }
18 
19  // Get the file size:
20  FileSystem::Status fs_status;
21  U64 fileSize = 0;
22  fs_status = FileSystem::getFileSize(fileName, fileSize);
23  if( FileSystem::OP_OK != fs_status ) {
24  return File::BAD_SIZE;
25  }
26  const NATIVE_INT_TYPE max_itr = static_cast<NATIVE_INT_TYPE>(fileSize/VFILE_HASH_CHUNK_SIZE + 1);
27 
28  // Read all data from file and update hash:
29  Utils::Hash hash;
30  hash.init();
31  U8 buffer[VFILE_HASH_CHUNK_SIZE];
32  NATIVE_INT_TYPE size;
33  NATIVE_INT_TYPE cnt = 0;
34  while( cnt <= max_itr ) {
35  // Read out chunk from file:
36  size = sizeof(buffer);
37  status = file.read(&buffer, size, false);
38  if( File::OP_OK != status ) {
39  return status;
40  }
41  // If end of file, break:
42  if( size == 0 ) {
43  break;
44  }
45  // Add chunk to hash calculation:
46  hash.update(&buffer, size);
47  cnt++;
48  }
49  file.close();
50 
51  // We should not have left the loop because of cnt > max_itr:
52  FW_ASSERT(size == 0);
53  FW_ASSERT(cnt <= max_itr);
54 
55  // Calculate hash:
56  Utils::HashBuffer computedHashBuffer;
57  hash.final(computedHashBuffer);
58  hashBuffer = computedHashBuffer;
59 
60  return status;
61  }
62 
63  File::Status readHash(const char* hashFileName, Utils::HashBuffer &hashBuffer) {
64 
65  File::Status status;
66 
67  // Open hash file:
68  File hashFile;
69  status = hashFile.open(hashFileName, File::OPEN_READ);
70  if( File::OP_OK != status ) {
71  return status;
72  }
73 
74  // Read hash from checksum file:
75  unsigned char savedHash[HASH_DIGEST_LENGTH];
76  NATIVE_INT_TYPE size = hashBuffer.getBuffCapacity();
77  status = hashFile.read(&savedHash[0], size);
78  if( File::OP_OK != status ) {
79  return status;
80  }
81  if( size != (NATIVE_INT_TYPE) hashBuffer.getBuffCapacity() ) {
82  return File::BAD_SIZE;
83  }
84  hashFile.close();
85 
86  // Return the hash buffer:
87  Utils::HashBuffer savedHashBuffer(savedHash, size);
88  hashBuffer = savedHashBuffer;
89 
90  return status;
91  }
92 
93  File::Status writeHash(const char* hashFileName, Utils::HashBuffer hashBuffer) {
94  // Open hash file:
95  File hashFile;
96  File::Status status;
97  status = hashFile.open(hashFileName, File::OPEN_WRITE);
98  if( File::OP_OK != status ) {
99  return status;
100  }
101 
102  // Write out the hash
103  NATIVE_INT_TYPE size = hashBuffer.getBuffLength();
104  status = hashFile.write(hashBuffer.getBuffAddr(), size, false);
105  if( File::OP_OK != status ) {
106  return status;
107  }
108  if( size != (NATIVE_INT_TYPE) hashBuffer.getBuffLength() ) {
109  return File::BAD_SIZE;
110  }
111  hashFile.close();
112 
113  return status;
114  }
115 
116  // Enum and function for translating from a status to a validataion status:
117  typedef enum {
121 
123 
124  switch (type) {
125  case FileType:
126  switch (status) {
127  case File::OP_OK:
129  case File::DOESNT_EXIST:
131  case File::NO_SPACE:
132  return ValidateFile::NO_SPACE;
133  case File::NO_PERMISSION:
135  case File::BAD_SIZE:
137  case File::NOT_OPENED:
139  case File::OTHER_ERROR:
141  default:
142  FW_ASSERT(0, status);
143  }
144  break;
145  case HashFileType:
146  switch (status) {
147  case File::OP_OK:
149  case File::DOESNT_EXIST:
151  case File::NO_SPACE:
152  return ValidateFile::NO_SPACE;
153  case File::NO_PERMISSION:
155  case File::BAD_SIZE:
157  case File::NOT_OPENED:
159  case File::OTHER_ERROR:
161  default:
162  FW_ASSERT(0, status);
163  }
164  break;
165  default:
166  FW_ASSERT(0, type);
167  }
168 
170  }
171 
172  ValidateFile::Status ValidateFile::validate(const char* fileName, const char* hashFileName) {
173  Utils::HashBuffer hashBuffer; // pass by reference - final value is unused
174  return validate(fileName, hashFileName, hashBuffer);
175  }
176 
177  ValidateFile::Status ValidateFile::validate(const char* fileName, const char* hashFileName, Utils::HashBuffer &hashBuffer) {
178 
179  File::Status status;
180 
181  // Read the hash file:
182  Utils::HashBuffer savedHash;
183  status = readHash(hashFileName, savedHash);
184  if( File::OP_OK != status ) {
185  return translateStatus(status, HashFileType);
186  }
187 
188  // Compute the file's hash:
189  Utils::HashBuffer computedHash;
190  status = computeHash(fileName, computedHash);
191  if( File::OP_OK != status ) {
192  return translateStatus(status, FileType);
193  }
194 
195  // Compare hashes and return:
196  if( savedHash != computedHash ){
198  }
199 
200  hashBuffer = savedHash;
201 
203  }
204 
205  ValidateFile::Status ValidateFile::createValidation(const char* fileName, const char* hashFileName, Utils::HashBuffer &hashBuffer) {
206 
207  File::Status status;
208 
209  // Compute the file's hash:
210  status = computeHash(fileName, hashBuffer);
211  if( File::OP_OK != status ) {
212  return translateStatus(status, FileType);
213  }
214 
215  status = writeHash(hashFileName, hashBuffer);
216  if( File::OP_OK != status ) {
217  return translateStatus(status, HashFileType);
218  }
219 
221  }
222 
223  ValidateFile::Status ValidateFile::createValidation(const char* fileName, const char* hashFileName) {
224  Utils::HashBuffer hashBuffer; // pass by reference - final value is unused
225  return createValidation(fileName, hashFileName, hashBuffer);
226  }
227 
228 }
Os::File::BAD_SIZE
@ BAD_SIZE
Invalid size parameter.
Definition: File.hpp:29
Os::HashFileType
@ HashFileType
Definition: ValidateFileCommon.cpp:119
Os
Definition: File.cpp:7
Os::ValidateFile::VALIDATION_FILE_BAD_SIZE
@ VALIDATION_FILE_BAD_SIZE
Invalid size parameter.
Definition: ValidateFile.hpp:38
Os::File::NO_SPACE
@ NO_SPACE
No space left.
Definition: File.hpp:27
Os::File::NO_PERMISSION
@ NO_PERMISSION
No permission to read/write file.
Definition: File.hpp:28
Os::FileSystem::Status
Status
Definition: FileSystem.hpp:15
Os::readHash
File::Status readHash(const char *hashFileName, Utils::HashBuffer &hashBuffer)
Definition: ValidateFileCommon.cpp:63
Os::ValidateFile::VALIDATION_OK
@ VALIDATION_OK
The validation of the file passed.
Definition: ValidateFile.hpp:29
Os::StatusFileType
StatusFileType
Definition: ValidateFileCommon.cpp:117
Os::File::close
void close(void)
close file
Definition: File.cpp:37
Os::ValidateFile::Status
Status
Definition: ValidateFile.hpp:27
Utils::HashBuffer::getBuffCapacity
NATIVE_UINT_TYPE getBuffCapacity(void) const
Definition: HashBufferCommon.cpp:48
Os::File::read
Status read(void *buffer, NATIVE_INT_TYPE &size, bool waitForFull=true)
waitForFull = true to wait for all bytes to be read
Definition: File.cpp:29
U8
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.hpp:76
Os::ValidateFile::FILE_DOESNT_EXIST
@ FILE_DOESNT_EXIST
File doesn't exist (for read)
Definition: ValidateFile.hpp:32
Os::File::OTHER_ERROR
@ OTHER_ERROR
A catch-all for other errors. Have to look in implementation-specific code.
Definition: File.hpp:31
Os::ValidateFile::OTHER_ERROR
@ OTHER_ERROR
A catch-all for other errors. Have to look in implementation-specific code.
Definition: ValidateFile.hpp:41
Os::writeHash
File::Status writeHash(const char *hashFileName, Utils::HashBuffer hashBuffer)
Definition: ValidateFileCommon.cpp:93
Os::File::NOT_OPENED
@ NOT_OPENED
file hasn't been opened yet
Definition: File.hpp:30
Os::ValidateFile::VALIDATION_FILE_DOESNT_EXIST
@ VALIDATION_FILE_DOESNT_EXIST
Validation file doesn't exist (for read)
Definition: ValidateFile.hpp:36
Os::ValidateFile::createValidation
Status createValidation(const char *fileName, const char *hash, Utils::HashBuffer &hashBuffer)
Definition: ValidateFileCommon.cpp:205
Os::ValidateFile::FILE_BAD_SIZE
@ FILE_BAD_SIZE
Invalid size parameter.
Definition: ValidateFile.hpp:34
ValidateFile.hpp
Defines a file class to validate files or generate a file validator file.
Utils::Hash::final
void final(HashBuffer &buffer)
Definition: CRC32.cpp:64
Utils::Hash::init
void init(void)
Definition: CRC32.cpp:47
Os::computeHash
File::Status computeHash(const char *fileName, Utils::HashBuffer &hashBuffer)
Definition: ValidateFileCommon.cpp:8
FileSystem.hpp
Utils::HashBuffer
An container class for holding a hash buffer.
Definition: HashBuffer.hpp:26
Utils::HashBuffer::getBuffAddr
U8 * getBuffAddr(void)
Definition: HashBufferCommon.cpp:44
HASH_DIGEST_LENGTH
#define HASH_DIGEST_LENGTH
Definition: CRC32.hpp:18
U64
#define U64(C)
Definition: sha.h:176
Os::File::write
Status write(const void *buffer, NATIVE_INT_TYPE &size, bool waitForDone=true)
write size; will return amount written or errno
Definition: File.cpp:33
Os::File::DOESNT_EXIST
@ DOESNT_EXIST
File doesn't exist (for read)
Definition: File.hpp:26
Os::ValidateFile::NO_SPACE
@ NO_SPACE
No space left on the device for writing.
Definition: ValidateFile.hpp:40
Os::FileSystem::OP_OK
@ OP_OK
Operation was successful.
Definition: FileSystem.hpp:16
Os::FileType
@ FileType
Definition: ValidateFileCommon.cpp:118
Os::translateStatus
ValidateFile::Status translateStatus(File::Status status, StatusFileType type)
Definition: ValidateFileCommon.cpp:122
Hash.hpp
VFILE_HASH_CHUNK_SIZE
#define VFILE_HASH_CHUNK_SIZE
Definition: ValidateFile.hpp:16
Os::File::OPEN_WRITE
@ OPEN_WRITE
Open file for writing.
Definition: File.hpp:17
FW_ASSERT
#define FW_ASSERT(...)
Definition: Assert.hpp:9
Os::File::open
Status open(const char *fileName, Mode mode)
open file. Writing creates file if it doesn't exist
Definition: File.cpp:13
Fw::SerializeBufferBase::getBuffLength
NATIVE_UINT_TYPE getBuffLength() const
returns current buffer size
Definition: Serializable.cpp:592
File.hpp
Utils::Hash
A generic interface for creating and comparing hash values.
Definition: Hash.hpp:24
Os::ValidateFile::VALIDATION_FILE_NO_PERMISSION
@ VALIDATION_FILE_NO_PERMISSION
No permission to read/write file.
Definition: ValidateFile.hpp:37
Utils::Hash::update
void update(const void *const data, const NATIVE_INT_TYPE len)
Definition: CRC32.cpp:53
Os::File::Status
Status
Definition: File.hpp:24
Os::ValidateFile::validate
Status validate(const char *fileName, const char *hashFileName, Utils::HashBuffer &hashBuffer)
Validate the contents of a file 'fileName' against its hash.
Definition: ValidateFileCommon.cpp:177
Os::File::OP_OK
@ OP_OK
Operation was successful.
Definition: File.hpp:25
Os::FileSystem::getFileSize
Status getFileSize(const char *path, U64 &size)
append file origin to destination file. If boolean true, creates a brand new file if the destination ...
Definition: FileSystem.cpp:40
Os::ValidateFile::VALIDATION_FAIL
@ VALIDATION_FAIL
The validation of the file did not pass.
Definition: ValidateFile.hpp:30
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:29
Os::File::OPEN_READ
@ OPEN_READ
Open file for reading.
Definition: File.hpp:16
Os::ValidateFile::FILE_NO_PERMISSION
@ FILE_NO_PERMISSION
No permission to read/write file.
Definition: ValidateFile.hpp:33
Os::File
Definition: File.hpp:11