Changeset 4877:f204efc45b07 in roaraudio
- Timestamp:
- 04/26/11 14:04:57 (12 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
include/libroar/hash.h
r4795 r4877 93 93 ssize_t roar_ht_digestlen (const int ht); 94 94 95 ssize_t roar_ht_digest2str(char * out, size_t outlen, void * digest, size_t digestlen, int ht); 96 95 97 int roar_ht_is_supported(const int ht); 96 98 -
libroar/hash.c
r4795 r4877 172 172 } 173 173 174 static void _bin2hex(char * out, char * in, size_t inlen, int uppercase) { 175 const char * tab = uppercase ? "0123456789ABCDEF" : "0123456789abcdef"; 176 unsigned char c; 177 int nib0, nib1; 178 179 for (; inlen; inlen--) { 180 c = *(in++); 181 nib0 = (c & 0x0F) >> 0; 182 nib1 = (c & 0xF0) >> 4; 183 // printf("inlen=%zu, c=%u, nibs={%i, %i}\n", inlen, (unsigned)c, nib1, nib0); 184 *(out++) = tab[nib1]; 185 *(out++) = tab[nib0]; 186 } 187 *out = 0; 188 } 189 190 ssize_t roar_ht_digest2str(char * out, size_t outlen, void * digest, size_t digestlen, int ht) { 191 ssize_t slen = roar_ht_digestlen(ht); 192 union { 193 long long int llsi; 194 } tmp; 195 enum { 196 HEX, 197 TIGER, 198 // BASE64, 199 UUID, 200 INT, 201 GTIN 202 } type = HEX; 203 204 if ( out == NULL || digest == NULL ) { 205 roar_err_set(ROAR_ERROR_FAULT); 206 return -1; 207 } 208 209 if ( !(slen == -1 || digestlen == slen) ) { 210 roar_err_set(ROAR_ERROR_INVAL); 211 return -1; 212 } 213 214 switch (ht) { 215 case ROAR_HT_TIGER: type = TIGER; break; 216 case ROAR_HT_UUID: type = UUID; break; 217 case ROAR_HT_CLIENTID: 218 case ROAR_HT_STREAMID: 219 case ROAR_HT_SOURCEID: 220 case ROAR_HT_SAMPLEID: 221 case ROAR_HT_MIXERID: 222 case ROAR_HT_BRIDGEID: 223 case ROAR_HT_LISTENID: 224 case ROAR_HT_ACTIONID: 225 case ROAR_HT_MSGQUEUEID: 226 case ROAR_HT_MSGBUSID: 227 type = INT; 228 break; 229 case ROAR_HT_GTIN8: 230 case ROAR_HT_GTIN13: 231 case ROAR_HT_ISBN10: 232 type = GTIN; 233 break; 234 } 235 236 switch (type) { 237 case HEX: 238 if ( outlen < (digestlen*2 + 1) ) { 239 roar_err_set(ROAR_ERROR_FAULT); 240 return -1; 241 } 242 _bin2hex(out, digest, digestlen, 0); 243 break; 244 case UUID: 245 if ( outlen < 37 || digestlen != 16 ) { 246 roar_err_set(ROAR_ERROR_FAULT); 247 return -1; 248 } 249 _bin2hex(out+ 0, digest+ 0, 4, 0); 250 out[ 8] = '-'; 251 _bin2hex(out+ 9, digest+ 4, 2, 0); 252 out[13] = '-'; 253 _bin2hex(out+14, digest+ 6, 2, 0); 254 out[18] = '-'; 255 _bin2hex(out+19, digest+ 8, 2, 0); 256 out[23] = '-'; 257 _bin2hex(out+24, digest+10, 6, 0); 258 // printf("%s\n", out+24); 259 break; 260 case TIGER: 261 if ( outlen < 51 || digestlen != 24 ) { 262 roar_err_set(ROAR_ERROR_FAULT); 263 return -1; 264 } 265 _bin2hex(out+ 0, digest+ 0, 8, 1); 266 out[16] = ' '; 267 _bin2hex(out+17, digest+ 8, 8, 1); 268 out[33] = ' '; 269 _bin2hex(out+34, digest+16, 8, 1); 270 break; 271 case INT: 272 switch (digestlen) { 273 case 1: 274 tmp.llsi = *(char*)digest; 275 break; 276 case 2: 277 tmp.llsi = ROAR_NET2HOST16(*(int16_t*)digest); 278 break; 279 case 4: 280 tmp.llsi = ROAR_NET2HOST32(*(int32_t*)digest); 281 break; 282 default: 283 roar_err_set(ROAR_ERROR_NOSYS); 284 return -1; 285 break; 286 } 287 snprintf(out, outlen-1, "%lli", tmp.llsi); 288 break; 289 default: 290 roar_err_set(ROAR_ERROR_NOSYS); 291 return -1; 292 } 293 294 out[outlen-1] = 0; 295 return strlen(out); 296 } 297 174 298 int roar_ht_is_supported(const int ht) { 175 299 roar_crypto_init();
Note: See TracChangeset
for help on using the changeset viewer.