List Info

Thread: svn opensc changed Added support for MuscleCard applet.




svn opensc changed Added support for MuscleCard applet.
user name
2006-06-20 06:24:31
Hello,

On 20/06/06, Andreas Jellinghaus <ajdungeon.inka.de> wrote:
> hmm, I don't know how the code looks right now or
would look after your
> change. but I'd prefer to have the code without #ifdef
and then have
> some define macro or function (maybe inline?) swap
bytes around (or not).
> i.e. make the code easy to read and only have the
macro/function look
> at the endian of the architecture.

I agree.

> also I wonder if there are no functions we can use.
endian problems are
> not new, for example the whole network code has this
host to network
> conversions etc, so I wonder.

Yes. The network code can use
  #include <arpa/inet.h>
  uint32_t htonl(uint32_t hostlong);
  uint16_t htons(uint16_t hostshort);
  uint32_t ntohl(uint32_t netlong);
  uint16_t ntohs(uint16_t netshort);

Also according to the manpage: "On the i80x86 the host
byte order  is
Least  Significant  Byte  first, whereas  the  network byte
order, as
used on the Internet, is Most Significant Byte first."

So the byte order is swapped on a i386 host. But I needed
the reverse
in my CCID code (do not swap on i386 but swap on PowerPC)

According to the code in Stef' mail it should be possible
to replace
  if (BIG_ENDIAN)
     x = bswap_32(x);
by
  x = htonl(x);

Bye,

-- 
  Dr. Ludovic Rousseau
_______________________________________________
opensc-devel mailing list
opensc-devellists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc
-devel
svn opensc changed Added support for MuscleCard applet.
user name
2006-06-24 20:57:37
Hi,

yes, getting rid of the endian #defines is one thing.

But the edian things are only used for converting an
unsigned long into a 4-byte array in big-endian notation
and vice versa (+ idem for unsigned shorts) in the
following way:
    - swap unsigned long if needed
    - memcpy(byte array, &(the unsigned long), 4)

It's nicer/simpler to make a function that does both,
pls. see the attached patch.

Cheers,
Stef

Ludovic Rousseau wrote:

> Hello,
>
> On 20/06/06, Andreas Jellinghaus <ajdungeon.inka.de> wrote:
>
>> hmm, I don't know how the code looks right now or
would look after your
>> change. but I'd prefer to have the code without
#ifdef and then have
>> some define macro or function (maybe inline?) swap
bytes around (or 
>> not).
>> i.e. make the code easy to read and only have the
macro/function look
>> at the endian of the architecture.
>
>
> I agree.
>
>> also I wonder if there are no functions we can use.
endian problems are
>> not new, for example the whole network code has
this host to network
>> conversions etc, so I wonder.
>
>
> Yes. The network code can use
>  #include <arpa/inet.h>
>  uint32_t htonl(uint32_t hostlong);
>  uint16_t htons(uint16_t hostshort);
>  uint32_t ntohl(uint32_t netlong);
>  uint16_t ntohs(uint16_t netshort);
>
> Also according to the manpage: "On the i80x86 the
host byte order  is
> Least  Significant  Byte  first, whereas  the  network
byte order, as
> used on the Internet, is Most Significant Byte
first."
>
> So the byte order is swapped on a i386 host. But I
needed the reverse
> in my CCID code (do not swap on i386 but swap on
PowerPC)
>
> According to the code in Stef' mail it should be
possible to replace
>  if (BIG_ENDIAN)
>     x = bswap_32(x);
> by
>  x = htonl(x);
>
> Bye,
>

Index: sc.c
============================================================
=======
--- sc.c	(revision 2977)
+++ sc.c	(working copy)
 -110,6
+110,32 
 	return 0;
 }
 
