110 İşlemeler 543162b701 ... 671f422a73

Yazar SHA1 Mesaj Tarih
  Martin-P 671f422a73 Merge SourceForge SVN repository, OpenV2G 0.9.5 3 yıl önce
  daniel_peintner 87591ab3b7 docs: fix copyright year 3 yıl önce
  daniel_peintner 100123c809 docs: update release notes for 0.9.5 3 yıl önce
  daniel_peintner 9bb3ff36d1 fix: possible memory corruption bug when parsing X509 serial numbers 3 yıl önce
  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 yıl önce
  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 yıl önce
  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 yıl önce
  daniel_peintner 912aa5f2db remove unnecessary characters variable 6 yıl önce
  daniel_peintner 06a3b436bf fix: set fixed size of big integer container 7 yıl önce
  daniel_peintner 033a46dd37 fix: add support for big integer (see X509SerialNumber in ISO1) 7 yıl önce
  daniel_peintner 247f4647cf get read for release 0.9.4 7 yıl önce
  daniel_peintner b47721107e fix eMAID fragment encoding/decoding (issue reported in https://sourceforge.net/p/openv2g/tickets/11/) 8 yıl önce
  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 yıl önce
  daniel_peintner e3d4b29932 adapt limits as suggested in https://sourceforge.net/p/openv2g/tickets/8/ for DIN and ISO2 also 8 yıl önce
  daniel_peintner 63b3a15000 fix V2GTP header length from 16 to 32 bits as suggested in https://sourceforge.net/p/openv2g/tickets/10/ 8 yıl önce
  daniel_peintner e3a6bb5abc adapt static array sizes and information as suggested in https://sourceforge.net/p/openv2g/tickets/8/ 8 yıl önce
  daniel_peintner 90976ee871 fix some more #define issues as reported in https://sourceforge.net/p/openv2g/tickets/7/ 8 yıl önce
  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 yıl önce
  daniel_peintner c6c656a9f7 fix issue with #defines pointing to wrong ISO version (ISO2 instead of ISO1) 8 yıl önce
  daniel_peintner 3fbc8ec397 fix issue https://sourceforge.net/p/openv2g/tickets/6/ 8 yıl önce
  daniel_peintner a671b75778 enum fix 8 yıl önce
  daniel_peintner 3d6ad81223 * restructure project to support multiple ISO versions 8 yıl önce
  daniel_peintner 9dde0a7b3d * initial check-in for 15118:2:2016 8 yıl önce
  daniel_peintner 6cef435279 fix for ticket, https://sourceforge.net/p/openv2g/tickets/4/ 10 yıl önce
  daniel_peintner c013f04b1e * get ready for version 0.9.3 10 yıl önce
  daniel_peintner c13885cbaf * get ready for release OpenV2G 0.9.2 11 yıl önce
  daniel_peintner de61f0e59c * get ready for release 0.9.1 11 yıl önce
  daniel_peintner 6ab917be66 * adds support for DIN 11 yıl önce
  daniel_peintner 9c2b711d55 * adds support for DIN 11 yıl önce
  daniel_peintner fafba1ecd0 * switch off pedantic warnings 11 yıl önce
  daniel_peintner c3dab49523 * get ready for release 0.9 11 yıl önce
  sebastiankb 7814569390 OpenV2G 0.8 11 yıl önce
  sebastiankb 85cb922c5a delete OpenV2G 0.7 11 yıl önce
  daniel_peintner 0933696169 12 yıl önce
  sebastiankb 7d969a0d4c update makefiles 13 yıl önce
  sebastiankb 4f6778feba update makefiles 13 yıl önce
  sebastiankb 71d00ba477 13 yıl önce
  sebastiankb c7365f25a1 13 yıl önce
  daniel_peintner 75c2627f62 13 yıl önce
  sebastiankb 97e9cc9f3b v2gv2gtp for 0.7 13 yıl önce
  sebastiankb 57ff27930c service files for 0.7 13 yıl önce
  sebastiankb 732d394324 OpenV2G 0.7 init 13 yıl önce
  sebastiankb c4fcca04a4 13 yıl önce
  sebastiankb a342317852 13 yıl önce
  sebastiankb 5f4543c0de 13 yıl önce
  sebastiankb cfdd726f75 13 yıl önce
  sebastiankb 99a33ccd91 main files 13 yıl önce
  daniel_peintner ddb210805a * last EXI codec fixes for release 13 yıl önce
  sebastiankb 38fde489ed init OpenV2G 0.6 public 13 yıl önce
  sebastiankb d3fe513ffc delete 0.6rc1 13 yıl önce
  daniel_peintner 37d784f56c 14 yıl önce
  daniel_peintner 5a9aae1694 14 yıl önce
  daniel_peintner 5dfebf8b48 14 yıl önce
  daniel_peintner 38ab77c7d2 14 yıl önce
  daniel_peintner e0a30233ba 14 yıl önce
  daniel_peintner 80b846a8b7 14 yıl önce
  daniel_peintner 5ec7db1987 14 yıl önce
  sebastiankb 31f84795e0 init the AppProtocolReq structure 14 yıl önce
  sebastiankb 4bb21254f9 14 yıl önce
  daniel_peintner e8ba2a611c * fixes name table entries issue 14 yıl önce
  sebastiankb 32078408b5 codec update 14 yıl önce
  sebastiankb c9210283c7 14 yıl önce
  sebastiankb d5f9a67a36 OOpenV2G 0.6 init2 14 yıl önce
  sebastiankb ff85c0c60d OpenV2G 0.6 init 14 yıl önce
  sebastiankb 3e7b97d740 delete 0.5 14 yıl önce
  sebastiankb 3d3a117445 14 yıl önce
  daniel_peintner 4e17bb8f29 * update EXI codec to latest given schema 14 yıl önce
  daniel_peintner 87d09c6ae5 * update EXI codec to latest given schema 14 yıl önce
  daniel_peintner 2b978cbcd2 * update EXI codec to latest given schema 14 yıl önce
  daniel_peintner 4e01b87700 * update EXI codec to latest given schema 14 yıl önce
  daniel_peintner 40a2516afe * update EXI codec to latest given schema 14 yıl önce
  sebastiankb 737e0a1141 14 yıl önce
  sebastiankb 9ab7ff6d40 14 yıl önce
  sebastiankb 6b4c83aa45 OpeOpenV2G 0.5 init 14 yıl önce
  sebastiankb 8849f662b5 delete old files (DoIP and main_service, main_service, etc) 14 yıl önce
  daniel_peintner 7799eeb24a * new exi and xml files according to latest XML Schema 14 yıl önce
  sebastiankb 098db4604e release 0.4 (DC charging) 14 yıl önce
  sebastiankb d9a8576ec0 0.3.1 release (DoIP) 15 yıl önce
  sebastiankb f17cd9c1b5 15 yıl önce
  sebastiankb 7f2adb89ed 0.3.1 release (test) 15 yıl önce
  sebastiankb 138bdd4ae6 15 yıl önce
  sebastiankb 19d0d4c9b4 0.3.1 release (V2G service) 15 yıl önce
  sebastiankb cbdba43af3 15 yıl önce
  sebastiankb 05301bf248 0.3.1 release (EXI codec) 15 yıl önce
  sebastiankb e1e0b55598 15 yıl önce
  sebastiankb 3b16a44a99 15 yıl önce
  sebastiankb be0560db7a 15 yıl önce
  sebastiankb 1f047aeb7f doip.h --> doIP.h in v2g_serviceClientDataTransmitter.c 15 yıl önce
  sebastiankb a7e1ab57dd doip files 15 yıl önce
  sebastiankb 12bd32bd8a 0.3 release zum testen 15 yıl önce
  mlauterbach 3e4a8426d8 - changed Tool Chain Editor from 'MinGW GCC' to 'Linux GCC' 15 yıl önce
  mlauterbach 350a915582 removed warnings: defined 1bit wide bitfields to 'unsigned int' 15 yıl önce
  sebastiankb fa292b984e ByteStream included 15 yıl önce
  sebastiankb 32f7bfd532 - version 0.2.3 or 0.3? 15 yıl önce
  sebastiankb 331e3ecbb1 - service 0.2.2 15 yıl önce
  daniel_peintner 69e25e0172 * improves EXI codec footprint 15 yıl önce
  sebastiankb a9e47e19ae - readme version changes 15 yıl önce
  sebastiankb 164bc87bbd - tag release 0.2.1 15 yıl önce
  sebastiankb f4b76996a2 - changed .cproject to release compile mode 15 yıl önce
  sebastiankb 6f93ebba75 15 yıl önce
  sebastiankb d666c476c1 - include loop handling in serialization and datatype init 15 yıl önce
  daniel_peintner 69ef78539d * adds service (server & client) 15 yıl önce
  sebastiankb 102e607847 readme to 0.2 15 yıl önce
  sebastiankb 4e1d48bb78 versionierung im codec auf 0.2 15 yıl önce
  sebastiankb b132e921e5 - service implementation 15 yıl önce
  daniel_peintner 7289406799 * split EXI Header in decoder and encoder part 15 yıl önce
  daniel_peintner e42f201089 * eliminates remaining -ansic -pedantic warnings 15 yıl önce
  daniel_peintner 8f499da64a * adds README.txt 15 yıl önce
  daniel_peintner 9a9835ad3d * first code check-in (support for EXI stream) 15 yıl önce
  daniel_peintner 5f032498c0 * setup initial SVN structure 15 yıl önce
2 değiştirilmiş dosya ile 390 ekleme ve 248 silme
  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;
 	}