1
1
/* convert.c - Hex conversion functions.
2
* Copyright (C) 2006 Free Software Foundation, Inc.
2
* Copyright (C) 2006, 2008 Free Software Foundation, Inc.
4
4
* This file is part of GnuPG.
31
31
/* Convert STRING consisting of hex characters into its binary
32
32
representation and store that at BUFFER. BUFFER needs to be of
33
LENGTH bytes. The function check that the STRING will convert
33
LENGTH bytes. The function checks that the STRING will convert
34
34
exactly to LENGTH bytes. The string is delimited by either end of
35
35
string or a white space character. The function returns -1 on
36
36
error or the length of the parsed string. */
165
/* Convert HEXSTRING consisting of hex characters into string and
166
store that at BUFFER. HEXSTRING is either delimited by end of
167
string or a white space character. The function makes sure that
168
the resulting string in BUFFER is terminated by a Nul character.
169
BUFSIZE is the availabe length of BUFFER; if the converted result
170
plus a possible required Nul character does not fit into this
171
buffer, the function returns NULL and won't change the existing
172
conent of buffer. In-place conversion is possible as long as
173
BUFFER points to HEXSTRING.
175
If BUFFER is NULL and bufsize is 0 the function scans HEXSTRING but
176
does not store anything. This may be used to find the end of
179
On sucess the function returns a pointer to the next character
180
after HEXSTRING (which is either end-of-string or a the next white
181
space). If BUFLEN is not NULL the strlen of buffer is stored
182
there; this will even be done if BUFFER has been passed as NULL. */
184
hex2str (const char *hexstring, char *buffer, size_t bufsize, size_t *buflen)
186
const char *s = hexstring;
193
for (s=hexstring, count=0; hexdigitp (s) && hexdigitp (s+1); s += 2, count++)
195
if (*s && (!isascii (*s) || !isspace (*s)) )
196
return NULL; /* Not followed by Nul or white space. */
197
/* We need to append a nul character. However we don't want that if
198
the hexstring already ends with "00". */
199
need_nul = ((s == hexstring) || !(s[-2] == '0' && s[-1] == '0'));
206
return NULL; /* Too long. */
208
for (s=hexstring, idx=0; hexdigitp (s) && hexdigitp (s+1); s += 2)
209
((unsigned char*)buffer)[idx++] = xtoi_2 (s);
220
/* Same as hex2str but this function allocated a new string. Returns
221
NULL on error. If R_COUNT is not NULL, the number of scanned bytes
222
will be stored there. ERRNO is set on error. */
224
hex2str_alloc (const char *hexstring, size_t *r_count)
230
tail = hex2str (hexstring, NULL, 0, &nbytes);
239
*r_count = tail - hexstring;
240
result = xtrymalloc (nbytes+1);
243
if (!hex2str (hexstring, result, nbytes+1, NULL))