+void ulong2bebytes(u8 *buf, unsigned long x)
+{
+    buf[3] = (u8) (x % 256);
+    x /= 256;
+    buf[2] = (u8) (x % 256);
+    x /= 256;
+    buf[1] = (u8) (x % 256);
+    buf[0] = (u8) (x / 256);
+}
+
+void ushort2bebytes(u8 *buf, unsigned short x)
+{
+    buf[1] = (u8) (x % 256);
+    buf[0] = (u8) (x / 256);
+}
+
+unsigned long bebytes2ulong(const u8 *buf)
+{
+    return (unsigned long) (256 * (256 * (256 * buf[0] +
buf[1]) + buf[2]) + buf[3]);
+}
+
+unsigned short bebytes2ushort(const u8 *buf)
+{
+    return (unsigned short) (256 * buf[0] + buf[1]);
+}
+
 int sc_format_oid(struct sc_object_id *oid, const char *in)
 {
 	int ii, ret = SC_ERROR_INVALID_ARGUMENTS;
Index: muscle.c
============================================================
=======
--- muscle.c	(revision 2977)
+++ muscle.c	(working copy)
 -41,27
+41,6 
 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
 #endif
 
-#if defined(_WIN32) || defined(_WIN64)
-static unsigned long bswap_32(unsigned long x)
-{
-    unsigned long res = x % 256;
-    x /= 256;
-    res = 256 * res + x % 256;
-    x /= 256;
-    res = 256 * res + x % 256;
-    x /= 256;
-    return 256 * res + x % 256;
-}
-static unsigned short bswap_16(unsigned short x)
-{
-    return 256 * (x % 256) + (x / 256);
-}
-#define BIG_ENDIAN 1
-#else
-#include <endian.h>
-#include <byteswap.h>
-#endif
-
 int msc_list_objects(sc_card_t* card, u8 next,
mscfs_file_t* file) {
 	sc_apdu_t apdu;
 	u8 fileData[14];
 -89,17
+68,11 
 		return SC_ERROR_UNKNOWN_DATA_RECEIVED;
 	}
 	memcpy(file->objectId, fileData, 4);
-	file->size = *(int*)(fileData + 4);
-	file->read = *(short*)(fileData + 8);
-	file->write = *(short*)(fileData + 10);
-	file->delete = *(short*)(fileData + 12);
-	
-	if(BIG_ENDIAN) {
-		file->size = bswap_32(file->size);
-		file->read = bswap_16(file->read);
-		file->write = bswap_16(file->write);
-		file->delete = bswap_16(file->delete);
-	}
+	file->size = bebytes2ulong(fileData + 4);
+	file->read = bebytes2ushort(fileData + 8);
+	file->write = bebytes2ushort(fileData + 10);
+	file->delete = bebytes2ushort(fileData + 12);
+
 	return 1;
 }
 
 -108,16
+81,13 
 	u8 buffer[9];
 	sc_apdu_t apdu;
 	int r;
-	unsigned int le_offset = offset;
 	
 	sc_format_apdu(card, &apdu, SC_APDU_CASE_4_SHORT,
0x56, 0x00, 0x00);
 	
-	if(BIG_ENDIAN)
-		le_offset = bswap_32(le_offset);
 	if (card->ctx->debug >= 2)
