monotone

monotone Mtn Source Tree

Root/botan/der_code.cpp

1/*************************************************
2* DER Coding Source File *
3* (C) 1999-2005 The Botan Project *
4*************************************************/
5
6#include <botan/der_enc.h>
7
8namespace Botan {
9
10namespace DER {
11
12/*************************************************
13* Put some arbitrary bytes into a SEQUENCE *
14*************************************************/
15SecureVector<byte> put_in_sequence(const MemoryRegion<byte>& contents)
16 {
17 DER_Encoder encoder;
18 encoder.start_sequence();
19 encoder.add_raw_octets(contents);
20 encoder.end_sequence();
21 return encoder.get_contents();
22 }
23
24/*************************************************
25* DER encode NULL *
26*************************************************/
27void encode_null(DER_Encoder& encoder)
28 {
29 encoder.add_object(NULL_TAG, UNIVERSAL, 0, 0);
30 }
31
32/*************************************************
33* DER encode a BOOLEAN *
34*************************************************/
35void encode(DER_Encoder& encoder, bool is_true)
36 {
37 encode(encoder, is_true, BOOLEAN, UNIVERSAL);
38 }
39
40/*************************************************
41* DER encode a small INTEGER *
42*************************************************/
43void encode(DER_Encoder& encoder, u32bit n)
44 {
45 encode(encoder, BigInt(n), INTEGER, UNIVERSAL);
46 }
47
48/*************************************************
49* DER encode a small INTEGER *
50*************************************************/
51void encode(DER_Encoder& encoder, int n)
52 {
53 if(n < 0)
54 throw Invalid_Argument("DER::encode(int): n must be >= 0");
55 encode(encoder, BigInt(n), INTEGER, UNIVERSAL);
56 }
57
58/*************************************************
59* DER encode an INTEGER *
60*************************************************/
61void encode(DER_Encoder& encoder, const BigInt& n)
62 {
63 encode(encoder, n, INTEGER, UNIVERSAL);
64 }
65
66/*************************************************
67* DER encode an OCTET STRING or BIT STRING *
68*************************************************/
69void encode(DER_Encoder& encoder, const MemoryRegion<byte>& octets,
70 ASN1_Tag real_type)
71 {
72 encode(encoder, octets.begin(), octets.size(),
73 real_type, real_type, UNIVERSAL);
74 }
75
76/*************************************************
77* DER encode an OCTET STRING or BIT STRING *
78*************************************************/
79void encode(DER_Encoder& encoder, const byte octets[], u32bit length,
80 ASN1_Tag real_type)
81 {
82 encode(encoder, octets, length, real_type, real_type, UNIVERSAL);
83 }
84
85/*************************************************
86* DER encode a BOOLEAN *
87*************************************************/
88void encode(DER_Encoder& encoder, bool is_true,
89 ASN1_Tag type_tag, ASN1_Tag class_tag)
90 {
91 if(is_true)
92 encoder.add_object(type_tag, class_tag, 0xFF);
93 else
94 encoder.add_object(type_tag, class_tag, 0x00);
95 }
96
97/*************************************************
98* DER encode a small INTEGER *
99*************************************************/
100void encode(DER_Encoder& encoder, u32bit n,
101 ASN1_Tag type_tag, ASN1_Tag class_tag)
102 {
103 encode(encoder, BigInt(n), type_tag, class_tag);
104 }
105
106/*************************************************
107* DER encode a small INTEGER *
108*************************************************/
109void encode(DER_Encoder& encoder, int n,
110 ASN1_Tag type_tag, ASN1_Tag class_tag)
111 {
112 if(n < 0)
113 throw Invalid_Argument("DER::encode(int): n must be >= 0");
114 encode(encoder, BigInt(n), type_tag, class_tag);
115 }
116
117/*************************************************
118* DER encode an INTEGER *
119*************************************************/
120void encode(DER_Encoder& encoder, const BigInt& n,
121 ASN1_Tag type_tag, ASN1_Tag class_tag)
122 {
123 if(n == 0)
124 encoder.add_object(type_tag, class_tag, 0);
125 else
126 {
127 bool extra_zero = (n.bits() % 8 == 0);
128 SecureVector<byte> contents(extra_zero + n.bytes());
129 BigInt::encode(contents.begin() + extra_zero, n);
130 if(n < 0)
131 {
132 for(u32bit j = 0; j != contents.size(); j++)
133 contents[j] = ~contents[j];
134 for(u32bit j = contents.size(); j > 0; j--)
135 if(++contents[j-1])
136 break;
137 }
138 encoder.add_object(type_tag, class_tag, contents);
139 }
140 }
141
142/*************************************************
143* DER encode an OCTET STRING or BIT STRING *
144*************************************************/
145void encode(DER_Encoder& encoder, const MemoryRegion<byte>& octets,
146 ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag)
147 {
148 encode(encoder, octets.begin(), octets.size(),
149 real_type, type_tag, class_tag);
150 }
151
152/*************************************************
153* DER encode an OCTET STRING or BIT STRING *
154*************************************************/
155void encode(DER_Encoder& encoder, const byte octets[], u32bit length,
156 ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag)
157 {
158 if(real_type != OCTET_STRING && real_type != BIT_STRING)
159 throw Invalid_Argument("DER_Encoder: Invalid tag for byte/bit string");
160
161 if(real_type == OCTET_STRING)
162 encoder.add_object(type_tag, class_tag, octets, length);
163 else
164 {
165 SecureVector<byte> encoded;
166 encoded.append(0);
167 encoded.append(octets, length);
168 encoder.add_object(type_tag, class_tag, encoded);
169 }
170 }
171
172}
173
174}

Archive Download this file

Branches

Tags

Quick Links:     www.monotone.ca    -     Downloads    -     Documentation    -     Wiki    -     Code Forge    -     Build Status