aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/asn1/asn1.c
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2012-05-12 18:21:32 +0200
committerTobias Brunner <tobias@strongswan.org>2012-06-11 17:09:20 +0200
commit82e526ce81db15f92b81cd4ac925d740f3b4d753 (patch)
tree7623030132a482a5fac84b90e06d98d439fb5c9d /src/libstrongswan/asn1/asn1.c
parente8120632ae302fe1e12eeec9baf1a70d33456ca8 (diff)
downloadstrongswan-82e526ce81db15f92b81cd4ac925d740f3b4d753.tar.bz2
strongswan-82e526ce81db15f92b81cd4ac925d740f3b4d753.tar.xz
Properly encode 0 in ASN.1.
According to X.690 an INTEGER object always has at least one content octet.
Diffstat (limited to 'src/libstrongswan/asn1/asn1.c')
-rw-r--r--src/libstrongswan/asn1/asn1.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/libstrongswan/asn1/asn1.c b/src/libstrongswan/asn1/asn1.c
index 8adab8580..c9f6fce25 100644
--- a/src/libstrongswan/asn1/asn1.c
+++ b/src/libstrongswan/asn1/asn1.c
@@ -28,7 +28,7 @@
/**
* Commonly used ASN1 values.
*/
-const chunk_t ASN1_INTEGER_0 = chunk_from_chars(0x02, 0x00);
+const chunk_t ASN1_INTEGER_0 = chunk_from_chars(0x02, 0x01, 0x00);
const chunk_t ASN1_INTEGER_1 = chunk_from_chars(0x02, 0x01, 0x01);
const chunk_t ASN1_INTEGER_2 = chunk_from_chars(0x02, 0x01, 0x02);
@@ -761,16 +761,13 @@ chunk_t asn1_integer(const char *mode, chunk_t content)
size_t len;
u_char *pos;
- if (content.len == 0 || (content.len == 1 && *content.ptr == 0x00))
- {
- /* a zero ASN.1 integer does not have a value field */
- len = 0;
- }
- else
- {
- /* ASN.1 integers must be positive numbers in two's complement */
- len = content.len + ((*content.ptr & 0x80) ? 1 : 0);
+ if (content.len == 0)
+ { /* make sure 0 is encoded properly */
+ content = chunk_from_chars(0x00);
}
+
+ /* ASN.1 integers must be positive numbers in two's complement */
+ len = content.len + ((*content.ptr & 0x80) ? 1 : 0);
pos = asn1_build_object(&object, ASN1_INTEGER, len);
if (len > content.len)
{