diff options
author | beck <> | 2000-03-19 11:13:58 +0000 |
---|---|---|
committer | beck <> | 2000-03-19 11:13:58 +0000 |
commit | 796d609550df3a33fc11468741c5d2f6d3df4c11 (patch) | |
tree | 6c6d539061caa20372dad0ac4ddb1dfae2fbe7fe /src/lib/libcrypto/asn1/a_utf8.c | |
parent | 5be3114c1fd7e0dfea1e38d3abb4cbba75244419 (diff) | |
download | openbsd-796d609550df3a33fc11468741c5d2f6d3df4c11.tar.gz openbsd-796d609550df3a33fc11468741c5d2f6d3df4c11.tar.bz2 openbsd-796d609550df3a33fc11468741c5d2f6d3df4c11.zip |
OpenSSL 0.9.5 merge
*warning* this bumps shared lib minors for libssl and libcrypto from 2.1 to 2.2
if you are using the ssl26 packages for ssh and other things to work you will
need to get new ones (see ~beck/libsslsnap/<arch>) on cvs or ~beck/src-patent.tar.gz on cvs
Diffstat (limited to 'src/lib/libcrypto/asn1/a_utf8.c')
-rw-r--r-- | src/lib/libcrypto/asn1/a_utf8.c | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/lib/libcrypto/asn1/a_utf8.c b/src/lib/libcrypto/asn1/a_utf8.c index 4a8a92e9e4..b5125af224 100644 --- a/src/lib/libcrypto/asn1/a_utf8.c +++ b/src/lib/libcrypto/asn1/a_utf8.c | |||
@@ -60,6 +60,12 @@ | |||
60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
61 | #include <openssl/asn1.h> | 61 | #include <openssl/asn1.h> |
62 | 62 | ||
63 | ASN1_UTF8STRING *ASN1_UTF8STRING_new(void) | ||
64 | { return M_ASN1_UTF8STRING_new();} | ||
65 | |||
66 | void ASN1_UTF8STRING_free(ASN1_UTF8STRING *x) | ||
67 | { M_ASN1_UTF8STRING_free(x);} | ||
68 | |||
63 | int i2d_ASN1_UTF8STRING(ASN1_UTF8STRING *a, unsigned char **pp) | 69 | int i2d_ASN1_UTF8STRING(ASN1_UTF8STRING *a, unsigned char **pp) |
64 | { | 70 | { |
65 | return(i2d_ASN1_bytes((ASN1_STRING *)a,pp, | 71 | return(i2d_ASN1_bytes((ASN1_STRING *)a,pp, |
@@ -81,3 +87,152 @@ ASN1_UTF8STRING *d2i_ASN1_UTF8STRING(ASN1_UTF8STRING **a, unsigned char **pp, | |||
81 | return(ret); | 87 | return(ret); |
82 | } | 88 | } |
83 | 89 | ||
90 | |||
91 | /* UTF8 utilities */ | ||
92 | |||
93 | /* This parses a UTF8 string one character at a time. It is passed a pointer | ||
94 | * to the string and the length of the string. It sets 'value' to the value of | ||
95 | * the current character. It returns the number of characters read or a | ||
96 | * negative error code: | ||
97 | * -1 = string too short | ||
98 | * -2 = illegal character | ||
99 | * -3 = subsequent characters not of the form 10xxxxxx | ||
100 | * -4 = character encoded incorrectly (not minimal length). | ||
101 | */ | ||
102 | |||
103 | int UTF8_getc(const unsigned char *str, int len, unsigned long *val) | ||
104 | { | ||
105 | const unsigned char *p; | ||
106 | unsigned long value; | ||
107 | int ret; | ||
108 | if(len <= 0) return 0; | ||
109 | p = str; | ||
110 | |||
111 | /* Check syntax and work out the encoded value (if correct) */ | ||
112 | if((*p & 0x80) == 0) { | ||
113 | value = *p++ & 0x7f; | ||
114 | ret = 1; | ||
115 | } else if((*p & 0xe0) == 0xc0) { | ||
116 | if(len < 2) return -1; | ||
117 | if((p[1] & 0xc0) != 0x80) return -3; | ||
118 | value = (*p++ & 0x1f) << 6; | ||
119 | value |= *p++ & 0x3f; | ||
120 | if(value < 0x80) return -4; | ||
121 | ret = 2; | ||
122 | } else if((*p & 0xf0) == 0xe0) { | ||
123 | if(len < 3) return -1; | ||
124 | if( ((p[1] & 0xc0) != 0x80) | ||
125 | || ((p[2] & 0xc0) != 0x80) ) return -3; | ||
126 | value = (*p++ & 0xf) << 12; | ||
127 | value |= (*p++ & 0x3f) << 6; | ||
128 | value |= *p++ & 0x3f; | ||
129 | if(value < 0x800) return -4; | ||
130 | ret = 3; | ||
131 | } else if((*p & 0xf8) == 0xf0) { | ||
132 | if(len < 4) return -1; | ||
133 | if( ((p[1] & 0xc0) != 0x80) | ||
134 | || ((p[2] & 0xc0) != 0x80) | ||
135 | || ((p[3] & 0xc0) != 0x80) ) return -3; | ||
136 | value = (*p++ & 0x7) << 18; | ||
137 | value |= (*p++ & 0x3f) << 12; | ||
138 | value |= (*p++ & 0x3f) << 6; | ||
139 | value |= *p++ & 0x3f; | ||
140 | if(value < 0x10000) return -4; | ||
141 | ret = 4; | ||
142 | } else if((*p & 0xfc) == 0xf8) { | ||
143 | if(len < 5) return -1; | ||
144 | if( ((p[1] & 0xc0) != 0x80) | ||
145 | || ((p[2] & 0xc0) != 0x80) | ||
146 | || ((p[3] & 0xc0) != 0x80) | ||
147 | || ((p[4] & 0xc0) != 0x80) ) return -3; | ||
148 | value = (*p++ & 0x3) << 24; | ||
149 | value |= (*p++ & 0x3f) << 18; | ||
150 | value |= (*p++ & 0x3f) << 12; | ||
151 | value |= (*p++ & 0x3f) << 6; | ||
152 | value |= *p++ & 0x3f; | ||
153 | if(value < 0x200000) return -4; | ||
154 | ret = 5; | ||
155 | } else if((*p & 0xfe) == 0xfc) { | ||
156 | if(len < 6) return -1; | ||
157 | if( ((p[1] & 0xc0) != 0x80) | ||
158 | || ((p[2] & 0xc0) != 0x80) | ||
159 | || ((p[3] & 0xc0) != 0x80) | ||
160 | || ((p[4] & 0xc0) != 0x80) | ||
161 | || ((p[5] & 0xc0) != 0x80) ) return -3; | ||
162 | value = (*p++ & 0x1) << 30; | ||
163 | value |= (*p++ & 0x3f) << 24; | ||
164 | value |= (*p++ & 0x3f) << 18; | ||
165 | value |= (*p++ & 0x3f) << 12; | ||
166 | value |= (*p++ & 0x3f) << 6; | ||
167 | value |= *p++ & 0x3f; | ||
168 | if(value < 0x4000000) return -4; | ||
169 | ret = 6; | ||
170 | } else return -2; | ||
171 | *val = value; | ||
172 | return ret; | ||
173 | } | ||
174 | |||
175 | /* This takes a character 'value' and writes the UTF8 encoded value in | ||
176 | * 'str' where 'str' is a buffer containing 'len' characters. Returns | ||
177 | * the number of characters written or -1 if 'len' is too small. 'str' can | ||
178 | * be set to NULL in which case it just returns the number of characters. | ||
179 | * It will need at most 6 characters. | ||
180 | */ | ||
181 | |||
182 | int UTF8_putc(unsigned char *str, int len, unsigned long value) | ||
183 | { | ||
184 | if(!str) len = 6; /* Maximum we will need */ | ||
185 | else if(len <= 0) return -1; | ||
186 | if(value < 0x80) { | ||
187 | if(str) *str = (unsigned char)value; | ||
188 | return 1; | ||
189 | } | ||
190 | if(value < 0x800) { | ||
191 | if(len < 2) return -1; | ||
192 | if(str) { | ||
193 | *str++ = (unsigned char)(((value >> 6) & 0x1f) | 0xc0); | ||
194 | *str = (unsigned char)((value & 0x3f) | 0x80); | ||
195 | } | ||
196 | return 2; | ||
197 | } | ||
198 | if(value < 0x10000) { | ||
199 | if(len < 3) return -1; | ||
200 | if(str) { | ||
201 | *str++ = (unsigned char)(((value >> 12) & 0xf) | 0xe0); | ||
202 | *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); | ||
203 | *str = (unsigned char)((value & 0x3f) | 0x80); | ||
204 | } | ||
205 | return 3; | ||
206 | } | ||
207 | if(value < 0x200000) { | ||
208 | if(len < 4) return -1; | ||
209 | if(str) { | ||
210 | *str++ = (unsigned char)(((value >> 18) & 0x7) | 0xf0); | ||
211 | *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); | ||
212 | *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); | ||
213 | *str = (unsigned char)((value & 0x3f) | 0x80); | ||
214 | } | ||
215 | return 4; | ||
216 | } | ||
217 | if(value < 0x4000000) { | ||
218 | if(len < 5) return -1; | ||
219 | if(str) { | ||
220 | *str++ = (unsigned char)(((value >> 24) & 0x3) | 0xf8); | ||
221 | *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80); | ||
222 | *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); | ||
223 | *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); | ||
224 | *str = (unsigned char)((value & 0x3f) | 0x80); | ||
225 | } | ||
226 | return 5; | ||
227 | } | ||
228 | if(len < 6) return -1; | ||
229 | if(str) { | ||
230 | *str++ = (unsigned char)(((value >> 30) & 0x1) | 0xfc); | ||
231 | *str++ = (unsigned char)(((value >> 24) & 0x3f) | 0x80); | ||
232 | *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80); | ||
233 | *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); | ||
234 | *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); | ||
235 | *str = (unsigned char)((value & 0x3f) | 0x80); | ||
236 | } | ||
237 | return 6; | ||
238 | } | ||