-		sc_debug(card->ctx, "READ: Offset: %x\tLength:
%i\n", le_offset, dataLength);
-	memcpy(buffer, &le_objectId, 4);
-	memcpy(buffer + 4, &le_offset, 4);
+		sc_debug(card->ctx, "READ: Offset: %x\tLength:
%i\n", offset, dataLength);
+	ulong2bebytes(buffer, le_objectId);
+	ulong2bebytes(buffer + 4, offset);
 	buffer[8] = (u8)dataLength;
 	apdu.data = buffer;
 	apdu.datalen = 9;
 -182,21
+152,15 
 	apdu.data = buffer,
 	apdu.datalen = 14;
 	
-	if(BIG_ENDIAN) {
-		objectSize = bswap_32(objectSize);
-		readAcl = bswap_16(readAcl);
-		writeAcl = bswap_16(writeAcl);
-		deleteAcl = bswap_16(deleteAcl);
-	}
-	memcpy(buffer, &objectId, 4);
-	memcpy(buffer + 4, &objectSize, 4);
-	memcpy(buffer + 8, &readAcl, 2);
-	memcpy(buffer + 10, &writeAcl, 2);
-	memcpy(buffer + 12, &deleteAcl, 2);
+	ulong2bebytes(buffer, objectId);
+	ulong2bebytes(buffer + 4, objectSize);
+	ushort2bebytes(buffer + 8, readAcl);
+	ushort2bebytes(buffer + 10, writeAcl);
+	ushort2bebytes(buffer + 12, deleteAcl);
 	r = sc_transmit_apdu(card, &apdu);
 	SC_TEST_RET(card->ctx, r, "APDU transmit
failed");
 	if(apdu.sw1 == 0x90 && apdu.sw2 == 0x00)
-		return BIG_ENDIAN ? bswap_32(objectSize) : objectSize;
+		return objectSize;
 	if(apdu.sw1 == 0x9C) {
 		if(apdu.sw2 == 0x01) {
 			SC_FUNC_RETURN(card->ctx, 2,
SC_ERROR_MEMORY_FAILURE);
 -210,8
+174,8 
 		sc_debug(card->ctx, "got strange SWs: 0x%02X
0x%02X\n",
 		     apdu.sw1, apdu.sw2);
 	}
-	msc_zero_object(card, objectId, BIG_ENDIAN ?
bswap_32(objectSize) : objectSize);
-	return BIG_ENDIAN ? bswap_32(objectSize) : objectSize;
+	msc_zero_object(card, objectId, objectSize);
+	return objectSize;
 }
 
 /* Update up to 246 bytes */
 -219,18
+183,14 
 {
 	u8 buffer[256];
 	sc_apdu_t apdu;
-	unsigned int le_offset;
 	int r;
 
 	sc_format_apdu(card, &apdu, SC_APDU_CASE_3_SHORT,
0x54, 0x00, 0x00);
 	apdu.lc = dataLength + 9;
-	le_offset = offset;
-	if(BIG_ENDIAN)
-		le_offset = bswap_32(le_offset);
 	if (card->ctx->debug >= 2)
-		sc_debug(card->ctx, "WRITE: Offset: %x\tLength:
%i\n", le_offset, dataLength);
-	memcpy(buffer, &le_objectId, 4);
-	memcpy(buffer + 4, &le_offset, 4);
+		sc_debug(card->ctx, "WRITE: Offset: %x\tLength:
%i\n", offset, dataLength);
+	ulong2bebytes(buffer, le_objectId);
+	ulong2bebytes(buffer + 4, offset);
 	buffer[8] = (u8)dataLength;
 	memcpy(buffer + 9, data, dataLength);
 	apdu.data = buffer;
 -270,11
+230,13 
 int msc_delete_object(sc_card_t *card, unsigned int
objectId, int zero)
 {
 	sc_apdu_t apdu;
+	u8 buf[4];
 	int r;
 
 	sc_format_apdu(card, &apdu, SC_APDU_CASE_3_SHORT,
0x52, 0x00, zero ? 0x01 : 0x00);
 	apdu.lc = 4;
-	apdu.data = (u8*)&objectId;
+	ulong2bebytes(buf, objectId);
+	apdu.data = buf;
 	apdu.datalen = 4;
 	r = sc_transmit_apdu(card, &apdu);
 	SC_TEST_RET(card->ctx, r, "APDU transmit
failed");
 -434,8
+396,6 
 {
 	sc_apdu_t apdu;
 	int r, location, cse, len;
-	short dataLength_le = dataLength;
-	short seedLength_le = seedLength;
 	u8 *buffer, *ptr;
 	
 	location = (dataLength < 255) ? 1 : 2; /* 1 == APDU, 2
== (seed in 0xFFFFFFFE, out in 0xFFFFFFFF) */
 -444,17
+404,13 
 
 	assert(seedLength < 251);
 	assert(dataLength < 255); /* Output buffer doesn't
seem to operate as desired.... nobody can read/delete */
-	if(BIG_ENDIAN) {
-		dataLength_le = bswap_16(dataLength_le);
-		seedLength_le = bswap_16(seedLength_le);
-	}
 	
 	buffer = malloc(len);
 	if(!buffer) SC_FUNC_RETURN(card->ctx, 0,
SC_ERROR_OUT_OF_MEMORY);
 	ptr = buffer;
-	memcpy(ptr, &dataLength_le, 2);
+	ushort2bebytes(ptr, dataLength);
 	ptr+=2;
-	memcpy(ptr, &seedLength_le, 2);
+	ushort2bebytes(ptr, seedLength);
 	ptr+=2;
 	if(seedLength > 0) {
 		memcpy(ptr, seedData, seedLength);
 -524,32
+480,24 
 	assert(privateKey <= 0x0F && publicKey <=
0x0F);
 	
 	sc_format_apdu(card, &apdu, SC_APDU_CASE_3_SHORT,
0x30, privateKey, publicKey);
-	if(BIG_ENDIAN) {
-		keySize = bswap_16(keySize);
-		prRead = bswap_16(prRead);
-		prWrite = bswap_16(prWrite);
-		prCompute = bswap_16(prCompute);
-		puRead = bswap_16(puRead);
-		puWrite = bswap_16(puWrite);
-		puCompute = bswap_16(puCompute);
-	}
+
 	*ptr = algorithm; ptr++;
 	
-	memcpy(ptr, &keySize, 2);
+	ushort2bebytes(ptr, keySize);
 	ptr+=2;
 	
-	memcpy(ptr, &prRead, 2);
+	ushort2bebytes(ptr, prRead);
 	ptr+=2;
-	memcpy(ptr, &prWrite, 2);
+	ushort2bebytes(ptr, prWrite);
 	ptr+=2;
-	memcpy(ptr, &prCompute, 2);
+	ushort2bebytes(ptr, prCompute);
 	ptr+=2;
 	
-	memcpy(ptr, &puRead, 2);
+	ushort2bebytes(ptr, puRead);
 	ptr+=2;
-	memcpy(ptr, &puWrite, 2);
+	ushort2bebytes(ptr, puWrite);
 	ptr+=2;
-	memcpy(ptr, &puCompute, 2);
+	ushort2bebytes(ptr, puCompute);
 	ptr+=2;
 	
 	*ptr = 0; /* options; -- no options for now, they need
extra data */
 -870,8
+818,7 
 
 /* USED IN KEY ITEM WRITING */
 #define CPYVAL(valName) \
-	length = BIG_ENDIAN ? bswap_16(data->valName ## Length)
: data->valName ## Length; \
-	memcpy(p, &length, 2); p+= 2; \
+	ushort2bebytes(p, data->valName ## Length); p+= 2; \
 	memcpy(p, data->valName ## Value, data->valName ##
Length); p+= data->valName ## Length
 
 int msc_import_key(sc_card_t *card,
 -905,13
+852,6 
 		SC_FUNC_RETURN(card->ctx, 2,
SC_ERROR_INVALID_ARGUMENTS)
 	}
 	
-	if(BIG_ENDIAN) {
-		read = bswap_16(read);
-		write = bswap_16(write);
-		use = bswap_16(use);
-		keySize = bswap_16(keySize);
-	}
-	
 	if(data->keyType == 0x02) {
 		bufferSize = 4 + 4 + data->pLength +
data->modLength;
 	} else if(data->keyType == 0x03) {
 -924,14
+864,12 
 	p = buffer;
 	*p = 0x00; p++; /* Encoding plain */
 	*p = data->keyType; p++; /* RSA_PRIVATE */
-	memcpy(p, &keySize, 2); p+=2; /* key size */
+	ushort2bebytes(p, keySize); p+=2; /* key size */
 	
 	if(data->keyType == 0x02) {
-		unsigned int length;
 		CPYVAL(mod);
 		CPYVAL(p);
 	} else if(data->keyType == 0x03) {
-		unsigned int length;
 		CPYVAL(p);
 		CPYVAL(q);
 		CPYVAL(pq);
 -939,9
+877,7 
 		CPYVAL(dq1);
 	}
 	objectId = 0xFFFFFFFEul;
-	if(BIG_ENDIAN) {
-		objectId = bswap_32(objectId);
-	}
+
 	r = msc_create_object(card, objectId, bufferSize, 0x02,
0x02, 0x02);
 	if(r < 0) { 
 		if(r == SC_ERROR_FILE_ALREADY_EXISTS) {
 -967,9
+903,9 
 	apdu.data = apduBuffer;
 	apdu.datalen = 6;
 	p = apduBuffer;
-	memcpy(p, &read, 2); p+=2;
-	memcpy(p, &write, 2); p+=2;
-	memcpy(p, &use, 2); p+=2;	
+	ushort2bebytes(p, read); p+=2;
+	ushort2bebytes(p, write); p+=2;
+	ushort2bebytes(p, use); p+=2;	
 	r = sc_transmit_apdu(card, &apdu);
 	SC_TEST_RET(card->ctx, r, "APDU transmit
failed");
 	if(apdu.sw1 == 0x90 && apdu.sw2 == 0x00) {
Index: card-muscle.c
============================================================
=======
--- card-muscle.c	(revision 2977)
+++ card-muscle.c	(working copy)
 -137,7
+137,7 
 	objectSize = file->size;
 	
 	muscle_parse_acls(file, &read, &write,
&delete);
-	r = msc_create_object(card, *(int*)objectId, objectSize,
read, write, delete);
+	r = msc_create_object(card, bebytes2ulong(objectId),
objectSize, read, write, delete);
 	mscfs_clear_cache(fs);
 	if(r >= 0) return 0;
 	return r;
 -183,7
+183,7 
 		objectId[1] = objectId[3];
 		objectId[2] = objectId[3] = 0;
 	}
-	r = msc_read_object(card, *(int*)objectId, index, buf,
count);
+	r = msc_read_object(card, bebytes2ulong(objectId), index,
buf, count);
 	SC_FUNC_RETURN(card->ctx, 0, r);
 }
 
 -209,22
+209,22 
 		u8* buffer = malloc(newFileSize);
 		if(buffer == NULL) SC_FUNC_RETURN(card->ctx, 0,
SC_ERROR_OUT_OF_MEMORY);
 		
-		r = msc_read_object(card, *(int*)objectId, 0, buffer,
file->size);
+		r = msc_read_object(card, bebytes2ulong(objectId), 0,
buffer, file->size);
 		/* TODO: RETREIVE ACLS */
 		if(r < 0) goto update_bin_free_buffer;
-		r = msc_delete_object(card, *(int*)objectId, 0);
+		r = msc_delete_object(card, bebytes2ulong(objectId), 0);
 		if(r < 0) goto update_bin_free_buffer;
-		r = msc_create_object(card, *(int*)objectId, newFileSize,
0,0,0);
+		r = msc_create_object(card, bebytes2ulong(objectId),
newFileSize, 0,0,0);
 		if(r < 0) goto update_bin_free_buffer;
 		memcpy(buffer + index, buf, count); 
-		r = msc_update_object(card, *(int*)objectId, 0, buffer,
newFileSize);
+		r = msc_update_object(card, bebytes2ulong(objectId), 0,
buffer, newFileSize);
 		if(r < 0) goto update_bin_free_buffer;
 		file->size = newFileSize;
 update_bin_free_buffer:
 		free(buffer);
 		SC_FUNC_RETURN(card->ctx, 0, r);
 	} else {
-		r = msc_update_object(card, *(int*)objectId, index, buf,
count);
+		r = msc_update_object(card, bebytes2ulong(objectId),
index, buf, count);
 	}
 	//mscfs_clear_cache(fs);
 	return r;
 -234,7
+234,7 
 {
 	mscfs_t *fs = MUSCLE_FS(card);
 	u8 *id = file_data->objectId;
-	int objectId = *(int*)id;
+	int objectId = bebytes2ulong(id);
 	int r;
 
 	if(!file_data->ef) {
Index: muscle-filesystem.h
============================================================
=======
--- muscle-filesystem.h	(revision 2977)
+++ muscle-filesystem.h	(working copy)
 -63,5
+63,4 
 int mscfs_check_selection(mscfs_t *fs, int requiredItem);
 int mscfs_loadFileInfo(mscfs_t* fs, const u8 *path, int
pathlen, mscfs_file_t **file_data, int* index);
 
-
 #endif
Index: opensc.h
============================================================
=======
--- opensc.h	(revision 2977)
+++ opensc.h	(working copy)
 -1081,6
+1081,16 
 
 int sc_hex_to_bin(const char *in, u8 *out, size_t *outlen);
 int sc_bin_to_hex(const u8 *, size_t, char *, size_t, int
separator);
+
+/* unsigned long -> 4 bytes in big endian order */
+void ulong2bebytes(u8 *buf, unsigned long x);
+/* unsigned short -> 2 bytes in big endian order */
+void ushort2bebytes(u8 *buf, unsigned short x);
+/* 4 bytes in big endian order -> unsigned long */
+unsigned long bebytes2ulong(const u8 *buf);
+/* 2 bytes in big endian order -> unsigned long */
+unsigned short bebytes2ushort(const u8 *buf);
+
 scconf_block *sc_get_conf_block(sc_context_t *ctx, const
char *name1, const char *name2, int priority);
 /**
  * Converts a given OID in ascii form to a internal
sc_object_id object
_______________________________________________
opensc-devel mailing list
opensc-devellists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc
-devel
svn opensc changed Added support for MuscleCard applet.
user name
2006-06-25 12:01:09
Hi Stef,

I didn't really follow this thread but ...

Stef Hoeben wrote:
> Hi,
> 
> yes, getting rid of the endian #defines is one thing.
> 
> But the edian things are only used for converting an
> unsigned long into a 4-byte array in big-endian
notation
> and vice versa (+ idem for unsigned shorts) in the
> following way:
>    - swap unsigned long if needed
>    - memcpy(byte array, &(the unsigned long), 4)
> 
> It's nicer/simpler to make a function that does both,
> pls. see the attached patch.
...
> Index: sc.c
>
============================================================
=======
> --- sc.c	(revision 2977)
> +++ sc.c	(working copy)
>  -110,6 +110,32 
>  	return 0;
>  }
>  
> +void ulong2bebytes(u8 *buf, unsigned long x)
> +{
> +    buf[3] = (u8) (x % 256);
> +    x /= 256;
> +    buf[2] = (u8) (x % 256);
> +    x /= 256;
> +    buf[1] = (u8) (x % 256);
> +    buf[0] = (u8) (x / 256);
> +}

I would prefer

#define ULONG2BEBYTES(p, x)	do {\
	(p)[3] = (x) & 0xff;\
	(p)[2] = ((x) >> 8)  & 0xff;\
	(p)[1] = ((x) >> 16) & 0xff;\
	(p)[0] = ((x) >> 24) & 0xff;\
} while(0)

instead of defining function for this.

> +
> +void ushort2bebytes(u8 *buf, unsigned short x)
> +{
> +    buf[1] = (u8) (x % 256);
> +    buf[0] = (u8) (x / 256);
> +}

and mutatis mutandis

#define USHORT2BEBYTES(p, x)	do {\
	(p)[1] = (x) & 0xff;\
	(p)[0] = ((x) >> 8) & 0xff;\
} while(0)

> +
> +unsigned long bebytes2ulong(const u8 *buf)
> +{
> +    return (unsigned long) (256 * (256 * (256 * buf[0]
+ buf[1]) + buf[2]) + buf[3]);
> +}

#define BEBYTE2ULONG(p, x)	do {\
	(x) = (p)[0] << 24 | (p)[1] << 16 | (p)[2]
<< 8 | (p)[3];\
} while(0)

> +
> +unsigned short bebytes2ushort(const u8 *buf)
> +{
> +    return (unsigned short) (256 * buf[0] + buf[1]);
> +}
> +

#define BEBYTE2USHORT(p, x)	do {\
	(x) = (p)[0] << 8 | (p)[1];\
} while(0)

>  int sc_format_oid(struct sc_object_id *oid, const char
*in)
>  {
>  	int ii, ret = SC_ERROR_INVALID_ARGUMENTS;

> Index: opensc.h
>
============================================================
=======
> --- opensc.h	(revision 2977)
> +++ opensc.h	(working copy)
>  -1081,6 +1081,16 
>  
>  int sc_hex_to_bin(const char *in, u8 *out, size_t
*outlen);
>  int sc_bin_to_hex(const u8 *, size_t, char *, size_t,
int separator);
> +
> +/* unsigned long -> 4 bytes in big endian order */
> +void ulong2bebytes(u8 *buf, unsigned long x);
> +/* unsigned short -> 2 bytes in big endian order */
> +void ushort2bebytes(u8 *buf, unsigned short x);
> +/* 4 bytes in big endian order -> unsigned long */
> +unsigned long bebytes2ulong(const u8 *buf);
> +/* 2 bytes in big endian order -> unsigned long */
> +unsigned short bebytes2ushort(const u8 *buf);
> +
>  scconf_block *sc_get_conf_block(sc_context_t *ctx,
const char *name1, const char *name2, int priority);
>  /**
>   * Converts a given OID in ascii form to a internal
sc_object_id object

as this are ancillary functions they should be better placed
in
an internal header file.

Cheers,
Nils
_______________________________________________
opensc-devel mailing list
opensc-devellists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc
-devel
svn opensc changed Added support for MuscleCard applet.
user name
2006-06-25 19:23:02
Hi,

>> +void ulong2bebytes(u8 *buf, unsigned long x)
>> +{
>> +    buf[3] = (u8) (x % 256);
>> +    x /= 256;
>> +    buf[2] = (u8) (x % 256);
>> +    x /= 256;
>> +    buf[1] = (u8) (x % 256);
>> +    buf[0] = (u8) (x / 256);
>> +}
>
>
> I would prefer
>
> #define ULONG2BEBYTES(p, x)    do {\
>     (p)[3] = (x) & 0xff;\
>     (p)[2] = ((x) >> 8)  & 0xff;\
>     (p)[1] = ((x) >> 16) & 0xff;\
>     (p)[0] = ((x) >> 24) & 0xff;\
> } while(0)
>
> instead of defining function for this. 

Macros might be somewhat more dangerous in this case,
e.g. someone calling ULONG2BEBYTES(buf++, 12345) ,
but it's fine for me to change it into a macro.

> as this are ancillary functions they should be better
placed in
> an internal header file.

Okay, so in internal.h

Cheers,
Stef

_______________________________________________
opensc-devel mailing list
opensc-devellists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc
-devel
svn opensc changed Added support for MuscleCard applet.
user name
2006-06-25 20:00:20
Nils Larsch wrote:
> instead of defining function for this.

I wonder: why? to make the code smaller / faster?
the function could be inlined.

declaring the function in an internal header file (i.e. not
opensc.h)
is a good idea I agree.

Regards, Andreas
_______________________________________________
opensc-devel mailing list
opensc-devellists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc
-devel
svn opensc changed Added support for MuscleCard applet.
user name
2006-06-26 09:11:18
Stef Hoeben wrote:
> Hi,
> 
>>> +void ulong2bebytes(u8 *buf, unsigned long x)
>>> +{
>>> +    buf[3] = (u8) (x % 256);
>>> +    x /= 256;
>>> +    buf[2] = (u8) (x % 256);
>>> +    x /= 256;
>>> +    buf[1] = (u8) (x % 256);
>>> +    buf[0] = (u8) (x / 256);
>>> +}
>>
>>
>> I would prefer
>>
>> #define ULONG2BEBYTES(p, x)    do {\
>>     (p)[3] = (x) & 0xff;\
>>     (p)[2] = ((x) >> 8)  & 0xff;\
>>     (p)[1] = ((x) >> 16) & 0xff;\
>>     (p)[0] = ((x) >> 24) & 0xff;\
>> } while(0)
>>
>> instead of defining function for this. 
> 
> Macros might be somewhat more dangerous in this case,
> e.g. someone calling ULONG2BEBYTES(buf++, 12345) ,
> but it's fine for me to change it into a macro.

forget it, a function is fine here. Btw: I would still
prefer
a version using shifts and masks (as done in the macros) as
I
personally find it easier to understand what the function is
actually doing (but that's just my personal taste).

Cheers,
Nils

PS: doxygen comments would be nice (even for internal
functions) 

_______________________________________________
opensc-devel mailing list
opensc-devellists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc
-devel
svn opensc changed Added support for MuscleCard applet.
user name
2006-06-27 17:56:21
Nils Larsch wrote:

> Stef Hoeben wrote:
>
>> Hi,
>>
>>>> +void ulong2bebytes(u8 *buf, unsigned long
x)
>>>> +{
>>>> +    buf[3] = (u8) (x % 256);
>>>> +    x /= 256;
>>>> +    buf[2] = (u8) (x % 256);
>>>> +    x /= 256;
>>>> +    buf[1] = (u8) (x % 256);
>>>> +    buf[0] = (u8) (x / 256);
>>>> +}
>>>
>>>
>>>
>>> I would prefer
>>>
>>> #define ULONG2BEBYTES(p, x)    do {\
>>>     (p)[3] = (x) & 0xff;\
>>>     (p)[2] = ((x) >> 8)  & 0xff;\
>>>     (p)[1] = ((x) >> 16) & 0xff;\
>>>     (p)[0] = ((x) >> 24) & 0xff;\
>>> } while(0)
>>>
>>> instead of defining function for this. 
>>
>>
>> Macros might be somewhat more dangerous in this
case,
>> e.g. someone calling ULONG2BEBYTES(buf++, 12345) ,
>> but it's fine for me to change it into a macro.
>
>
> forget it, a function is fine here. Btw: I would still
prefer
> a version using shifts and masks (as done in the
macros) as I
> personally find it easier to understand what the
function is
> actually doing (but that's just my personal taste).
>
> Cheers,
> Nils
>
> PS: doxygen comments would be nice (even for internal
functions) 
>
Okay, done.

Greetz,
Stef
_______________________________________________
opensc-devel mailing list
opensc-devellists.opensc-project.org
http://www.opensc-project.org/mailman/listinfo/opensc
-devel
[1-7]

about | contact  Other archives ( Real Estate discussion Medical topics )