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 };