- Timestamp:
- Mar 15, 2016 3:57:39 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/third_party/srtp/crypto/rng/rand_source.c
r1807 r5261 43 43 */ 44 44 45 #include " srtp_config.h"45 #include "config.h" 46 46 47 #if defined(DEV_URANDOM) || defined(PJ_DEV_URANDOM)47 #ifdef DEV_URANDOM 48 48 # include <fcntl.h> /* for open() */ 49 49 # include <unistd.h> /* for close() */ 50 #elif (_MSC_VER >= 1400)51 # define _CRT_RAND_S50 #elif defined(HAVE_RAND_S) 51 # define _CRT_RAND_S 52 52 # include <stdlib.h> 53 # include <stdio.h>54 53 #else 55 54 # include <stdio.h> … … 88 87 if (dev_random_fdes < 0) 89 88 return err_status_init_fail; 90 #elif defined(PJ_DEV_URANDOM) 91 /* open random source for reading */ 92 dev_random_fdes = open(PJ_DEV_URANDOM, O_RDONLY); 93 if (dev_random_fdes < 0) { 94 err_report(3,"Ugh: /dev/urandom not present, using rand() instead"); 95 return err_status_ok; /* it's ok, it'll fallback to using rand() */ 96 } 97 #elif (_MSC_VER >= 1400) 89 #elif defined(HAVE_RAND_S) 98 90 dev_random_fdes = RAND_SOURCE_READY; 99 91 #else 100 92 /* no random source available; let the user know */ 101 err_report(err_level_info, "WARNING: no real random source present!\n");93 fprintf(stderr, "WARNING: no real random source present!\n"); 102 94 dev_random_fdes = RAND_SOURCE_READY; 103 95 #endif … … 114 106 */ 115 107 #ifdef DEV_URANDOM 116 if (read(dev_random_fdes, dest, len) != len) 117 return err_status_fail; 118 #elif 0 && (_MSC_VER >= 1400) /* disabled rand_s, causing assertion 'rand_s not supported' in vs8 */ 119 unsigned int *dst = dest; 108 uint8_t *dst = (uint8_t *)dest; 120 109 while (len) 121 110 { 122 unsigned int val = 0; 123 errno_t err = rand_s(&val); 124 if (err != 0) 125 { 126 return err_status_fail; 127 } 111 ssize_t num_read = read(dev_random_fdes, dst, len); 112 if (num_read <= 0 || num_read > len) 113 return err_status_fail; 114 len -= num_read; 115 dst += num_read; 116 } 117 #elif defined(HAVE_RAND_S) 118 uint8_t *dst = (uint8_t *)dest; 119 while (len) 120 { 121 unsigned int val; 122 errno_t err = rand_s(&val); 123 124 if (err != 0) 125 return err_status_fail; 128 126 129 *dst++ = val;130 127 *dst++ = val & 0xff; 128 len--; 131 129 } 132 130 #else 133 uint8_t *dst = (uint8_t *)dest;134 135 #ifdef PJ_DEV_URANDOM136 /* First try with /dev/urandom, if it's opened */137 if (dev_random_fdes >= 0) {138 if (read(dev_random_fdes, dest, len) == len)139 return err_status_ok; /* success */140 }141 #endif142 143 131 /* Generic C-library (rand()) version */ 144 132 /* This is a random source of last resort */ 133 uint8_t *dst = (uint8_t *)dest; 145 134 while (len) 146 135 { … … 158 147 err_status_t 159 148 rand_source_deinit(void) { 160 #ifndef PJ_DEV_URANDOM161 149 if (dev_random_fdes < 0) 162 150 return err_status_dealloc_fail; /* well, we haven't really failed, * 163 151 * but there is something wrong */ 152 #ifdef DEV_URANDOM 153 close(dev_random_fdes); 164 154 #endif 165 166 #if defined(DEV_URANDOM) || defined(PJ_DEV_URANDOM)167 if (dev_random_fdes >= 0)168 close(dev_random_fdes);169 170 155 dev_random_fdes = RAND_SOURCE_NOT_READY; 171 #endif172 156 173 157 return err_status_ok; 174 158 } 175
Note: See TracChangeset
for help on using the changeset viewer.