1 /*------------------------------------------------------------------ 2 * safe_str_lib.h -- Safe C Library String APIs 3 * 4 * October 2008, Bo Berry 5 * 6 * Copyright (c) 2008-2011, 2013 by Cisco Systems, Inc. 7 * All rights reserved. 8 * 9 * Permission is hereby granted, free of charge, to any person 10 * obtaining a copy of this software and associated documentation 11 * files (the "Software"), to deal in the Software without 12 * restriction, including without limitation the rights to use, 13 * copy, modify, merge, publish, distribute, sublicense, and/or 14 * sell copies of the Software, and to permit persons to whom the 15 * Software is furnished to do so, subject to the following 16 * conditions: 17 * 18 * The above copyright notice and this permission notice shall be 19 * included in all copies or substantial portions of the Software. 20 * 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 23 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 25 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 26 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 28 * OTHER DEALINGS IN THE SOFTWARE. 29 *------------------------------------------------------------------ 30 */ 31 32 #ifndef __SAFE_STR_LIB_H__ 33 #define __SAFE_STR_LIB_H__ 34 35 #include "safe_lib.h" 36 #include <wchar.h> 37 38 /* 39 * The shortest string is a null string!! 40 */ 41 #define RSIZE_MIN_STR (1) 42 43 /* maximum sring length */ 44 #define RSIZE_MAX_STR (4UL << 10) /* 4KB */ 45 46 /* The makeup of a password */ 47 #define SAFE_STR_MIN_LOWERCASE (2) 48 #define SAFE_STR_MIN_UPPERCASE (2) 49 #define SAFE_STR_MIN_NUMBERS (1) 50 #define SAFE_STR_MIN_SPECIALS (1) 51 52 #define SAFE_STR_PASSWORD_MIN_LENGTH (6) 53 #define SAFE_STR_PASSWORD_MAX_LENGTH (32) 54 55 /* set string constraint handler */ 56 extern constraint_handler_t set_str_constraint_handler_s(constraint_handler_t handler); 57 58 #if 0 59 60 /* string compare */ 61 extern errno_t strcasecmp_s(const char *dest, rsize_t dmax, const char *src, int *indicator); 62 63 /* find a substring _ case insensitive */ 64 extern errno_t strcasestr_s(char *dest, rsize_t dmax, const char *src, rsize_t slen, 65 char **substring); 66 67 /* string concatenate */ 68 extern errno_t strcat_s(char *dest, rsize_t dmax, const char *src); 69 70 /* string compare */ 71 extern errno_t strcmp_s(const char *dest, rsize_t dmax, const char *src, int *indicator); 72 73 /* fixed field string compare */ 74 extern errno_t strcmpfld_s(const char *dest, rsize_t dmax, const char *src, int *indicator); 75 76 #endif 77 78 #ifndef HAVE_STRCPY_S 79 /* string copy */ 80 extern errno_t strcpy_s(char *dest, rsize_t dmax, const char *src); 81 #endif 82 83 #if 0 84 85 /* string copy */ 86 extern char *stpcpy_s(char *dest, rsize_t dmax, const char *src, errno_t *err); 87 88 /* string copy */ 89 extern char *stpncpy_s(char *dest, rsize_t dmax, const char *src, rsize_t smax, errno_t *err); 90 91 /* fixed char array copy */ 92 extern errno_t strcpyfld_s(char *dest, rsize_t dmax, const char *src, rsize_t slen); 93 94 /* copy from a null terminated string to fixed char array */ 95 extern errno_t strcpyfldin_s(char *dest, rsize_t dmax, const char *src, rsize_t slen); 96 97 /* copy from a char array to null terminated string */ 98 extern errno_t strcpyfldout_s(char *dest, rsize_t dmax, const char *src, rsize_t slen); 99 100 /* computes excluded prefix length */ 101 extern errno_t strcspn_s(const char *dest, rsize_t dmax, const char *src, rsize_t slen, 102 rsize_t *count); 103 104 /* returns a pointer to the first occurrence of c in dest */ 105 extern errno_t strfirstchar_s(char *dest, rsize_t dmax, char c, char **first); 106 107 /* returns index of first difference */ 108 extern errno_t strfirstdiff_s(const char *dest, rsize_t dmax, const char *src, rsize_t *index); 109 110 /* validate alphanumeric string */ 111 extern bool strisalphanumeric_s(const char *str, rsize_t slen); 112 113 /* validate ascii string */ 114 extern bool strisascii_s(const char *str, rsize_t slen); 115 116 /* validate string of digits */ 117 extern bool strisdigit_s(const char *str, rsize_t slen); 118 119 /* validate hex string */ 120 extern bool strishex_s(const char *str, rsize_t slen); 121 122 /* validate lower case */ 123 extern bool strislowercase_s(const char *str, rsize_t slen); 124 125 /* validate mixed case */ 126 extern bool strismixedcase_s(const char *str, rsize_t slen); 127 128 /* validate password */ 129 extern bool strispassword_s(const char *str, rsize_t slen); 130 131 /* validate upper case */ 132 extern bool strisuppercase_s(const char *str, rsize_t slen); 133 134 /* returns a pointer to the last occurrence of c in s1 */ 135 extern errno_t strlastchar_s(char *str, rsize_t smax, char c, char **first); 136 137 /* returns index of last difference */ 138 extern errno_t strlastdiff_s(const char *dest, rsize_t dmax, const char *src, rsize_t *index); 139 140 /* left justify */ 141 extern errno_t strljustify_s(char *dest, rsize_t dmax); 142 143 /* fitted string concatenate */ 144 extern errno_t strncat_s(char *dest, rsize_t dmax, const char *src, rsize_t slen); 145 146 #endif 147 148 #ifndef HAVE_STRNCPY_S 149 /* fitted string copy */ 150 extern errno_t strncpy_s(char *dest, rsize_t dmax, const char *src, rsize_t slen); 151 #endif 152 153 #ifndef HAVE_STRNLEN_S 154 /* string length */ 155 extern rsize_t strnlen_s(const char *s, rsize_t smax); 156 #endif 157 158 #if 0 159 160 /* string terminate */ 161 extern rsize_t strnterminate_s(char *s, rsize_t smax); 162 163 /* get pointer to first occurrence from set of char */ 164 extern errno_t strpbrk_s(char *dest, rsize_t dmax, char *src, rsize_t slen, char **first); 165 166 extern errno_t strfirstsame_s(const char *dest, rsize_t dmax, const char *src, rsize_t *index); 167 168 extern errno_t strlastsame_s(const char *dest, rsize_t dmax, const char *src, rsize_t *index); 169 170 /* searches for a prefix */ 171 extern errno_t strprefix_s(const char *dest, rsize_t dmax, const char *src); 172 173 /* removes leading and trailing white space */ 174 extern errno_t strremovews_s(char *dest, rsize_t dmax); 175 176 /* computes inclusive prefix length */ 177 extern errno_t strspn_s(const char *dest, rsize_t dmax, const char *src, rsize_t slen, 178 rsize_t *count); 179 180 /* find a substring */ 181 extern errno_t strstr_s(char *dest, rsize_t dmax, const char *src, rsize_t slen, char **substring); 182 183 /* string tokenizer */ 184 extern char *strtok_s(char *s1, rsize_t *s1max, const char *src, char **ptr); 185 186 /* convert string to lowercase */ 187 extern errno_t strtolowercase_s(char *str, rsize_t slen); 188 189 /* convert string to uppercase */ 190 extern errno_t strtouppercase_s(char *str, rsize_t slen); 191 192 /* zero an entire string with nulls */ 193 extern errno_t strzero_s(char *dest, rsize_t dmax); 194 195 /* wide string copy */ 196 extern wchar_t *wcpcpy_s(wchar_t *dest, rsize_t dmax, const wchar_t *src, errno_t *err); 197 198 /* wide string concatenate */ 199 extern errno_t wcscat_s(wchar_t *dest, rsize_t dmax, const wchar_t *src); 200 201 /* fitted wide string concatenate */ 202 extern errno_t wcsncat_s(wchar_t *dest, rsize_t dmax, const wchar_t *src, rsize_t slen); 203 204 /* wide string copy */ 205 errno_t wcscpy_s(wchar_t *dest, rsize_t dmax, const wchar_t *src); 206 207 /* fitted wide string copy */ 208 extern errno_t wcsncpy_s(wchar_t *dest, rsize_t dmax, const wchar_t *src, rsize_t slen); 209 210 /* wide string length */ 211 extern rsize_t wcsnlen_s(const wchar_t *dest, rsize_t dmax); 212 #endif 213 214 #endif /* __SAFE_STR_LIB_H__ */ 215