aboutsummaryrefslogtreecommitdiff
path: root/romfs
diff options
context:
space:
mode:
Diffstat (limited to 'romfs')
-rw-r--r--romfs/tools/Makefile2
-rw-r--r--romfs/tools/crclib.c260
-rw-r--r--romfs/tools/crclib.h23
-rw-r--r--romfs/tools/create_crc.c263
4 files changed, 285 insertions, 263 deletions
diff --git a/romfs/tools/Makefile b/romfs/tools/Makefile
index f86803d..f2a746f 100644
--- a/romfs/tools/Makefile
+++ b/romfs/tools/Makefile
@@ -22,7 +22,7 @@ include $(TOPCMNDIR)/make.rules
CPPFLAGS = -I$(INCLCMNDIR) -I$(INCLBRDDIR) -I.
CFLAGS += $(FLAG)
-SRCS = build_ffs.c cfg_parse.c create_flash.c create_crc.c
+SRCS = build_ffs.c cfg_parse.c create_flash.c create_crc.c crclib.c
OBJS = $(SRCS:%.c=%.o)
all: build_romfs
diff --git a/romfs/tools/crclib.c b/romfs/tools/crclib.c
new file mode 100644
index 0000000..b8a66e3
--- /dev/null
+++ b/romfs/tools/crclib.c
@@ -0,0 +1,260 @@
+/******************************************************************************
+ * Copyright (c) 2004, 2008 IBM Corporation
+ * All rights reserved.
+ * This program and the accompanying materials
+ * are made available under the terms of the BSD License
+ * which accompanies this distribution, and is available at
+ * http://www.opensource.org/licenses/bsd-license.php
+ *
+ * Contributors:
+ * IBM Corporation - initial implementation
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <crclib.h>
+#include <calculatecrc.h>
+
+uint64_t ui64Generator1;
+
+/**
+ * calculate standart ethernet 32 bit CRC
+ * generator polynome is 0x104C11DB7
+ * this algorithm can be used for encoding and decoding
+ */
+static unsigned int
+calCRCEthernet32(unsigned char *TextPtr, unsigned long int TextLength,
+ unsigned int AccumCRC)
+{
+ const unsigned int CrcTableHigh[16] = {
+ 0x00000000, 0x4C11DB70, 0x9823B6E0, 0xD4326D90,
+ 0x34867077, 0x7897AB07, 0xACA5C697, 0xE0B41DE7,
+ 0x690CE0EE, 0x251D3B9E, 0xF12F560E, 0xBD3E8D7E,
+ 0x5D8A9099, 0x119B4BE9, 0xC5A92679, 0x89B8FD09
+ };
+ const unsigned CrcTableLow[16] = {
+ 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9,
+ 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,
+ 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,
+ 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD
+ };
+
+ unsigned char *Buffer = TextPtr;
+ unsigned long int Residual = TextLength;
+
+
+ while (Residual > 0) {
+ unsigned int Temp = ((AccumCRC >> 24) ^ *Buffer) & 0x000000ff;
+ AccumCRC <<= 8;
+ AccumCRC ^= CrcTableHigh[Temp / 16];
+ AccumCRC ^= CrcTableLow[Temp % 16];
+ ++Buffer;
+ --Residual;
+ }
+ return AccumCRC;
+}
+
+/**
+ * create CRC Parameter: CRC Polynome, Shiftregister Mask and length
+ *
+ * ui64Generator[0] = 0;
+ * ui64Generator[1] = 0x42F0E1EB;
+ * ui64Generator[1] = (ui64Generator[1] << 32) + 0xA9EA3693;
+ * iRegisterLength = 63;
+ * ui64RegisterMask = 0xffffffff;
+ * ui64RegisterMask = ((ui64RegisterMask) << 32) + 0xffffffff;
+ *
+ * ucl=0x00000000ffffffff = Mask for 32 bit LSFR to cut down number of bits
+ * in the variable to get the same length as LFSR
+ *
+ * il = length of LSFR = degree of generator polynom reduce il by one to calculate the degree
+ * of the highest register in LSFR
+ *
+ * Examples:
+ * CRC-16 for Tap: x16 + x15 + x2 + 1
+ * generator = 0x8005, il = 16, ucl = 0x000000000000FFFF
+ *
+ * CRC-16 for Floppy: x16 + x12 + x5 +1
+ * generator = 0x1021, il = 16, ucl = 0x000000000000FFFF
+ *
+ * CRC-32 for Ethernet: x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
+ * generator = 0x04C11DB7, il = 32, ucl = 0x00000000FFFFFFFF
+ *
+ * CRC-64 SP-TrEMBL x64 + x4 + x3 + x + 1 (maximal-length LFSR)
+ * generator = 0x1B, il = 64, ucl = 0xFFFFFFFFFFFFFFFF
+ *
+ * CRC-64 improved
+ * x64 + x63 + x61 + x59 + x58 + x56 + x55 + x52 + x49 + x48 + x47 + x46+ x44 +
+ * x41 + x37 + x36 + x34 + x32 + x31 + x28 + x26 + x23 + x22 + x19 + x16 + x13 +
+ * x12 + x10 + x9 + x6 + x4 + x3 + 1
+ * (see http://www.cs.ud.ac.uk/staff/D.Jones/crcbote.pdf)
+ * generator = 0xAD93D23594C9362D, il = 64, ucl = 0xFFFFFFFFFFFFFFFF
+ *
+ * CRC-64 DLT1 spec
+ * x64 + x62 + x57 + x55 + x54 + x53 + x52 + x47 + x46 + x45 + x40 + x39 + x38 + x37 +
+ * x35 + x33 + x32 + x31 + x29 + x27 + x24 + x23 + x22 + x21 + x19 + x17 + x13 + x12 +
+ * x10 + x9 + x7 + x4 + x + 1
+ * (see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-182.pdf -> page63)
+ * generator = 0x42F0E1EBA9EA3693
+ *
+ * CRC-64 from internet G(x)= 1006003C000F0D50B
+ */
+int
+createCRCParameter(uint64_t *ui64RegisterMask, unsigned int *uiRegisterLength)
+{
+ enum Generators { Tape_16, Floppy_16, Ethernet_32, SPTrEMBL_64,
+ SPTrEMBL_improved_64, DLT1_64 };
+ enum Generators Generator;
+
+ Generator = CRC_METHODE;
+ switch (Generator) {
+ case Tape_16: {
+ *ui64RegisterMask = 0x0000ffff;
+ ui64Generator1 = 0x00008005;
+ *uiRegisterLength = 16;
+ break;
+ }
+ case Floppy_16: {
+ *ui64RegisterMask = 0x0000ffff;
+ ui64Generator1 = 0x00001021;
+ *uiRegisterLength = 16;
+ break;
+ }
+ case Ethernet_32: {
+ *ui64RegisterMask = 0xffffffff;
+ ui64Generator1 = 0x04C11DB7;
+ *uiRegisterLength = 32;
+ break;
+ }
+ case SPTrEMBL_64: {
+ *ui64RegisterMask = 0xffffffff;
+ *ui64RegisterMask =
+ ((*ui64RegisterMask) << 32) + 0xffffffff;
+ ui64Generator1 = 0x0000001B;
+ *uiRegisterLength = 64;
+ break;
+ }
+ case SPTrEMBL_improved_64: {
+ *ui64RegisterMask = 0xffffffff;
+ *ui64RegisterMask =
+ ((*ui64RegisterMask) << 32) + 0xffffffff;
+ ui64Generator1 = 0xAD93D235;
+ ui64Generator1 = (ui64Generator1 << 32) + 0x94C9362D;
+ *uiRegisterLength = 64;
+ break;
+ }
+ case DLT1_64: {
+ *ui64RegisterMask = 0xffffffff;
+ *ui64RegisterMask =
+ ((*ui64RegisterMask) << 32) + 0xffffffff;
+ ui64Generator1 = 0x42F0E1EB;
+ ui64Generator1 = (ui64Generator1 << 32) + 0xA9EA3693;
+ *uiRegisterLength = 64;
+ break;
+ }
+ }
+ (*uiRegisterLength)--;
+
+ return 0;
+}
+
+/**
+ * Check CRC by using Linear Feadback Shift Register (LFSR)
+ */
+static uint64_t
+calCRCbyte(unsigned char *cPtr, uint32_t ui32NoWords, uint64_t AccumCRC)
+{
+
+ uint64_t ui64Mask, ui64Generator0;
+ uint8_t ui8Buffer;
+ unsigned int uiRegisterLength;
+ int iShift;
+
+ createCRCParameter(&ui64Mask, &uiRegisterLength);
+
+ ui8Buffer = (*cPtr);
+ while (ui32NoWords > 0) {
+ for (iShift = 7; iShift >= 0; iShift--) {
+
+ ui64Generator0 = (AccumCRC >> uiRegisterLength);
+ AccumCRC <<= 1;
+ ui64Generator0 &= 0x01;
+ ui64Generator0 = (0 - ui64Generator0);
+ AccumCRC ^= (ui64Generator1 & ui64Generator0);
+ }
+ AccumCRC ^= ui8Buffer;
+ AccumCRC &= ui64Mask;
+ ui32NoWords -= 1;
+ cPtr += 1;
+ ui8Buffer = (*cPtr);
+ }
+ return AccumCRC;
+}
+
+/**
+ * Check CRC by using Linear Feadback Shift Register (LFSR)
+ */
+uint64_t
+calCRCword(unsigned char *cPtr, uint32_t ui32NoWords, uint64_t AccumCRC)
+{
+
+ uint64_t ui64Mask, ui64Generator0;
+ uint16_t ui16Buffer;
+ unsigned int uiRegisterLength;
+ int iShift;
+
+ createCRCParameter(&ui64Mask, &uiRegisterLength);
+
+ if ((ui32NoWords % 2) != 0) {
+ /* if Data string does not end at word boundery add one byte */
+ ui32NoWords++;
+ cPtr[ui32NoWords] = 0;
+ }
+ ui16Buffer = ((*(cPtr + 0)) * 256) + (*(cPtr + 1));
+ while (ui32NoWords > 0) {
+ for (iShift = 15; iShift >= 0; iShift--) {
+ ui64Generator0 = (AccumCRC >> uiRegisterLength);
+ AccumCRC <<= 1;
+ ui64Generator0 &= 0x01;
+ ui64Generator0 = (0 - ui64Generator0);
+ AccumCRC ^= (ui64Generator1 & ui64Generator0);
+ }
+ AccumCRC ^= ui16Buffer;
+ AccumCRC &= ui64Mask;
+ ui32NoWords -= 2;
+ cPtr += 2;
+ ui16Buffer = ((*(cPtr + 0)) * 256) + (*(cPtr + 1));
+ }
+ return AccumCRC;
+}
+
+uint64_t
+checkCRC(unsigned char *cPtr, uint32_t ui32NoWords, uint64_t AccumCRC)
+{
+
+ enum Generators { Ethernet_32 };
+ enum Generators Generator;
+ uint64_t ui64Buffer = AccumCRC;
+
+ Generator = CRC_METHODE;
+
+ switch (Generator) {
+ case Ethernet_32: {
+ /* (ui32NoWords - 4),no need of 4 bytes 0x as
+ * with shift-register method */
+ AccumCRC =
+ calCRCEthernet32(cPtr, (ui32NoWords - 4), AccumCRC);
+ break;
+ }
+ default: {
+ AccumCRC = calCRCword(cPtr, ui32NoWords, AccumCRC);
+ break;
+ }
+ }
+
+ if (calCRCbyte(cPtr, ui32NoWords, ui64Buffer) != AccumCRC) {
+ printf("\n --- big Endian - small Endian problem --- \n");
+ AccumCRC--;
+ }
+
+ return (AccumCRC);
+}
diff --git a/romfs/tools/crclib.h b/romfs/tools/crclib.h
new file mode 100644
index 0000000..4ee21d0
--- /dev/null
+++ b/romfs/tools/crclib.h
@@ -0,0 +1,23 @@
+/******************************************************************************
+ * Copyright (c) 2004, 2008 IBM Corporation
+ * All rights reserved.
+ * This program and the accompanying materials
+ * are made available under the terms of the BSD License
+ * which accompanies this distribution, and is available at
+ * http://www.opensource.org/licenses/bsd-license.php
+ *
+ * Contributors:
+ * IBM Corporation - initial implementation
+ *****************************************************************************/
+
+#ifndef CRCLIB_H
+#define CRCLIB_H
+#include <stdint.h>
+
+extern uint64_t ui64Generator1;
+
+int createCRCParameter(uint64_t *, unsigned int *);
+uint64_t calCRCword(unsigned char *, uint32_t, uint64_t);
+uint64_t checkCRC(unsigned char *, uint32_t, uint64_t);
+
+#endif /* CRCLIB_H */
diff --git a/romfs/tools/create_crc.c b/romfs/tools/create_crc.c
index 51f137d..5a76b9c 100644
--- a/romfs/tools/create_crc.c
+++ b/romfs/tools/create_crc.c
@@ -14,29 +14,13 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <netinet/in.h>
-#include <fcntl.h>
-#include <string.h>
#include <unistd.h>
#include <cfgparse.h>
#include <time.h>
#include <calculatecrc.h>
#include <product.h>
#include "createcrc.h"
-
-int createHeaderImage(int);
-unsigned int calCRCEthernet32(unsigned char *TextPtr,
- unsigned long int TextLength,
- unsigned int AccumCRC);
-int createCRCParameter(uint64_t * ui64RegisterMask,
- unsigned int *iRegisterLength);
-uint64_t calCRCbyte(unsigned char *TextPtr, uint32_t Residual,
- uint64_t AccumCRC);
-uint64_t calCRCword(unsigned char *TextPtr, uint32_t Residual,
- uint64_t AccumCRC);
-uint64_t checkCRC(unsigned char *TextPtr, uint32_t Residual, uint64_t AccumCRC);
+#include "crclib.h"
/* file length in bytes */
static uint64_t ui64globalFileSize = 0;
@@ -46,7 +30,6 @@ static unsigned char pucFileStream[4400000];
static uint64_t ui64globalHeaderSize = 0;
/* flag to filter detect the header in buildDataStream() */
static int iglobalHeaderFlag = 1;
-static uint64_t ui64Generator1;
/**
* Build the file image and store it as Data Stream of bytes
@@ -179,250 +162,6 @@ createHeaderImage(int notime)
}
/**
- * calculate standart ethernet 32 bit CRC
- * generator polynome is 0x104C11DB7
- * this algorithm can be used for encoding and decoding
- */
-unsigned int
-calCRCEthernet32(unsigned char *TextPtr, unsigned long int TextLength,
- unsigned int AccumCRC)
-{
- const unsigned int CrcTableHigh[16] = {
- 0x00000000, 0x4C11DB70, 0x9823B6E0, 0xD4326D90,
- 0x34867077, 0x7897AB07, 0xACA5C697, 0xE0B41DE7,
- 0x690CE0EE, 0x251D3B9E, 0xF12F560E, 0xBD3E8D7E,
- 0x5D8A9099, 0x119B4BE9, 0xC5A92679, 0x89B8FD09
- };
- const unsigned CrcTableLow[16] = {
- 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9,
- 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,
- 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,
- 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD
- };
-
- unsigned char *Buffer = TextPtr;
- unsigned long int Residual = TextLength;
-
-
- while (Residual > 0) {
- unsigned int Temp = ((AccumCRC >> 24) ^ *Buffer) & 0x000000ff;
- AccumCRC <<= 8;
- AccumCRC ^= CrcTableHigh[Temp / 16];
- AccumCRC ^= CrcTableLow[Temp % 16];
- ++Buffer;
- --Residual;
- }
- return AccumCRC;
-}
-
-/**
- * create CRC Parameter: CRC Polynome, Shiftregister Mask and length
- *
- * ui64Generator[0] = 0;
- * ui64Generator[1] = 0x42F0E1EB;
- * ui64Generator[1] = (ui64Generator[1] << 32) + 0xA9EA3693;
- * iRegisterLength = 63;
- * ui64RegisterMask = 0xffffffff;
- * ui64RegisterMask = ((ui64RegisterMask) << 32) + 0xffffffff;
- *
- * ucl=0x00000000ffffffff = Mask for 32 bit LSFR to cut down number of bits
- * in the variable to get the same length as LFSR
- *
- * il = length of LSFR = degree of generator polynom reduce il by one to calculate the degree
- * of the highest register in LSFR
- *
- * Examples:
- * CRC-16 for Tap: x16 + x15 + x2 + 1
- * generator = 0x8005, il = 16, ucl = 0x000000000000FFFF
- *
- * CRC-16 for Floppy: x16 + x12 + x5 +1
- * generator = 0x1021, il = 16, ucl = 0x000000000000FFFF
- *
- * CRC-32 for Ethernet: x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
- * generator = 0x04C11DB7, il = 32, ucl = 0x00000000FFFFFFFF
- *
- * CRC-64 SP-TrEMBL x64 + x4 + x3 + x + 1 (maximal-length LFSR)
- * generator = 0x1B, il = 64, ucl = 0xFFFFFFFFFFFFFFFF
- *
- * CRC-64 improved
- * x64 + x63 + x61 + x59 + x58 + x56 + x55 + x52 + x49 + x48 + x47 + x46+ x44 +
- * x41 + x37 + x36 + x34 + x32 + x31 + x28 + x26 + x23 + x22 + x19 + x16 + x13 +
- * x12 + x10 + x9 + x6 + x4 + x3 + 1
- * (see http://www.cs.ud.ac.uk/staff/D.Jones/crcbote.pdf)
- * generator = 0xAD93D23594C9362D, il = 64, ucl = 0xFFFFFFFFFFFFFFFF
- *
- * CRC-64 DLT1 spec
- * x64 + x62 + x57 + x55 + x54 + x53 + x52 + x47 + x46 + x45 + x40 + x39 + x38 + x37 +
- * x35 + x33 + x32 + x31 + x29 + x27 + x24 + x23 + x22 + x21 + x19 + x17 + x13 + x12 +
- * x10 + x9 + x7 + x4 + x + 1
- * (see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-182.pdf -> page63)
- * generator = 0x42F0E1EBA9EA3693
- *
- * CRC-64 from internet G(x)= 1006003C000F0D50B
- */
-int
-createCRCParameter(uint64_t * ui64RegisterMask, unsigned int *uiRegisterLength)
-{
- enum Generators { Tape_16, Floppy_16, Ethernet_32, SPTrEMBL_64,
- SPTrEMBL_improved_64, DLT1_64
- };
- enum Generators Generator;
-
- Generator = CRC_METHODE;
- switch (Generator) {
- case Tape_16:{
- *ui64RegisterMask = 0x0000ffff;
- ui64Generator1 = 0x00008005;
- *uiRegisterLength = 16;
- break;
- }
- case Floppy_16:{
- *ui64RegisterMask = 0x0000ffff;
- ui64Generator1 = 0x00001021;
- *uiRegisterLength = 16;
- break;
- }
- case Ethernet_32:{
- *ui64RegisterMask = 0xffffffff;
- ui64Generator1 = 0x04C11DB7;
- *uiRegisterLength = 32;
- break;
- }
- case SPTrEMBL_64:{
- *ui64RegisterMask = 0xffffffff;
- *ui64RegisterMask =
- ((*ui64RegisterMask) << 32) + 0xffffffff;
- ui64Generator1 = 0x0000001B;
- *uiRegisterLength = 64;
- break;
- }
- case SPTrEMBL_improved_64:{
- *ui64RegisterMask = 0xffffffff;
- *ui64RegisterMask =
- ((*ui64RegisterMask) << 32) + 0xffffffff;
- ui64Generator1 = 0xAD93D235;
- ui64Generator1 = (ui64Generator1 << 32) + 0x94C9362D;
- *uiRegisterLength = 64;
- break;
- }
- case DLT1_64:{
- *ui64RegisterMask = 0xffffffff;
- *ui64RegisterMask =
- ((*ui64RegisterMask) << 32) + 0xffffffff;
- ui64Generator1 = 0x42F0E1EB;
- ui64Generator1 = (ui64Generator1 << 32) + 0xA9EA3693;
- *uiRegisterLength = 64;
- break;
- }
- }
- (*uiRegisterLength)--;
-
- return 0;
-}
-
-/**
- * Check CRC by using Linear Feadback Shift Register (LFSR)
- */
-uint64_t
-calCRCbyte(unsigned char *cPtr, uint32_t ui32NoWords, uint64_t AccumCRC)
-{
-
- uint64_t ui64Mask, ui64Generator0;
- uint8_t ui8Buffer;
- unsigned int uiRegisterLength;
- int iShift;
-
- createCRCParameter(&ui64Mask, &uiRegisterLength);
-
- ui8Buffer = (*cPtr);
- while (ui32NoWords > 0) {
- for (iShift = 7; iShift >= 0; iShift--) {
-
- ui64Generator0 = (AccumCRC >> uiRegisterLength);
- AccumCRC <<= 1;
- ui64Generator0 &= 0x01;
- ui64Generator0 = (0 - ui64Generator0);
- AccumCRC ^= (ui64Generator1 & ui64Generator0);
- }
- AccumCRC ^= ui8Buffer;
- AccumCRC &= ui64Mask;
- ui32NoWords -= 1;
- cPtr += 1;
- ui8Buffer = (*cPtr);
- }
- return AccumCRC;
-}
-
-/**
- * Check CRC by using Linear Feadback Shift Register (LFSR)
- */
-uint64_t
-calCRCword(unsigned char *cPtr, uint32_t ui32NoWords, uint64_t AccumCRC)
-{
-
- uint64_t ui64Mask, ui64Generator0;
- uint16_t ui16Buffer;
- unsigned int uiRegisterLength;
- int iShift;
-
- createCRCParameter(&ui64Mask, &uiRegisterLength);
-
- if ((ui32NoWords % 2) != 0) {
- /* if Data string does not end at word boundery add one byte */
- ui32NoWords++;
- cPtr[ui32NoWords] = 0;
- }
- ui16Buffer = ((*(cPtr + 0)) * 256) + (*(cPtr + 1));
- while (ui32NoWords > 0) {
- for (iShift = 15; iShift >= 0; iShift--) {
- ui64Generator0 = (AccumCRC >> uiRegisterLength);
- AccumCRC <<= 1;
- ui64Generator0 &= 0x01;
- ui64Generator0 = (0 - ui64Generator0);
- AccumCRC ^= (ui64Generator1 & ui64Generator0);
- }
- AccumCRC ^= ui16Buffer;
- AccumCRC &= ui64Mask;
- ui32NoWords -= 2;
- cPtr += 2;
- ui16Buffer = ((*(cPtr + 0)) * 256) + (*(cPtr + 1));
- }
- return AccumCRC;
-}
-
-uint64_t
-checkCRC(unsigned char *cPtr, uint32_t ui32NoWords, uint64_t AccumCRC)
-{
-
- enum Generators { Ethernet_32 };
- enum Generators Generator;
- uint64_t ui64Buffer = AccumCRC;
-
- Generator = CRC_METHODE;
-
- switch (Generator) {
- case Ethernet_32:{
- /* (ui32NoWords - 4),no need of 4 bytes 0x as
- * with shift-register method */
- AccumCRC =
- calCRCEthernet32(cPtr, (ui32NoWords - 4), AccumCRC);
- break;
- }
- default:{
- AccumCRC = calCRCword(cPtr, ui32NoWords, AccumCRC);
- break;
- }
- }
-
- if (calCRCbyte(cPtr, ui32NoWords, ui64Buffer) != AccumCRC) {
- printf("\n --- big Endian - small Endian problem --- \n");
- AccumCRC--;
- }
-
- return (AccumCRC);
-}
-
-/**
* insert header and file CRC into data stream
* do CRC check on header and file
* write data stream to disk