OpenCoverage

a_utf8.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/asn1/a_utf8.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: a_utf8.c,v 1.8 2014/07/11 08:44:47 jsing Exp $ */-
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)-
3 * All rights reserved.-
4 *-
5 * This package is an SSL implementation written-
6 * by Eric Young (eay@cryptsoft.com).-
7 * The implementation was written so as to conform with Netscapes SSL.-
8 *-
9 * This library is free for commercial and non-commercial use as long as-
10 * the following conditions are aheared to. The following conditions-
11 * apply to all code found in this distribution, be it the RC4, RSA,-
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation-
13 * included with this distribution is covered by the same copyright terms-
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).-
15 *-
16 * Copyright remains Eric Young's, and as such any Copyright notices in-
17 * the code are not to be removed.-
18 * If this package is used in a product, Eric Young should be given attribution-
19 * as the author of the parts of the library used.-
20 * This can be in the form of a textual message at program startup or-
21 * in documentation (online or textual) provided with the package.-
22 *-
23 * Redistribution and use in source and binary forms, with or without-
24 * modification, are permitted provided that the following conditions-
25 * are met:-
26 * 1. Redistributions of source code must retain the copyright-
27 * notice, this list of conditions and the following disclaimer.-
28 * 2. Redistributions in binary form must reproduce the above copyright-
29 * notice, this list of conditions and the following disclaimer in the-
30 * documentation and/or other materials provided with the distribution.-
31 * 3. All advertising materials mentioning features or use of this software-
32 * must display the following acknowledgement:-
33 * "This product includes cryptographic software written by-
34 * Eric Young (eay@cryptsoft.com)"-
35 * The word 'cryptographic' can be left out if the rouines from the library-
36 * being used are not cryptographic related :-).-
37 * 4. If you include any Windows specific code (or a derivative thereof) from-
38 * the apps directory (application code) you must include an acknowledgement:-
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"-
40 *-
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND-
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE-
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS-
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT-
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY-
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF-
51 * SUCH DAMAGE.-
52 *-
53 * The licence and distribution terms for any publically available version or-
54 * derivative of this code cannot be changed. i.e. this code cannot simply be-
55 * copied and put under another distribution licence-
56 * [including the GNU Public Licence.]-
57 */-
58-
59#include <stdio.h>-
60-
61#include <openssl/asn1.h>-
62-
63#include "asn1_locl.h"-
64-
65/* UTF8 utilities */-
66-
67/*-
68 * This parses a UTF8 string one character at a time. It is passed a pointer-
69 * to the string and the length of the string. It sets 'value' to the value of-
70 * the current character. It returns the number of characters read or a-
71 * negative error code:-
72 * -1 = string too short-
73 * -2 = illegal character-
74 * -3 = subsequent characters not of the form 10xxxxxx-
75 * -4 = character encoded incorrectly (not minimal length).-
76 */-
77-
78int-
79UTF8_getc(const unsigned char *str, int len, unsigned long *val)-
80{-
81 const unsigned char *p;-
82 unsigned long value;-
83 int ret;-
84 if (len <= 0)
len <= 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 171051453 times by 9 tests
Evaluated by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
  • utf8test
  • verifytest
1-171051453
85 return 0;
executed 1 time by 1 test: return 0;
Executed by:
  • utf8test
1
86 p = str;-
87-
88 /* Check syntax and work out the encoded value (if correct) */-
89 if ((*p & 0x80) == 0) {
(*p & 0x80) == 0Description
TRUEevaluated 54768 times by 9 tests
Evaluated by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
  • utf8test
  • verifytest
FALSEevaluated 170996685 times by 1 test
Evaluated by:
  • utf8test
54768-170996685
90 value = *p++ & 0x7f;-
91 ret = 1;-
92 } else if ((*p & 0xe0) == 0xc0) {
executed 54768 times by 9 tests: end of block
Executed by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
  • utf8test
  • verifytest
(*p & 0xe0) == 0xc0Description
TRUEevaluated 17282 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 170979403 times by 1 test
Evaluated by:
  • utf8test
17282-170979403
93 if (*p < 0xc2)
*p < 0xc2Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 17280 times by 1 test
Evaluated by:
  • utf8test
2-17280
94 return -2;
executed 2 times by 1 test: return -2;
Executed by:
  • utf8test
2
95 if (len < 2)
len < 2Description
TRUEevaluated 7680 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 9600 times by 1 test
Evaluated by:
  • utf8test
7680-9600
96 return -1;
executed 7680 times by 1 test: return -1;
Executed by:
  • utf8test
7680
97 if ((p[1] & 0xc0) != 0x80)
(p[1] & 0xc0) != 0x80Description
TRUEevaluated 5760 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 3840 times by 1 test
Evaluated by:
  • utf8test
3840-5760
98 return -3;
executed 5760 times by 1 test: return -3;
Executed by:
  • utf8test
5760
99 value = (*p++ & 0x1f) << 6;-
100 value |= *p++ & 0x3f;-
101 if (value < 0x80)
value < 0x80Description
TRUEnever evaluated
FALSEevaluated 3840 times by 1 test
Evaluated by:
  • utf8test
0-3840
102 return -4;
never executed: return -4;
0
103 ret = 2;-
104 } else if ((*p & 0xf0) == 0xe0) {
executed 3840 times by 1 test: end of block
Executed by:
  • utf8test
(*p & 0xf0) == 0xe0Description
TRUEevaluated 2158592 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 168820811 times by 1 test
Evaluated by:
  • utf8test
3840-168820811
105 if (len < 3)
len < 3Description
TRUEevaluated 1048576 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 1110016 times by 1 test
Evaluated by:
  • utf8test
1048576-1110016
106 return -1;
executed 1048576 times by 1 test: return -1;
Executed by:
  • utf8test
1048576
107 if (((p[1] & 0xc0) != 0x80) ||
((p[1] & 0xc0) != 0x80)Description
TRUEevaluated 786432 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 323584 times by 1 test
Evaluated by:
  • utf8test
323584-786432
108 ((p[2] & 0xc0) != 0x80))
((p[2] & 0xc0) != 0x80)Description
TRUEevaluated 196608 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 126976 times by 1 test
Evaluated by:
  • utf8test
126976-196608
109 return -3;
executed 983040 times by 1 test: return -3;
Executed by:
  • utf8test
983040
110 value = (*p++ & 0xf) << 12;-
111 value |= (*p++ & 0x3f) << 6;-
112 value |= *p++ & 0x3f;-
113 if (value < 0x800)
value < 0x800Description
TRUEevaluated 2048 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 124928 times by 1 test
Evaluated by:
  • utf8test
2048-124928
114 return -4;
executed 2048 times by 1 test: return -4;
Executed by:
  • utf8test
2048
115 /* surrogate pair code points are not valid */-
116 if (value >= 0xd800 && value < 0xe000)
value >= 0xd800Description
TRUEevaluated 18432 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 106496 times by 1 test
Evaluated by:
  • utf8test
value < 0xe000Description
TRUEevaluated 2048 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 16384 times by 1 test
Evaluated by:
  • utf8test
2048-106496
117 return -2;
executed 2048 times by 1 test: return -2;
Executed by:
  • utf8test
2048
118 ret = 3;-
119 } else if ((*p & 0xf8) == 0xf0 && (*p < 0xf5)) {
executed 122880 times by 1 test: end of block
Executed by:
  • utf8test
(*p & 0xf8) == 0xf0Description
TRUEevaluated 168820739 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 72 times by 1 test
Evaluated by:
  • utf8test
(*p < 0xf5)Description
TRUEevaluated 168820736 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 3 times by 1 test
Evaluated by:
  • utf8test
3-168820739
120 if (len < 4)
len < 4Description
TRUEevaluated 83886080 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 84934656 times by 1 test
Evaluated by:
  • utf8test
83886080-84934656
121 return -1;
executed 83886080 times by 1 test: return -1;
Executed by:
  • utf8test
83886080
122 if (((p[1] & 0xc0) != 0x80) ||
((p[1] & 0xc0) != 0x80)Description
TRUEevaluated 62914560 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 22020096 times by 1 test
Evaluated by:
  • utf8test
22020096-62914560
123 ((p[2] & 0xc0) != 0x80) ||
((p[2] & 0xc0) != 0x80)Description
TRUEevaluated 15728640 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 6291456 times by 1 test
Evaluated by:
  • utf8test
6291456-15728640
124 ((p[3] & 0xc0) != 0x80))
((p[3] & 0xc0) != 0x80)Description
TRUEevaluated 3932160 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 2359296 times by 1 test
Evaluated by:
  • utf8test
2359296-3932160
125 return -3;
executed 82575360 times by 1 test: return -3;
Executed by:
  • utf8test
82575360
126 value = ((unsigned long)(*p++ & 0x7)) << 18;-
127 value |= (*p++ & 0x3f) << 12;-
128 value |= (*p++ & 0x3f) << 6;-
129 value |= *p++ & 0x3f;-
130 if (value < 0x10000)
value < 0x10000Description
TRUEevaluated 65536 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 2293760 times by 1 test
Evaluated by:
  • utf8test
65536-2293760
131 return -4;
executed 65536 times by 1 test: return -4;
Executed by:
  • utf8test
65536
132 if (value > UNICODE_MAX)
value > 0x10FFFFDescription
TRUEevaluated 196608 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 2097152 times by 1 test
Evaluated by:
  • utf8test
196608-2097152
133 return -2;
executed 196608 times by 1 test: return -2;
Executed by:
  • utf8test
196608
134 ret = 4;-
135 } else
executed 2097152 times by 1 test: end of block
Executed by:
  • utf8test
2097152
136 return -2;
executed 75 times by 1 test: return -2;
Executed by:
  • utf8test
75
137 *val = value;-
138 return ret;
executed 2278640 times by 9 tests: return ret;
Executed by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
  • utf8test
  • verifytest
2278640
139}-
140-
141/* This takes a Unicode code point 'value' and writes its UTF-8 encoded form-
142 * in 'str' where 'str' is a buffer of at least length 'len'. If 'str'-
143 * is NULL, then nothing is written and just the return code is determined.-
144-
145 * Returns less than zero on error:-
146 * -1 if 'str' is not NULL and 'len' is too small-
147 * -2 if 'value' is an invalid character (surrogate or out-of-range)-
148 *-
149 * Otherwise, returns the number of bytes in 'value's encoded form-
150 * (i.e., the number of bytes written to 'str' when it's not NULL).-
151 *-
152 * It will need at most 4 characters.-
153 */-
154-
155int-
156UTF8_putc(unsigned char *str, int len, unsigned long value)-
157{-
158 if (value < 0x80) {
value < 0x80Description
TRUEevaluated 3006 times by 8 tests
Evaluated by:
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
  • utf8test
  • verifytest
FALSEevaluated 3338367 times by 1 test
Evaluated by:
  • utf8test
3006-3338367
159 if (str != NULL) {
str != ((void *)0)Description
TRUEevaluated 1567 times by 8 tests
Evaluated by:
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
  • utf8test
  • verifytest
FALSEevaluated 1439 times by 8 tests
Evaluated by:
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
  • utf8test
  • verifytest
1439-1567
160 if (len < 1)
len < 1Description
TRUEevaluated 128 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 1439 times by 8 tests
Evaluated by:
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
  • utf8test
  • verifytest
128-1439
161 return -1;
executed 128 times by 1 test: return -1;
Executed by:
  • utf8test
128
162 str[0] = (unsigned char)value;-
163 }
executed 1439 times by 8 tests: end of block
Executed by:
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
  • utf8test
  • verifytest
1439
164 return 1;
executed 2878 times by 8 tests: return 1;
Executed by:
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
  • utf8test
  • verifytest
2878
165 }-
166 if (value < 0x800) {
value < 0x800Description
TRUEevaluated 5760 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 3332607 times by 1 test
Evaluated by:
  • utf8test
5760-3332607
167 if (str != NULL) {
str != ((void *)0)Description
TRUEevaluated 3840 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 1920 times by 1 test
Evaluated by:
  • utf8test
1920-3840
168 if (len < 2)
len < 2Description
TRUEevaluated 1920 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 1920 times by 1 test
Evaluated by:
  • utf8test
1920
169 return -1;
executed 1920 times by 1 test: return -1;
Executed by:
  • utf8test
1920
170 str[0] = (unsigned char)(((value >> 6) & 0x1f) | 0xc0);-
171 str[1] = (unsigned char)((value & 0x3f) | 0x80);-
172 }
executed 1920 times by 1 test: end of block
Executed by:
  • utf8test
1920
173 return 2;
executed 3840 times by 1 test: return 2;
Executed by:
  • utf8test
3840
174 }-
175 if (value < 0x10000) {
value < 0x10000Description
TRUEevaluated 186368 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 3146239 times by 1 test
Evaluated by:
  • utf8test
186368-3146239
176 if (UNICODE_IS_SURROGATE(value))
(value) >= 0x00D800Description
TRUEevaluated 26624 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 159744 times by 1 test
Evaluated by:
  • utf8test
(value) <= 0x00DFFFDescription
TRUEevaluated 2048 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 24576 times by 1 test
Evaluated by:
  • utf8test
2048-159744
177 return -2;
executed 2048 times by 1 test: return -2;
Executed by:
  • utf8test
2048
178 if (str != NULL) {
str != ((void *)0)Description
TRUEevaluated 122880 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 61440 times by 1 test
Evaluated by:
  • utf8test
61440-122880
179 if (len < 3)
len < 3Description
TRUEevaluated 61440 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 61440 times by 1 test
Evaluated by:
  • utf8test
61440
180 return -1;
executed 61440 times by 1 test: return -1;
Executed by:
  • utf8test
61440
181 str[0] = (unsigned char)(((value >> 12) & 0xf) | 0xe0);-
182 str[1] = (unsigned char)(((value >> 6) & 0x3f) | 0x80);-
183 str[2] = (unsigned char)((value & 0x3f) | 0x80);-
184 }
executed 61440 times by 1 test: end of block
Executed by:
  • utf8test
61440
185 return 3;
executed 122880 times by 1 test: return 3;
Executed by:
  • utf8test
122880
186 }-
187 if (value <= UNICODE_MAX) {
value <= 0x10FFFFDescription
TRUEevaluated 3145728 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 511 times by 1 test
Evaluated by:
  • utf8test
511-3145728
188 if (str != NULL) {
str != ((void *)0)Description
TRUEevaluated 2097152 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 1048576 times by 1 test
Evaluated by:
  • utf8test
1048576-2097152
189 if (len < 4)
len < 4Description
TRUEevaluated 1048576 times by 1 test
Evaluated by:
  • utf8test
FALSEevaluated 1048576 times by 1 test
Evaluated by:
  • utf8test
1048576
190 return -1;
executed 1048576 times by 1 test: return -1;
Executed by:
  • utf8test
1048576
191 str[0] = (unsigned char)(((value >> 18) & 0x7) | 0xf0);-
192 str[1] = (unsigned char)(((value >> 12) & 0x3f) | 0x80);-
193 str[2] = (unsigned char)(((value >> 6) & 0x3f) | 0x80);-
194 str[3] = (unsigned char)((value & 0x3f) | 0x80);-
195 }
executed 1048576 times by 1 test: end of block
Executed by:
  • utf8test
1048576
196 return 4;
executed 2097152 times by 1 test: return 4;
Executed by:
  • utf8test
2097152
197 }-
198 return -2;
executed 511 times by 1 test: return -2;
Executed by:
  • utf8test
511
199}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2