DTS Application Library  0.2.3
Application library containing referenced objects and interfaces to common libraries
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
util.c
Go to the documentation of this file.
1 /*
2 Copyright (C) 2012 Gregory Nietsky <gregory@distrotetch.co.za>
3  http://www.distrotech.co.za
4 
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #include <openssl/bio.h>
20 #include <openssl/buffer.h>
21 #include <openssl/evp.h>
22 
46 #ifdef __WIN32__
47 #include <winsock2.h>
48 #include <windows.h>
49 #endif
50 
51 #include <fcntl.h>
52 #include <string.h>
53 #include <unistd.h>
54 #include <openssl/rand.h>
55 #include <openssl/md5.h>
56 #include <openssl/sha.h>
57 #include <ctype.h>
58 #include <stdint.h>
59 #include <stdio.h>
60 #include <sys/time.h>
61 
62 #include "include/dtsapp.h"
63 
68 extern void seedrand(void) {
69  int fd = open("/dev/random", O_RDONLY);
70  int len;
71  char buf[64];
72 
73  len = read(fd, buf, 64);
74  RAND_seed(buf, len);
75 }
76 
82 extern int genrand(void *buf, int len) {
83  return (RAND_bytes(buf, len));
84 }
85 
97 extern void sha512sum2(unsigned char *buff, const void *data, unsigned long len, const void *data2, unsigned long len2) {
98  SHA512_CTX c;
99 
100  SHA512_Init(&c);
101  SHA512_Update(&c, data, len);
102  if (data2) {
103  SHA512_Update(&c, data2, len2);
104  }
105  SHA512_Final(buff, &c);
106 }
107 
114 extern void sha512sum(unsigned char *buff, const void *data, unsigned long len) {
115  sha512sum2(buff, data, len, NULL, 0);
116 }
117 
118 
127 extern void sha256sum2(unsigned char *buff, const void *data, unsigned long len, const void *data2, unsigned long len2) {
128  SHA256_CTX c;
129 
130  SHA256_Init(&c);
131  SHA256_Update(&c, data, len);
132  if (data2) {
133  SHA256_Update(&c, data2, len2);
134  }
135  SHA256_Final(buff, &c);
136 }
137 
144 extern void sha256sum(unsigned char *buff, const void *data, unsigned long len) {
145  sha256sum2(buff, data, len, NULL, 0);
146 }
147 
156 extern void sha1sum2(unsigned char *buff, const void *data, unsigned long len, const void *data2, unsigned long len2) {
157  SHA_CTX c;
158 
159  SHA_Init(&c);
160  SHA_Update(&c, data, len);
161  if (data2) {
162  SHA_Update(&c, data2, len2);
163  }
164  SHA_Final(buff, &c);
165 }
166 
173 extern void sha1sum(unsigned char *buff, const void *data, unsigned long len) {
174  sha1sum2(buff, data, len, NULL, 0);
175 }
176 
185 extern void md5sum2(unsigned char *buff, const void *data, unsigned long len, const void *data2, unsigned long len2) {
186  MD5_CTX c;
187 
188  MD5_Init(&c);
189  MD5_Update(&c, data, len);
190  if (data2) {
191  MD5_Update(&c, data2, len2);
192  }
193  MD5_Final(buff, &c);
194 }
195 
202 extern void md5sum(unsigned char *buff, const void *data, unsigned long len) {
203  md5sum2(buff, data, len, NULL, 0);
204 }
205 
206 static int _digest_cmp(unsigned char *md51, unsigned char *md52, int len) {
207  int cnt;
208  int chk = 0;
209 
210  for(cnt = 0; cnt < len; cnt ++) {
211  chk += md51[cnt] & ~md52[cnt];
212  }
213 
214  return (chk);
215 }
216 
223 extern int md5cmp(unsigned char *digest1, unsigned char *digest2) {
224  return (_digest_cmp(digest1, digest2, 16));
225 }
226 
233 extern int sha1cmp(unsigned char *digest1, unsigned char *digest2) {
234  return (_digest_cmp(digest1, digest2, 20));
235 }
236 
243 extern int sha256cmp(unsigned char *digest1, unsigned char *digest2) {
244  return (_digest_cmp(digest1, digest2, 32));
245 }
246 
253 extern int sha512cmp(unsigned char *digest1, unsigned char *digest2) {
254  return (_digest_cmp(digest1, digest2, 64));
255 }
256 
257 static void _hmac(unsigned char *buff, const void *data, unsigned long len, const void *key, unsigned long klen,
258  void (*func)(unsigned char *, const void *, unsigned long, const void *, unsigned long), short alglen) {
259  unsigned char okey[64], ikey[64];
260  int bcnt;
261 
262  memset(ikey, 0, 64);
263  memset(okey, 0, 64);
264 
265  if (klen < 64) {
266  memcpy(ikey, key, klen);
267  memcpy(okey, key, klen);
268  } else {
269  md5sum(okey, key, klen);
270  memcpy(ikey, okey, klen);
271  }
272 
273  for (bcnt = 0; bcnt < 64; bcnt++) {
274  ikey[bcnt] ^= 0x36;
275  okey[bcnt] ^= 0x5c;
276  };
277 
278  func(buff, ikey, 64, data, len);
279  func(buff, okey, 64, buff, alglen);
280 }
281 
290 extern void md5hmac(unsigned char *buff, const void *data, unsigned long len, const void *key, unsigned long klen) {
291  _hmac(buff, data, len, key, klen, md5sum2, 16);
292 }
293 
302 extern void sha1hmac(unsigned char *buff, const void *data, unsigned long len, const void *key, unsigned long klen) {
303  _hmac(buff, data, len, key, klen, sha1sum2, 20);
304 }
305 
314 extern void sha256hmac(unsigned char *buff, const void *data, unsigned long len, const void *key, unsigned long klen) {
315  _hmac(buff, data, len, key, klen, sha256sum2, 32);
316 }
317 
326 extern void sha512hmac(unsigned char *buff, const void *data, unsigned long len, const void *key, unsigned long klen) {
327  _hmac(buff, data, len, key, klen, sha512sum2, 64);
328 }
329 
341 extern int strlenzero(const char *str) {
342  if (str && strlen(str)) {
343  return (0);
344  }
345  return (1);
346 }
347 
348 
353 extern char *ltrim(char *str) {
354  char *cur = str;
355 
356  if (strlenzero(str)) {
357  return (str);
358  }
359 
360  while(isspace(cur[0])) {
361  cur++;
362  }
363 
364  return (cur);
365 }
366 
367 
372 extern char *rtrim(const char *str) {
373  int len;
374  char *cur = (char *)str;
375 
376  if (strlenzero(str)) {
377  return (cur);
378  }
379 
380  len = strlen(str) - 1;
381  while(len && isspace(cur[len])) {
382  cur[len] = '\0';
383  len--;
384  }
385 
386  return (cur);
387 }
388 
393 extern char *trim(const char *str) {
394  char *cur = (char *)str;
395 
396  cur = ltrim(cur);
397  cur = rtrim(cur);
398  return (cur);
399 }
400 
405 extern uint64_t tvtontp64(struct timeval *tv) {
406  return ((((uint64_t)tv->tv_sec + 2208988800u) << 32) + ((uint32_t)tv->tv_usec * 4294.967296));
407 }
408 
409 /*
410  * RFC 1701 Checksum based on code from the RFC
411  */
412 static uint16_t _checksum(const void *data, int len, const uint16_t check) {
413  uint64_t csum = 0;
414  const uint32_t *arr = (uint32_t *)data;
415 
416  /*handle 32bit chunks*/
417  while(len > 3) {
418  csum += *arr++;
419  len -= 4;
420  }
421 
422  /*handle left over 16 bit chunk*/
423  if (len > 1) {
424  csum += *(uint16_t *)arr;
425  arr = (uint32_t *)((uint16_t *)arr + 1);
426  len -= 2;
427  }
428 
429  /*handle odd byte*/
430  if (len) {
431  csum += *(uint8_t *)arr;
432  }
433 
434  /*add checksum when called as verify*/
435  if (check) {
436  csum += check;
437  }
438 
439  /*collapse to 16 bits adding all overflows leaving 16bit checksum*/
440  while(csum >> 16) {
441  csum = (csum & 0xffff) + (csum >> 16);
442  }
443 
444  return (~(uint16_t)csum);
445 }
446 
452 extern uint16_t checksum(const void *data, int len) {
453  return (_checksum(data, len, 0));
454 }
455 
456 
463 extern uint16_t checksum_add(const uint16_t checksum, const void *data, int len) {
464  return (_checksum(data, len, ~checksum));
465 }
466 
473 extern uint16_t verifysum(const void *data, int len, const uint16_t check) {
474  return (_checksum(data, len, check));
475 }
476 
483 #ifndef __WIN32__
484 extern void touch(const char *filename, uid_t user, gid_t group) {
485  int res;
486 #else
487 extern void touch(const char *filename) {
488 #endif
489  int fd;
490 
491  fd = creat(filename, 0600);
492  close(fd);
493 #ifndef __WIN32__
494  res = chown(filename, user, group);
495  res++;
496 #endif
497  return;
498 }
499 
506 extern char *b64enc_buf(const char *message, uint32_t len, int nonl) {
507  BIO *bmem, *b64;
508  BUF_MEM *ptr;
509  char *buffer;
510  double encodedSize;
511 
512  encodedSize = 1.36*len;
513  buffer = objalloc(encodedSize+1, NULL);
514 
515  b64 = BIO_new(BIO_f_base64());
516  bmem = BIO_new(BIO_s_mem());
517  b64 = BIO_push(b64, bmem);
518  if (nonl) {
519  BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
520  }
521  BIO_write(b64, message, len);
522  BIO_flush(b64);
523  BIO_get_mem_ptr(b64, &ptr);
524 
525  buffer = objalloc(ptr->length+1, NULL);
526  memcpy(buffer, ptr->data, ptr->length);
527 
528 
529  BIO_free_all(b64);
530 
531  return buffer;
532 }
533 
539 extern char *b64enc(const char *message, int nonl) {
540  return b64enc_buf(message, strlen(message), nonl);
541 }
542 
uint64_t tvtontp64(struct timeval *tv)
Convert a timeval struct to 64bit NTP time.
Definition: util.c:405
int md5cmp(unsigned char *digest1, unsigned char *digest2)
Compare two md5 hashes.
Definition: util.c:223
int strlenzero(const char *str)
Check if a string is zero length.
Definition: util.c:341
uint16_t checksum(const void *data, int len)
Obtain the checksum for a buffer.
Definition: util.c:452
void sha256sum(unsigned char *buff, const void *data, unsigned long len)
Calculate the SHA2-256 hash.
Definition: util.c:144
void sha256sum2(unsigned char *buff, const void *data, unsigned long len, const void *data2, unsigned long len2)
Calculate the SHA2-256 hash accross 2 data chunks.
Definition: util.c:127
void sha256hmac(unsigned char *buff, const void *data, unsigned long len, const void *key, unsigned long klen)
Hash Message Authentication Codes (HMAC) SHA2-256.
Definition: util.c:314
void * objalloc(int size, objdestroy)
Allocate a referenced lockable object.
Definition: refobj.c:129
uint16_t checksum_add(const uint16_t checksum, const void *data, int len)
Obtain the checksum for a buffer adding a checksum.
Definition: util.c:463
int sha1cmp(unsigned char *digest1, unsigned char *digest2)
Compare two SHA1 hashes.
Definition: util.c:233
void md5hmac(unsigned char *buff, const void *data, unsigned long len, const void *key, unsigned long klen)
Hash Message Authentication Codes (HMAC) MD5.
Definition: util.c:290
void sha512sum(unsigned char *buff, const void *data, unsigned long len)
Calculate the SHA2-512 hash.
Definition: util.c:114
uint16_t verifysum(const void *data, int len, const uint16_t check)
Verify a checksum.
Definition: util.c:473
char * rtrim(const char *str)
Trim white space at the end of a string.
Definition: util.c:372
DTS Application library API Include file.
void sha1sum2(unsigned char *buff, const void *data, unsigned long len, const void *data2, unsigned long len2)
Calculate the SHA1 hash accross 2 data chunks.
Definition: util.c:156
void md5sum2(unsigned char *buff, const void *data, unsigned long len, const void *data2, unsigned long len2)
Calculate the MD5 hash accross 2 data chunks.
Definition: util.c:185
void sha1sum(unsigned char *buff, const void *data, unsigned long len)
Calculate the SHA1 hash.
Definition: util.c:173
char * trim(const char *str)
Trim whitesapce from the beggining and end of a string.
Definition: util.c:393
int sha256cmp(unsigned char *digest1, unsigned char *digest2)
Compare two SHA2-256 hashes.
Definition: util.c:243
int genrand(void *buf, int len)
Generate random sequence.
Definition: util.c:82
void touch(const char *filename, uid_t user, gid_t group)
Create a file and set user and group.
Definition: util.c:484
char * ltrim(char *str)
Trim white space at the begining of a string.
Definition: util.c:353
void seedrand(void)
Seed openssl random number generator.
Definition: util.c:68
int sha512cmp(unsigned char *digest1, unsigned char *digest2)
Compare two SHA2-512 hashes.
Definition: util.c:253
void sha512hmac(unsigned char *buff, const void *data, unsigned long len, const void *key, unsigned long klen)
Hash Message Authentication Codes (HMAC) SHA2-512.
Definition: util.c:326
char * b64enc(const char *message, int nonl)
Base 64 encode a string.
Definition: util.c:539
void sha512sum2(unsigned char *buff, const void *data, unsigned long len, const void *data2, unsigned long len2)
Calculate the SHA2-512 hash accross 2 data chunks.
Definition: util.c:97
void md5sum(unsigned char *buff, const void *data, unsigned long len)
Calculate the MD5 hash.
Definition: util.c:202
void sha1hmac(unsigned char *buff, const void *data, unsigned long len, const void *key, unsigned long klen)
Hash Message Authentication Codes (HMAC) SHA1.
Definition: util.c:302
char * b64enc_buf(const char *message, uint32_t len, int nonl)
Base 64 encode a buffer.
Definition: util.c:506