File indexing completed on 2024-05-19 04:06:43
0001 /* profiles.c Definitions of stringprep profiles. 0002 * Copyright (C) 2002, 2003 Simon Josefsson 0003 * 0004 * This file is part of GNU Libidn. 0005 * 0006 * GNU Libidn is free software; you can redistribute it and/or 0007 * modify it under the terms of the GNU Lesser General Public 0008 * License as published by the Free Software Foundation; either 0009 * version 2.1 of the License, or (at your option) any later version. 0010 * 0011 * GNU Libidn is distributed in the hope that it will be useful, 0012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0014 * Lesser General Public License for more details. 0015 * 0016 * You should have received a copy of the GNU Lesser General Public 0017 * License along with GNU Libidn; if not, write to the Free Software 0018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 0019 * 0020 */ 0021 0022 #include "internal.h" 0023 0024 Stringprep_profiles stringprep_profiles[] = { 0025 {"generic", stringprep_generic} 0026 , 0027 {"Nameprep", stringprep_nameprep} 0028 , 0029 {"KRBprep", stringprep_kerberos5} 0030 , 0031 {"Nodeprep", stringprep_xmpp_nodeprep} 0032 , 0033 {"Resourceprep", stringprep_xmpp_resourceprep} 0034 , 0035 {"plain", stringprep_plain} 0036 , 0037 {"SASLprep", stringprep_saslprep} 0038 , 0039 {"ISCSIprep", stringprep_iscsi} 0040 , 0041 {NULL, NULL} 0042 }; 0043 0044 Stringprep_profile stringprep_generic[] = { 0045 /* 1) Map -- For each character in the input, check if it has a 0046 mapping and, if so, replace it with its mapping. This is 0047 described in section 3. */ 0048 0049 {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1, "B.1"} 0050 , 0051 {STRINGPREP_MAP_TABLE, ~STRINGPREP_NO_NFKC, stringprep_rfc3454_B_2, "B.2"} 0052 , 0053 {STRINGPREP_MAP_TABLE, STRINGPREP_NO_NFKC, stringprep_rfc3454_B_3, "B.3"} 0054 , 0055 0056 /* 2) Normalize -- Possibly normalize the result of step 1 using 0057 Unicode normalization. This is described in section 4. */ 0058 0059 {STRINGPREP_NFKC, ~STRINGPREP_NO_NFKC, 0, "NFKC"} 0060 , 0061 0062 /* 3) Prohibit -- Check for any characters that are not allowed in 0063 the output. If any are found, return an error. This is 0064 described in section 5. */ 0065 0066 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_1, "C.1.1"} 0067 , 0068 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_2, "C.1.2"} 0069 , 0070 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1, "C.2.1"} 0071 , 0072 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2, "C.2.2"} 0073 , 0074 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3, "C.3"} 0075 , 0076 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4, "C.4"} 0077 , 0078 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5, "C.5"} 0079 , 0080 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6, "C.6"} 0081 , 0082 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7, "C.7"} 0083 , 0084 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0085 , 0086 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9, "C.9"} 0087 , 0088 0089 /* 4) Check bidi -- Possibly check for right-to-left characters, and 0090 if any are found, make sure that the whole string satisfies 0091 the requirements for bidirectional strings. If the string does 0092 not satisfy the requirements for bidirectional strings, return 0093 an error. This is described in section 6. */ 0094 0095 {STRINGPREP_BIDI, ~STRINGPREP_NO_BIDI, 0, "BIDI"} 0096 , 0097 {STRINGPREP_BIDI_PROHIBIT_TABLE, ~STRINGPREP_NO_BIDI, 0098 stringprep_rfc3454_C_8, "C.8"} 0099 , 0100 {STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_1, 0101 "D.1"} 0102 , 0103 {STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_2, 0104 "D.2"} 0105 , 0106 0107 /* 5) Check unassigned code points -- Possibly check the output for 0108 unassigned code points, according to the profile. This is 0109 described in section 7. */ 0110 0111 {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, 0112 stringprep_rfc3454_A_1, "A.1"} 0113 , 0114 0115 {0} 0116 }; 0117 0118 Stringprep_profile stringprep_nameprep[] = { 0119 {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1, "B.1"} 0120 , 0121 {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_2, "B.2"} 0122 , 0123 {STRINGPREP_NFKC, 0, 0, "NFKC"} 0124 , 0125 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_2, "C.1.2"} 0126 , 0127 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2, "C.2.2"} 0128 , 0129 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3, "C.3"} 0130 , 0131 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4, "C.4"} 0132 , 0133 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5, "C.5"} 0134 , 0135 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6, "C.6"} 0136 , 0137 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7, "C.7"} 0138 , 0139 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0140 , 0141 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9, "C.9"} 0142 , 0143 {STRINGPREP_BIDI, 0, 0, "BIDI"} 0144 , 0145 {STRINGPREP_BIDI_PROHIBIT_TABLE, ~STRINGPREP_NO_BIDI, 0146 stringprep_rfc3454_C_8, "C.8"} 0147 , 0148 {STRINGPREP_BIDI_RAL_TABLE, 0, stringprep_rfc3454_D_1, "D.1"} 0149 , 0150 {STRINGPREP_BIDI_L_TABLE, 0, stringprep_rfc3454_D_2, "D.2"} 0151 , 0152 {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, 0153 stringprep_rfc3454_A_1, "A.1"} 0154 , 0155 {0} 0156 }; 0157 0158 Stringprep_profile stringprep_kerberos5[] = { 0159 /* XXX this is likely to be wrong as the specification is 0160 a rough draft. */ 0161 {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1, "B.1"} 0162 , 0163 {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_3, "B.2"} 0164 , 0165 {STRINGPREP_NFKC, 0, 0, "NFKC"} 0166 , 0167 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_2, "C.1.2"} 0168 , 0169 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2, "C.2.2"} 0170 , 0171 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3, "C.3"} 0172 , 0173 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4, "C.4"} 0174 , 0175 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5, "C.5"} 0176 , 0177 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6, "C.6"} 0178 , 0179 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7, "C.7"} 0180 , 0181 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0182 , 0183 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9, "C.9"} 0184 , 0185 {STRINGPREP_BIDI, 0, 0, "BIDI"} 0186 , 0187 {STRINGPREP_BIDI_PROHIBIT_TABLE, ~STRINGPREP_NO_BIDI, 0188 stringprep_rfc3454_C_8, "C.8"} 0189 , 0190 {STRINGPREP_BIDI_RAL_TABLE, 0, stringprep_rfc3454_D_1, "D.1"} 0191 , 0192 {STRINGPREP_BIDI_L_TABLE, 0, stringprep_rfc3454_D_2, "D.2"} 0193 , 0194 {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, 0195 stringprep_rfc3454_A_1, "A.1"} 0196 , 0197 {0} 0198 }; 0199 0200 Stringprep_table_element stringprep_xmpp_nodeprep_prohibit[] = { 0201 {0x000022} 0202 , /* #x22 (") */ 0203 {0x000026} 0204 , /* #x26 (&) */ 0205 {0x000027} 0206 , /* #x27 (') */ 0207 {0x00002F} 0208 , /* #x2F (/) */ 0209 {0x00003A} 0210 , /* #x3A (:) */ 0211 {0x00003C} 0212 , /* #x3C (<) */ 0213 {0x00003E} 0214 , /* #x3E (>) */ 0215 {0x000040} /* #x40 (@) */ 0216 , 0217 {0} 0218 }; 0219 0220 Stringprep_profile stringprep_xmpp_nodeprep[] = { 0221 {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1, "B.1"} 0222 , 0223 {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_2, "B.2"} 0224 , 0225 {STRINGPREP_NFKC, 0, 0, "NFKC"} 0226 , 0227 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_1, "C.1.1"} 0228 , 0229 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_2, "C.1.2"} 0230 , 0231 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1, "C.2.1"} 0232 , 0233 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2, "C.2.2"} 0234 , 0235 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3, "C.3"} 0236 , 0237 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4, "C.4"} 0238 , 0239 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5, "C.5"} 0240 , 0241 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6, "C.6"} 0242 , 0243 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7, "C.7"} 0244 , 0245 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0246 , 0247 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9, "C.9"} 0248 , 0249 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_xmpp_nodeprep_prohibit, 0250 "XMPP-PROHIBIT"} 0251 , 0252 {STRINGPREP_BIDI, 0, 0, "BIDI"} 0253 , 0254 {STRINGPREP_BIDI_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0255 , 0256 {STRINGPREP_BIDI_RAL_TABLE, 0, stringprep_rfc3454_D_1, "D.1"} 0257 , 0258 {STRINGPREP_BIDI_L_TABLE, 0, stringprep_rfc3454_D_2, "D.2"} 0259 , 0260 {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, 0261 stringprep_rfc3454_A_1, "A.1"} 0262 , 0263 {0} 0264 }; 0265 0266 Stringprep_profile stringprep_xmpp_resourceprep[] = { 0267 {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1, "B.1"} 0268 , 0269 {STRINGPREP_NFKC, 0, 0, "NFKC"} 0270 , 0271 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_2, "C.1.2"} 0272 , 0273 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1, "C.2.1"} 0274 , 0275 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2, "C.2.2"} 0276 , 0277 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3, "C.3"} 0278 , 0279 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4, "C.4"} 0280 , 0281 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5, "C.5"} 0282 , 0283 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6, "C.6"} 0284 , 0285 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7, "C.7"} 0286 , 0287 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0288 , 0289 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9, "C.9"} 0290 , 0291 {STRINGPREP_BIDI, 0, 0, "BIDI"} 0292 , 0293 {STRINGPREP_BIDI_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0294 , 0295 {STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_1, 0296 "D.1"} 0297 , 0298 {STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_2, 0299 "D.2"} 0300 , 0301 {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, 0302 stringprep_rfc3454_A_1, "A.1"} 0303 , 0304 {0} 0305 }; 0306 0307 Stringprep_profile stringprep_plain[] = { 0308 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1, "C.2.1"} 0309 , 0310 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2, "C.2.2"} 0311 , 0312 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3, "C.3"} 0313 , 0314 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4, "C.4"} 0315 , 0316 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5, "C.5"} 0317 , 0318 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6, "C.6"} 0319 , 0320 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0321 , 0322 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9, "C.9"} 0323 , 0324 {STRINGPREP_BIDI, 0, 0, "BIDI"} 0325 , 0326 {STRINGPREP_BIDI_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0327 , 0328 {STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_1, 0329 "D.1"} 0330 , 0331 {STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_2, 0332 "D.2"} 0333 , 0334 {0} 0335 }; 0336 0337 Stringprep_table_element stringprep_iscsi_prohibit[] = { 0338 {0x0000} 0339 , /* [ASCII CONTROL CHARACTERS and SPACE through ,] */ 0340 {0x0001} 0341 , 0342 {0x0002} 0343 , 0344 {0x0003} 0345 , 0346 {0x0004} 0347 , 0348 {0x0005} 0349 , 0350 {0x0006} 0351 , 0352 {0x0007} 0353 , 0354 {0x0008} 0355 , 0356 {0x0009} 0357 , 0358 {0x000A} 0359 , 0360 {0x000B} 0361 , 0362 {0x000C} 0363 , 0364 {0x000D} 0365 , 0366 {0x000E} 0367 , 0368 {0x000F} 0369 , 0370 {0x0010} 0371 , 0372 {0x0011} 0373 , 0374 {0x0012} 0375 , 0376 {0x0013} 0377 , 0378 {0x0014} 0379 , 0380 {0x0015} 0381 , 0382 {0x0016} 0383 , 0384 {0x0017} 0385 , 0386 {0x0018} 0387 , 0388 {0x0019} 0389 , 0390 {0x001A} 0391 , 0392 {0x001B} 0393 , 0394 {0x001C} 0395 , 0396 {0x001D} 0397 , 0398 {0x001E} 0399 , 0400 {0x001F} 0401 , 0402 {0x0020} 0403 , 0404 {0x0021} 0405 , 0406 {0x0022} 0407 , 0408 {0x0023} 0409 , 0410 {0x0024} 0411 , 0412 {0x0025} 0413 , 0414 {0x0026} 0415 , 0416 {0x0027} 0417 , 0418 {0x0028} 0419 , 0420 {0x0029} 0421 , 0422 {0x002A} 0423 , 0424 {0x002B} 0425 , 0426 {0x002C} 0427 , 0428 {0x002F} 0429 , /* [ASCII /] */ 0430 {0x003B} 0431 , /* [ASCII ; through @] */ 0432 {0x003C} 0433 , 0434 {0x003D} 0435 , 0436 {0x003E} 0437 , 0438 {0x003F} 0439 , 0440 {0x0040} 0441 , 0442 {0x005B} 0443 , /* [ASCII [ through `] */ 0444 {0x005C} 0445 , 0446 {0x005D} 0447 , 0448 {0x005E} 0449 , 0450 {0x005F} 0451 , 0452 {0x0060} 0453 , 0454 {0x007B} 0455 , /* [ASCII { through DEL] */ 0456 {0x007C} 0457 , 0458 {0x007D} 0459 , 0460 {0x007E} 0461 , 0462 {0x007F} 0463 , 0464 {0x3002} 0465 , /* ideographic full stop */ 0466 {0} 0467 }; 0468 0469 Stringprep_profile stringprep_iscsi[] = { 0470 {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1, "B.1"} 0471 , 0472 {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_2, "B.2"} 0473 , 0474 {STRINGPREP_NFKC, 0, 0, "NFKC"} 0475 , 0476 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1, "C.1.1"} 0477 , 0478 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2, "C.1.2"} 0479 , 0480 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1, "C.2.1"} 0481 , 0482 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2, "C.2.2"} 0483 , 0484 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3, "C.3"} 0485 , 0486 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4, "C.4"} 0487 , 0488 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5, "C.5"} 0489 , 0490 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6, "C.6"} 0491 , 0492 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0493 , 0494 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9, "C.9"} 0495 , 0496 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_iscsi_prohibit, "ISCSI-PROHIBIT"} 0497 , 0498 {STRINGPREP_BIDI, 0, 0, "BIDI"} 0499 , 0500 {STRINGPREP_BIDI_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0501 , 0502 {STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_1, 0503 "D.1"} 0504 , 0505 {STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_2, 0506 "D.2"} 0507 , 0508 {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, 0509 stringprep_rfc3454_A_1, "A.1"} 0510 , 0511 {0} 0512 }; 0513 0514 Stringprep_table_element stringprep_saslprep_space_map[] = { 0515 {0x0000A0, 0, {0x0020} 0516 } 0517 , /* 00A0; NO-BREAK SPACE */ 0518 {0x001680, 0, {0x0020} 0519 } 0520 , /* 1680; OGHAM SPACE MARK */ 0521 {0x002000, 0, {0x0020} 0522 } 0523 , /* 2000; EN QUAD */ 0524 {0x002001, 0, {0x0020} 0525 } 0526 , /* 2001; EM QUAD */ 0527 {0x002002, 0, {0x0020} 0528 } 0529 , /* 2002; EN SPACE */ 0530 {0x002003, 0, {0x0020} 0531 } 0532 , /* 2003; EM SPACE */ 0533 {0x002004, 0, {0x0020} 0534 } 0535 , /* 2004; THREE-PER-EM SPACE */ 0536 {0x002005, 0, {0x0020} 0537 } 0538 , /* 2005; FOUR-PER-EM SPACE */ 0539 {0x002006, 0, {0x0020} 0540 } 0541 , /* 2006; SIX-PER-EM SPACE */ 0542 {0x002007, 0, {0x0020} 0543 } 0544 , /* 2007; FIGURE SPACE */ 0545 {0x002008, 0, {0x0020} 0546 } 0547 , /* 2008; PUNCTUATION SPACE */ 0548 {0x002009, 0, {0x0020} 0549 } 0550 , /* 2009; THIN SPACE */ 0551 {0x00200A, 0, {0x0020} 0552 } 0553 , /* 200A; HAIR SPACE */ 0554 {0x00200B, 0, {0x0020} 0555 } 0556 , /* 200B; ZERO WIDTH SPACE */ 0557 {0x00202F, 0, {0x0020} 0558 } 0559 , /* 202F; NARROW NO-BREAK SPACE */ 0560 {0x00205F, 0, {0x0020} 0561 } 0562 , /* 205F; MEDIUM MATHEMATICAL SPACE */ 0563 {0x003000, 0, {0x0020} 0564 } 0565 , /* 3000; IDEOGRAPHIC SPACE */ 0566 {0} 0567 }; 0568 0569 Stringprep_profile stringprep_saslprep[] = { 0570 {STRINGPREP_MAP_TABLE, 0, stringprep_saslprep_space_map, "SASL-SPACE-MAP"} 0571 , 0572 {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1, "B.1"} 0573 , 0574 {STRINGPREP_NFKC, 0, 0, "NFKC"} 0575 , 0576 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2, "C.1.2"} 0577 , 0578 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1, "C.2.1"} 0579 , 0580 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2, "C.2.2"} 0581 , 0582 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3, "C.3"} 0583 , 0584 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4, "C.4"} 0585 , 0586 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5, "C.5"} 0587 , 0588 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6, "C.6"} 0589 , 0590 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7, "C.7"} 0591 , 0592 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0593 , 0594 {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9, "C.9"} 0595 , 0596 {STRINGPREP_BIDI, 0, 0, "BIDI"} 0597 , 0598 {STRINGPREP_BIDI_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8, "C.8"} 0599 , 0600 {STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_1, 0601 "D.1"} 0602 , 0603 {STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_2, 0604 "D.2"} 0605 , 0606 {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, 0607 stringprep_rfc3454_A_1, "A.1"} 0608 , 0609 {0} 0610 };