F´ Flight Software - C/C++ Documentation  NASA-v2.0.1
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 = 0;
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 validation status:
117  typedef enum {
120  } StatusFileType;
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:32
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:587
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