[Redbutton-devel] SF.net SVN: redbutton: [394] redbutton-author/trunk/der_encode.c
Brought to you by:
skilvington
|
From: <ski...@us...> - 2007-09-18 12:55:38
|
Revision: 394
http://redbutton.svn.sourceforge.net/redbutton/?rev=394&view=rev
Author: skilvington
Date: 2007-09-18 05:55:32 -0700 (Tue, 18 Sep 2007)
Log Message:
-----------
DER encode +ve INTEGERs
Modified Paths:
--------------
redbutton-author/trunk/der_encode.c
Modified: redbutton-author/trunk/der_encode.c
===================================================================
--- redbutton-author/trunk/der_encode.c 2007-09-18 12:36:39 UTC (rev 393)
+++ redbutton-author/trunk/der_encode.c 2007-09-18 12:55:32 UTC (rev 394)
@@ -22,10 +22,37 @@
void
der_encode_INTEGER(unsigned char **out, unsigned int *len, int val)
{
+ unsigned int shifted;
+ unsigned int i;
+
/* assert */
if(*out != NULL || *len != 0)
fatal("der_encode_INTEGER: length already %u", *len);
+ /*
+ * work out how many bytes we need to store 'val'
+ * ints in DER are signed, so first byte we store must be <= 127
+ * we add a leading 0 if first byte is > 127
+ */
+ if(val >= 0)
+ {
+ shifted = val;
+ (*len) = 1;
+ while(shifted > 127)
+ {
+ (*len) ++;
+ shifted >>= 8;
+ }
+ *out = safe_malloc(*len);
+ /* big endian */
+ for(i=1; i<=(*len); i++)
+ (*out)[i - 1] = (val >> (((*len) - i) * 8)) & 0xff;
+ }
+ else
+ {
+fatal("TODO: negative INTEGER: %d", val);
+ }
+
return;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|