110 Комити 543162b701 ... 671f422a73

Аутор SHA1 Порука Датум
  Martin-P 671f422a73 Merge SourceForge SVN repository, OpenV2G 0.9.5 пре 3 година
  daniel_peintner 87591ab3b7 docs: fix copyright year пре 3 година
  daniel_peintner 100123c809 docs: update release notes for 0.9.5 пре 3 година
  daniel_peintner 9bb3ff36d1 fix: possible memory corruption bug when parsing X509 serial numbers пре 3 година
  daniel_peintner 6a5f291f88 feat: add "iso2" prefix to Document and Fragment structures/defines to avoid collisions if multiple codecs are used in parallel (e.g., iso1 and iso2) пре 6 година
  daniel_peintner 7528fd8eb7 feat: add "din" prefix to Document and Fragment structures/defines to avoid collisions if multiple codecs are used in parallel (e.g., din and iso) пре 6 година
  daniel_peintner 7aa0d3151f feat: add "iso1" prefix to Document and Fragment structures/defines to avoid collisions if multiple codecs are used in parallel (e.g., din and iso) пре 6 година
  daniel_peintner 912aa5f2db remove unnecessary characters variable пре 6 година
  daniel_peintner 06a3b436bf fix: set fixed size of big integer container пре 7 година
  daniel_peintner 033a46dd37 fix: add support for big integer (see X509SerialNumber in ISO1) пре 7 година
  daniel_peintner 247f4647cf get read for release 0.9.4 пре 7 година
  daniel_peintner b47721107e fix eMAID fragment encoding/decoding (issue reported in https://sourceforge.net/p/openv2g/tickets/11/) пре 8 година
  daniel_peintner 09b9aedd33 extend coders with support of collapsing (same) fragment elements IF type is the same or is an extension (see https://sourceforge.net/p/openv2g/tickets/11/) пре 8 година
  daniel_peintner e3d4b29932 adapt limits as suggested in https://sourceforge.net/p/openv2g/tickets/8/ for DIN and ISO2 also пре 8 година
  daniel_peintner 63b3a15000 fix V2GTP header length from 16 to 32 bits as suggested in https://sourceforge.net/p/openv2g/tickets/10/ пре 8 година
  daniel_peintner e3a6bb5abc adapt static array sizes and information as suggested in https://sourceforge.net/p/openv2g/tickets/8/ пре 8 година
  daniel_peintner 90976ee871 fix some more #define issues as reported in https://sourceforge.net/p/openv2g/tickets/7/ пре 8 година
  daniel_peintner a4f803bb10 fix issue w.r.t. "warning: its scope is only this definition or declaration, which is probably not what you want пре 8 година
  daniel_peintner c6c656a9f7 fix issue with #defines pointing to wrong ISO version (ISO2 instead of ISO1) пре 8 година
  daniel_peintner 3fbc8ec397 fix issue https://sourceforge.net/p/openv2g/tickets/6/ пре 8 година
  daniel_peintner a671b75778 enum fix пре 8 година
  daniel_peintner 3d6ad81223 * restructure project to support multiple ISO versions пре 8 година
  daniel_peintner 9dde0a7b3d * initial check-in for 15118:2:2016 пре 8 година
  daniel_peintner 6cef435279 fix for ticket, https://sourceforge.net/p/openv2g/tickets/4/ пре 10 година
  daniel_peintner c013f04b1e * get ready for version 0.9.3 пре 10 година
  daniel_peintner c13885cbaf * get ready for release OpenV2G 0.9.2 пре 11 година
  daniel_peintner de61f0e59c * get ready for release 0.9.1 пре 11 година
  daniel_peintner 6ab917be66 * adds support for DIN пре 11 година
  daniel_peintner 9c2b711d55 * adds support for DIN пре 11 година
  daniel_peintner fafba1ecd0 * switch off pedantic warnings пре 11 година
  daniel_peintner c3dab49523 * get ready for release 0.9 пре 11 година
  sebastiankb 7814569390 OpenV2G 0.8 пре 11 година
  sebastiankb 85cb922c5a delete OpenV2G 0.7 пре 11 година
  daniel_peintner 0933696169 пре 12 година
  sebastiankb 7d969a0d4c update makefiles пре 13 година
  sebastiankb 4f6778feba update makefiles пре 13 година
  sebastiankb 71d00ba477 пре 13 година
  sebastiankb c7365f25a1 пре 13 година
  daniel_peintner 75c2627f62 пре 13 година
  sebastiankb 97e9cc9f3b v2gv2gtp for 0.7 пре 13 година
  sebastiankb 57ff27930c service files for 0.7 пре 13 година
  sebastiankb 732d394324 OpenV2G 0.7 init пре 13 година
  sebastiankb c4fcca04a4 пре 13 година
  sebastiankb a342317852 пре 13 година
  sebastiankb 5f4543c0de пре 13 година
  sebastiankb cfdd726f75 пре 13 година
  sebastiankb 99a33ccd91 main files пре 13 година
  daniel_peintner ddb210805a * last EXI codec fixes for release пре 13 година
  sebastiankb 38fde489ed init OpenV2G 0.6 public пре 13 година
  sebastiankb d3fe513ffc delete 0.6rc1 пре 13 година
  daniel_peintner 37d784f56c пре 14 година
  daniel_peintner 5a9aae1694 пре 14 година
  daniel_peintner 5dfebf8b48 пре 14 година
  daniel_peintner 38ab77c7d2 пре 14 година
  daniel_peintner e0a30233ba пре 14 година
  daniel_peintner 80b846a8b7 пре 14 година
  daniel_peintner 5ec7db1987 пре 14 година
  sebastiankb 31f84795e0 init the AppProtocolReq structure пре 14 година
  sebastiankb 4bb21254f9 пре 14 година
  daniel_peintner e8ba2a611c * fixes name table entries issue пре 14 година
  sebastiankb 32078408b5 codec update пре 14 година
  sebastiankb c9210283c7 пре 14 година
  sebastiankb d5f9a67a36 OOpenV2G 0.6 init2 пре 14 година
  sebastiankb ff85c0c60d OpenV2G 0.6 init пре 14 година
  sebastiankb 3e7b97d740 delete 0.5 пре 14 година
  sebastiankb 3d3a117445 пре 14 година
  daniel_peintner 4e17bb8f29 * update EXI codec to latest given schema пре 14 година
  daniel_peintner 87d09c6ae5 * update EXI codec to latest given schema пре 14 година
  daniel_peintner 2b978cbcd2 * update EXI codec to latest given schema пре 14 година
  daniel_peintner 4e01b87700 * update EXI codec to latest given schema пре 14 година
  daniel_peintner 40a2516afe * update EXI codec to latest given schema пре 14 година
  sebastiankb 737e0a1141 пре 14 година
  sebastiankb 9ab7ff6d40 пре 14 година
  sebastiankb 6b4c83aa45 OpeOpenV2G 0.5 init пре 14 година
  sebastiankb 8849f662b5 delete old files (DoIP and main_service, main_service, etc) пре 14 година
  daniel_peintner 7799eeb24a * new exi and xml files according to latest XML Schema пре 14 година
  sebastiankb 098db4604e release 0.4 (DC charging) пре 14 година
  sebastiankb d9a8576ec0 0.3.1 release (DoIP) пре 15 година
  sebastiankb f17cd9c1b5 пре 15 година
  sebastiankb 7f2adb89ed 0.3.1 release (test) пре 15 година
  sebastiankb 138bdd4ae6 пре 15 година
  sebastiankb 19d0d4c9b4 0.3.1 release (V2G service) пре 15 година
  sebastiankb cbdba43af3 пре 15 година
  sebastiankb 05301bf248 0.3.1 release (EXI codec) пре 15 година
  sebastiankb e1e0b55598 пре 15 година
  sebastiankb 3b16a44a99 пре 15 година
  sebastiankb be0560db7a пре 15 година
  sebastiankb 1f047aeb7f doip.h --> doIP.h in v2g_serviceClientDataTransmitter.c пре 15 година
  sebastiankb a7e1ab57dd doip files пре 15 година
  sebastiankb 12bd32bd8a 0.3 release zum testen пре 15 година
  mlauterbach 3e4a8426d8 - changed Tool Chain Editor from 'MinGW GCC' to 'Linux GCC' пре 15 година
  mlauterbach 350a915582 removed warnings: defined 1bit wide bitfields to 'unsigned int' пре 15 година
  sebastiankb fa292b984e ByteStream included пре 15 година
  sebastiankb 32f7bfd532 - version 0.2.3 or 0.3? пре 15 година
  sebastiankb 331e3ecbb1 - service 0.2.2 пре 15 година
  daniel_peintner 69e25e0172 * improves EXI codec footprint пре 15 година
  sebastiankb a9e47e19ae - readme version changes пре 15 година
  sebastiankb 164bc87bbd - tag release 0.2.1 пре 15 година
  sebastiankb f4b76996a2 - changed .cproject to release compile mode пре 15 година
  sebastiankb 6f93ebba75 пре 15 година
  sebastiankb d666c476c1 - include loop handling in serialization and datatype init пре 15 година
  daniel_peintner 69ef78539d * adds service (server & client) пре 15 година
  sebastiankb 102e607847 readme to 0.2 пре 15 година
  sebastiankb 4e1d48bb78 versionierung im codec auf 0.2 пре 15 година
  sebastiankb b132e921e5 - service implementation пре 15 година
  daniel_peintner 7289406799 * split EXI Header in decoder and encoder part пре 15 година
  daniel_peintner e42f201089 * eliminates remaining -ansic -pedantic warnings пре 15 година
  daniel_peintner 8f499da64a * adds README.txt пре 15 година
  daniel_peintner 9a9835ad3d * first code check-in (support for EXI stream) пре 15 година
  daniel_peintner 5f032498c0 * setup initial SVN structure пре 15 година
2 измењених фајлова са 390 додато и 248 уклоњено
  1. 6 2
      README.txt
  2. 384 246
      src/codec/DecoderChannel.c

+ 6 - 2
README.txt

@@ -1,12 +1,12 @@
 -------------------------------------------------------------------------
 OpenV2G - an open source project implementing the basic functionality of the ISO IEC 15118 vehicle to grid (V2G) communication interface 
-Version 0.9.4, released January 30, 2018
+Version 0.9.5, released March 11, 2022
 http://openv2g.sourceforge.net/
 
 Please report bugs via the SourceForge bug tracking system at http://sourceforge.net/tracker/?group_id=350113.
 Thank you.
 
-Copyright (C) 2007-2018 Siemens AG
+Copyright (C) 2007-2022 Siemens AG
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published
@@ -21,6 +21,10 @@ GNU Lesser General Public License for more details.
 You should have received a copy of the GNU Lesser General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>.
 
+-------------------------------------------------------------------------
+CHANGES from version 0.9.4:
+-------------------------------------------------------------------------
+* fix possible memory corruption bug
 
 -------------------------------------------------------------------------
 CHANGES from version 0.9.3:

+ 384 - 246
src/codec/DecoderChannel.c

@@ -1,32 +1,32 @@
-/*
- * Copyright (C) 2007-2018 Siemens AG
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*******************************************************************
- *
- * @author Daniel.Peintner.EXT@siemens.com
- * @version 2017-03-02 
- * @contact Richard.Kuntschke@siemens.com
- *
- * <p>Code generated by EXIdizer</p>
- * <p>Schema: V2G_CI_MsgDef.xsd</p>
- *
- *
- ********************************************************************/
-
+/*
+ * Copyright (C) 2007-2022 Siemens AG
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*******************************************************************
+ *
+ * @author Daniel.Peintner.EXT@siemens.com
+ * @version 2022-03-08 
+ * @contact Richard.Kuntschke@siemens.com
+ *
+ * <p>Code generated by EXIdizer</p>
+ * <p>Schema: V2G_CI_MsgDef.xsd</p>
+ *
+ *
+ ********************************************************************/
+
 
 
 #include "DecoderChannel.h"
@@ -261,182 +261,320 @@ int decodeUnsignedInteger64(bitstream_t* stream, uint64_t* uint64) {
 
 	return errn;
 }
-
-
-void _reverseArray(uint8_t *array, int number) {
-    int x, t;
-    number--;
-
-    for(x = 0; x < number; x ++, number --) {
-        t = array[x];
-        array[x] = array[number];
-        array[number] = t;
-    }
-}
-
-/**
- * Decode an arbitrary precision non negative integer using a sequence of
- * octets. The most significant bit of the last octet is set to zero to
- * indicate sequence termination. Only seven bits per octet are used to
- * store the integer's value.
- */
-int decodeUnsignedIntegerBig(bitstream_t* stream, size_t size, uint8_t* data, size_t* len) {
-	int errn = 0;
-	uint8_t b = 0;
-	unsigned int mShift1 = 0;
-	unsigned int mShift2 = 0;
-	unsigned int mShift3 = 0;
-	unsigned int mShift4 = 0;
-	unsigned int nBytesRead = 0;
-	unsigned int nBitsAvailable = 0;
-	uint64_t uint64_1 = 0;
-	uint64_t uint64_2 = 0;
-	uint64_t uint64_3 = 0;
-	uint64_t uint64_4 = 0;
-
-	*len = 0;
-
-	do {
-		errn = decode(stream, &b);
-		nBytesRead++;
-		nBitsAvailable += 7;
-
-		if(nBytesRead <= 8) {
-			uint64_1 += ((uint64_t) (b & 127)) << mShift1;
-			mShift1 += 7;
-		} else if(nBytesRead <= 16) {
-			uint64_2 += ((uint64_t) (b & 127)) << mShift2;
-			mShift2 += 7;
-		} else if(nBytesRead <= 24) {
-			uint64_3 += ((uint64_t) (b & 127)) << mShift3;
-			mShift3 += 7;
-		} else if(nBytesRead <= 32) {
-			uint64_4 += ((uint64_t) (b & 127)) << mShift4;
-			mShift4 += 7;
-		} else {
-			return -1; // too large
-		}
-	} while (errn == 0 && (b >> 7) == 1);
-
-	// shift actual data into array
-	if(uint64_4 != 0) {
-		// 7 octets for uint64_1
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 1
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 2
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 3
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 4
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 5
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 6
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 7
-
-		// 7 octets for uint64_2
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 1
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 2
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 3
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 4
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 5
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 6
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 7
-
-		// 7 octets for uint64_3
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 1
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 2
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 3
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 4
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 5
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 6
-		uint64_3 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 7
-
-		// remaining octets of uint64_4
-		while (uint64_4 != 0 && errn == 0) {
-			data[(*len)++] = uint64_4 & 0xFF;
-			uint64_4 >>= 8;
-		}
-	} else if(uint64_3 != 0) {
-		// 7 octets for uint64_1
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 1
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 2
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 3
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 4
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 5
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 6
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 7
-
-		// 7 octets for uint64_2
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 1
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 2
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 3
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 4
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 5
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 6
-		uint64_2 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 7
-
-		// remaining octets of uint64_3
-		while (uint64_3 != 0 && errn == 0) {
-			data[(*len)++] = uint64_3 & 0xFF;
-			uint64_3 >>= 8;
-		}
-
-	} else if(uint64_2 != 0) {
-		// 7 octets for uint64_1
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 1
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 2
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 3
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 4
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 5
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 6
-		uint64_1 >>= 8;
-		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 7
-		// remaining octets of uint64_2
-		while (uint64_2 != 0 && errn == 0) {
-			data[(*len)++] = uint64_2 & 0xFF;
-			uint64_2 >>= 8;
-		}
-	} else if(uint64_1 != 0) {
-		while (uint64_1 != 0 && errn == 0) {
-			data[(*len)++] = uint64_1 & 0xFF;
-			uint64_1 >>= 8;
-		}
-	}
-
-	_reverseArray(data, *len);
-
-	return errn;
+
+
+void _reverseArray(uint8_t *array, int number) {
+    int x, t;
+    number--;
+
+    for(x = 0; x < number; x ++, number --) {
+        t = array[x];
+        array[x] = array[number];
+        array[number] = t;
+    }
+}
+
+/**
+ * Decode an arbitrary precision non negative integer using a sequence of
+ * octets. The most significant bit of the last octet is set to zero to
+ * indicate sequence termination. Only seven bits per octet are used to
+ * store the integer's value.
+ */
+int decodeUnsignedIntegerBig(bitstream_t* stream, size_t size, uint8_t* data, size_t* len) {
+	int errn = 0;
+	uint8_t b = 0;
+	unsigned int mShift1 = 0;
+	unsigned int mShift2 = 0;
+	unsigned int mShift3 = 0;
+	unsigned int mShift4 = 0;
+	unsigned int nBytesRead = 0;
+	unsigned int nBitsAvailable = 0;
+	uint64_t uint64_1 = 0;
+	uint64_t uint64_2 = 0;
+	uint64_t uint64_3 = 0;
+	uint64_t uint64_4 = 0;
+
+	*len = 0;
+
+	do {
+		errn = decode(stream, &b);
+		nBytesRead++;
+		nBitsAvailable += 7;
+
+		if(nBytesRead <= 8) {
+			uint64_1 += ((uint64_t) (b & 127)) << mShift1;
+			mShift1 += 7;
+		} else if(nBytesRead <= 16) {
+			uint64_2 += ((uint64_t) (b & 127)) << mShift2;
+			mShift2 += 7;
+		} else if(nBytesRead <= 24) {
+			uint64_3 += ((uint64_t) (b & 127)) << mShift3;
+			mShift3 += 7;
+		} else if(nBytesRead <= 32) {
+			uint64_4 += ((uint64_t) (b & 127)) << mShift4;
+			mShift4 += 7;
+		} else {
+			return -1; /* too large */
+		}
+	} while (errn == 0 && (b >> 7) == 1);
+
+	/* shift actual data into array */
+	if(uint64_4 != 0) {
+		/* 7 octets for uint64_1 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 1 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 2 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 3 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 4 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 5 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 6 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 7 */
+
+		/* 7 octets for uint64_2 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 1 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 2 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 3 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 4 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 5 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 6 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 7 */
+
+		/* 7 octets for uint64_3 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 1 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 2 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 3 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 4 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 5 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 6 */
+		uint64_3 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); /* 7 */
+
+		/* remaining octets of uint64_4 */
+		while (uint64_4 != 0 && errn == 0) {
+			if(*len >= size) {
+				return EXI_ERROR_OUT_OF_BOUNDS;
+			}
+			data[(*len)++] = uint64_4 & 0xFF;
+			uint64_4 >>= 8;
+		}
+	} else if(uint64_3 != 0) {
+		/* 7 octets for uint64_1 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 1 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 2 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 3 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 4 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 5 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 6 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 7 */
+
+		/* 7 octets for uint64_2 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 1 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 2 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 3 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 4 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 5 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 6 */
+		uint64_2 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); /* 7 */
+
+		/* remaining octets of uint64_3 */
+		while (uint64_3 != 0 && errn == 0) {
+			if(*len >= size) {
+				return EXI_ERROR_OUT_OF_BOUNDS;
+			}
+			data[(*len)++] = uint64_3 & 0xFF;
+			uint64_3 >>= 8;
+		}
+
+	} else if(uint64_2 != 0) {
+		/* 7 octets for uint64_1 */
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 1 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 2 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 3 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 4 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 5 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 6 */
+		uint64_1 >>= 8;
+		if(*len >= size) {
+			return EXI_ERROR_OUT_OF_BOUNDS;
+		}
+		data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); /* 7 */
+		/* remaining octets of uint64_2 */
+		while (uint64_2 != 0 && errn == 0) {
+			if(*len >= size) {
+				return EXI_ERROR_OUT_OF_BOUNDS;
+			}
+			data[(*len)++] = uint64_2 & 0xFF;
+			uint64_2 >>= 8;
+		}
+	} else if(uint64_1 != 0) {
+		while (uint64_1 != 0 && errn == 0) {
+			if(*len >= size) {
+				return EXI_ERROR_OUT_OF_BOUNDS;
+			}
+			data[(*len)++] = uint64_1 & 0xFF;
+			uint64_1 >>= 8;
+		}
+	}
+
+	_reverseArray(data, *len);
+
+	return errn;
 }
 
 int decodeInteger(bitstream_t* stream, exi_integer_t* iv) {
@@ -529,28 +667,28 @@ int decodeInteger64(bitstream_t* stream, int64_t* int64) {
 	}
 
 	return errn;
-}
-
-/**
- * Decode an arbitrary precision integer using a sign bit followed by a
- * sequence of octets. The most significant bit of the last octet is set to
- * zero to indicate sequence termination. Only seven bits per octet are used
- * to store the integer's value.
- */
-int decodeIntegerBig(bitstream_t* stream, int* negative, size_t size, uint8_t* data, size_t* len) {
-	int errn = decodeBoolean(stream, negative);
-
-	if (errn == 0) {
-		if (*negative) {
-			/* For negative values, the Unsigned Integer holds the
-			 * magnitude of the value minus 1 */
-		} else {
-			/* positive */
-		}
-		errn = decodeUnsignedIntegerBig(stream, size, data, len);
-	}
-
-	return errn;
+}
+
+/**
+ * Decode an arbitrary precision integer using a sign bit followed by a
+ * sequence of octets. The most significant bit of the last octet is set to
+ * zero to indicate sequence termination. Only seven bits per octet are used
+ * to store the integer's value.
+ */
+int decodeIntegerBig(bitstream_t* stream, int* negative, size_t size, uint8_t* data, size_t* len) {
+	int errn = decodeBoolean(stream, negative);
+
+	if (errn == 0) {
+		if (*negative) {
+			/* For negative values, the Unsigned Integer holds the
+			 * magnitude of the value minus 1 */
+		} else {
+			/* positive */
+		}
+		errn = decodeUnsignedIntegerBig(stream, size, data, len);
+	}
+
+	return errn;
 }
 
 /**
@@ -637,16 +775,16 @@ int decodeString(bitstream_t* stream, exi_string_t* s) {
  */
 int decodeCharacters(bitstream_t* stream, size_t len, exi_string_character_t* chars, size_t charsSize) {
 	unsigned int i;
-	int errn = 0;
-
-	unsigned int extraChar = 0;
-#if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
-	extraChar = 1; /* null terminator */
-#endif /* STRING_REPRESENTATION_ASCII */
-
-	if ( (len + extraChar) > charsSize) {
-		errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
-		return errn;
+	int errn = 0;
+
+	unsigned int extraChar = 0;
+#if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
+	extraChar = 1; /* null terminator */
+#endif /* STRING_REPRESENTATION_ASCII */
+
+	if ( (len + extraChar) > charsSize) {
+		errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
+		return errn;
 	}
 
 #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
@@ -679,15 +817,15 @@ int decodeRCSCharacters(bitstream_t* stream, size_t len, exi_string_character_t*
 	unsigned int i;
 	int errn = 0;
 	uint32_t uint32;
-	unsigned int extraChar = 0;
-#if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
-	uint8_t b;
-	extraChar = 1; /* null terminator */
-#endif /* STRING_REPRESENTATION_ASCII */
-
-	if ( (len + extraChar) > charsSize) {
-		errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
-		return errn;
+	unsigned int extraChar = 0;
+#if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
+	uint8_t b;
+	extraChar = 1; /* null terminator */
+#endif /* STRING_REPRESENTATION_ASCII */
+
+	if ( (len + extraChar) > charsSize) {
+		errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
+		return errn;
 	}