xref: /freebsd/crypto/heimdal/lib/wind/rfc3492.txt (revision 61e21613)
1
2
3
4
5
6
7Network Working Group                                        A. Costello
8Request for Comments: 3492                 Univ. of California, Berkeley
9Category: Standards Track                                     March 2003
10
11
12              Punycode: A Bootstring encoding of Unicode
13       for Internationalized Domain Names in Applications (IDNA)
14
15Status of this Memo
16
17   This document specifies an Internet standards track protocol for the
18   Internet community, and requests discussion and suggestions for
19   improvements.  Please refer to the current edition of the "Internet
20   Official Protocol Standards" (STD 1) for the standardization state
21   and status of this protocol.  Distribution of this memo is unlimited.
22
23Copyright Notice
24
25   Copyright (C) The Internet Society (2003).  All Rights Reserved.
26
27Abstract
28
29   Punycode is a simple and efficient transfer encoding syntax designed
30   for use with Internationalized Domain Names in Applications (IDNA).
31   It uniquely and reversibly transforms a Unicode string into an ASCII
32   string.  ASCII characters in the Unicode string are represented
33   literally, and non-ASCII characters are represented by ASCII
34   characters that are allowed in host name labels (letters, digits, and
35   hyphens).  This document defines a general algorithm called
36   Bootstring that allows a string of basic code points to uniquely
37   represent any string of code points drawn from a larger set.
38   Punycode is an instance of Bootstring that uses particular parameter
39   values specified by this document, appropriate for IDNA.
40
41Table of Contents
42
43   1. Introduction...............................................2
44       1.1 Features..............................................2
45       1.2 Interaction of protocol parts.........................3
46   2. Terminology................................................3
47   3. Bootstring description.....................................4
48       3.1 Basic code point segregation..........................4
49       3.2 Insertion unsort coding...............................4
50       3.3 Generalized variable-length integers..................5
51       3.4 Bias adaptation.......................................7
52   4. Bootstring parameters......................................8
53   5. Parameter values for Punycode..............................8
54   6. Bootstring algorithms......................................9
55
56
57
58Costello                    Standards Track                     [Page 1]
59
60RFC 3492                     IDNA Punycode                    March 2003
61
62
63       6.1 Bias adaptation function.............................10
64       6.2 Decoding procedure...................................11
65       6.3 Encoding procedure...................................12
66       6.4 Overflow handling....................................13
67   7. Punycode examples.........................................14
68       7.1 Sample strings.......................................14
69       7.2 Decoding traces......................................17
70       7.3 Encoding traces......................................19
71   8. Security Considerations...................................20
72   9. References................................................21
73       9.1 Normative References.................................21
74       9.2 Informative References...............................21
75   A. Mixed-case annotation.....................................22
76   B. Disclaimer and license....................................22
77   C. Punycode sample implementation............................23
78   Author's Address.............................................34
79   Full Copyright Statement.....................................35
80
811. Introduction
82
83   [IDNA] describes an architecture for supporting internationalized
84   domain names.  Labels containing non-ASCII characters can be
85   represented by ACE labels, which begin with a special ACE prefix and
86   contain only ASCII characters.  The remainder of the label after the
87   prefix is a Punycode encoding of a Unicode string satisfying certain
88   constraints.  For the details of the prefix and constraints, see
89   [IDNA] and [NAMEPREP].
90
91   Punycode is an instance of a more general algorithm called
92   Bootstring, which allows strings composed from a small set of "basic"
93   code points to uniquely represent any string of code points drawn
94   from a larger set.  Punycode is Bootstring with particular parameter
95   values appropriate for IDNA.
96
971.1 Features
98
99   Bootstring has been designed to have the following features:
100
101   *  Completeness:  Every extended string (sequence of arbitrary code
102      points) can be represented by a basic string (sequence of basic
103      code points).  Restrictions on what strings are allowed, and on
104      length, can be imposed by higher layers.
105
106   *  Uniqueness:  There is at most one basic string that represents a
107      given extended string.
108
109   *  Reversibility:  Any extended string mapped to a basic string can
110      be recovered from that basic string.
111
112
113
114Costello                    Standards Track                     [Page 2]
115
116RFC 3492                     IDNA Punycode                    March 2003
117
118
119   *  Efficient encoding:  The ratio of basic string length to extended
120      string length is small.  This is important in the context of
121      domain names because RFC 1034 [RFC1034] restricts the length of a
122      domain label to 63 characters.
123
124   *  Simplicity:  The encoding and decoding algorithms are reasonably
125      simple to implement.  The goals of efficiency and simplicity are
126      at odds; Bootstring aims at a good balance between them.
127
128   *  Readability:  Basic code points appearing in the extended string
129      are represented as themselves in the basic string (although the
130      main purpose is to improve efficiency, not readability).
131
132   Punycode can also support an additional feature that is not used by
133   the ToASCII and ToUnicode operations of [IDNA].  When extended
134   strings are case-folded prior to encoding, the basic string can use
135   mixed case to tell how to convert the folded string into a mixed-case
136   string.  See appendix A "Mixed-case annotation".
137
1381.2 Interaction of protocol parts
139
140   Punycode is used by the IDNA protocol [IDNA] for converting domain
141   labels into ASCII; it is not designed for any other purpose.  It is
142   explicitly not designed for processing arbitrary free text.
143
1442. Terminology
145
146   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
147   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
148   document are to be interpreted as described in BCP 14, RFC 2119
149   [RFC2119].
150
151   A code point is an integral value associated with a character in a
152   coded character set.
153
154   As in the Unicode Standard [UNICODE], Unicode code points are denoted
155   by "U+" followed by four to six hexadecimal digits, while a range of
156   code points is denoted by two hexadecimal numbers separated by "..",
157   with no prefixes.
158
159   The operators div and mod perform integer division; (x div y) is the
160   quotient of x divided by y, discarding the remainder, and (x mod y)
161   is the remainder, so (x div y) * y + (x mod y) == x.  Bootstring uses
162   these operators only with nonnegative operands, so the quotient and
163   remainder are always nonnegative.
164
165   The break statement jumps out of the innermost loop (as in C).
166
167
168
169
170Costello                    Standards Track                     [Page 3]
171
172RFC 3492                     IDNA Punycode                    March 2003
173
174
175   An overflow is an attempt to compute a value that exceeds the maximum
176   value of an integer variable.
177
1783. Bootstring description
179
180   Bootstring represents an arbitrary sequence of code points (the
181   "extended string") as a sequence of basic code points (the "basic
182   string").  This section describes the representation.  Section 6
183   "Bootstring algorithms" presents the algorithms as pseudocode.
184   Sections 7.1 "Decoding traces" and 7.2 "Encoding traces" trace the
185   algorithms for sample inputs.
186
187   The following sections describe the four techniques used in
188   Bootstring.  "Basic code point segregation" is a very simple and
189   efficient encoding for basic code points occurring in the extended
190   string: they are simply copied all at once.  "Insertion unsort
191   coding" encodes the non-basic code points as deltas, and processes
192   the code points in numerical order rather than in order of
193   appearance, which typically results in smaller deltas.  The deltas
194   are represented as "generalized variable-length integers", which use
195   basic code points to represent nonnegative integers.  The parameters
196   of this integer representation are dynamically adjusted using "bias
197   adaptation", to improve efficiency when consecutive deltas have
198   similar magnitudes.
199
2003.1 Basic code point segregation
201
202   All basic code points appearing in the extended string are
203   represented literally at the beginning of the basic string, in their
204   original order, followed by a delimiter if (and only if) the number
205   of basic code points is nonzero.  The delimiter is a particular basic
206   code point, which never appears in the remainder of the basic string.
207   The decoder can therefore find the end of the literal portion (if
208   there is one) by scanning for the last delimiter.
209
2103.2 Insertion unsort coding
211
212   The remainder of the basic string (after the last delimiter if there
213   is one) represents a sequence of nonnegative integral deltas as
214   generalized variable-length integers, described in section 3.3.  The
215   meaning of the deltas is best understood in terms of the decoder.
216
217   The decoder builds the extended string incrementally.  Initially, the
218   extended string is a copy of the literal portion of the basic string
219   (excluding the last delimiter).  The decoder inserts non-basic code
220   points, one for each delta, into the extended string, ultimately
221   arriving at the final decoded string.
222
223
224
225
226Costello                    Standards Track                     [Page 4]
227
228RFC 3492                     IDNA Punycode                    March 2003
229
230
231   At the heart of this process is a state machine with two state
232   variables: an index i and a counter n.  The index i refers to a
233   position in the extended string; it ranges from 0 (the first
234   position) to the current length of the extended string (which refers
235   to a potential position beyond the current end).  If the current
236   state is <n,i>, the next state is <n,i+1> if i is less than the
237   length of the extended string, or <n+1,0> if i equals the length of
238   the extended string.  In other words, each state change causes i to
239   increment, wrapping around to zero if necessary, and n counts the
240   number of wrap-arounds.
241
242   Notice that the state always advances monotonically (there is no way
243   for the decoder to return to an earlier state).  At each state, an
244   insertion is either performed or not performed.  At most one
245   insertion is performed in a given state.  An insertion inserts the
246   value of n at position i in the extended string.  The deltas are a
247   run-length encoding of this sequence of events: they are the lengths
248   of the runs of non-insertion states preceeding the insertion states.
249   Hence, for each delta, the decoder performs delta state changes, then
250   an insertion, and then one more state change.  (An implementation
251   need not perform each state change individually, but can instead use
252   division and remainder calculations to compute the next insertion
253   state directly.)  It is an error if the inserted code point is a
254   basic code point (because basic code points were supposed to be
255   segregated as described in section 3.1).
256
257   The encoder's main task is to derive the sequence of deltas that will
258   cause the decoder to construct the desired string.  It can do this by
259   repeatedly scanning the extended string for the next code point that
260   the decoder would need to insert, and counting the number of state
261   changes the decoder would need to perform, mindful of the fact that
262   the decoder's extended string will include only those code points
263   that have already been inserted.  Section 6.3 "Encoding procedure"
264   gives a precise algorithm.
265
2663.3 Generalized variable-length integers
267
268   In a conventional integer representation the base is the number of
269   distinct symbols for digits, whose values are 0 through base-1.  Let
270   digit_0 denote the least significant digit, digit_1 the next least
271   significant, and so on.  The value represented is the sum over j of
272   digit_j * w(j), where w(j) = base^j is the weight (scale factor) for
273   position j.  For example, in the base 8 integer 437, the digits are
274   7, 3, and 4, and the weights are 1, 8, and 64, so the value is 7 +
275   3*8 + 4*64 = 287.  This representation has two disadvantages:  First,
276   there are multiple encodings of each value (because there can be
277   extra zeros in the most significant positions), which is inconvenient
278
279
280
281
282Costello                    Standards Track                     [Page 5]
283
284RFC 3492                     IDNA Punycode                    March 2003
285
286
287   when unique encodings are needed.  Second, the integer is not self-
288   delimiting, so if multiple integers are concatenated the boundaries
289   between them are lost.
290
291   The generalized variable-length representation solves these two
292   problems.  The digit values are still 0 through base-1, but now the
293   integer is self-delimiting by means of thresholds t(j), each of which
294   is in the range 0 through base-1.  Exactly one digit, the most
295   significant, satisfies digit_j < t(j).  Therefore, if several
296   integers are concatenated, it is easy to separate them, starting with
297   the first if they are little-endian (least significant digit first),
298   or starting with the last if they are big-endian (most significant
299   digit first).  As before, the value is the sum over j of digit_j *
300   w(j), but the weights are different:
301
302      w(0) = 1
303      w(j) = w(j-1) * (base - t(j-1)) for j > 0
304
305   For example, consider the little-endian sequence of base 8 digits
306   734251...  Suppose the thresholds are 2, 3, 5, 5, 5, 5...  This
307   implies that the weights are 1, 1*(8-2) = 6, 6*(8-3) = 30, 30*(8-5) =
308   90, 90*(8-5) = 270, and so on.  7 is not less than 2, and 3 is not
309   less than 3, but 4 is less than 5, so 4 is the last digit.  The value
310   of 734 is 7*1 + 3*6 + 4*30 = 145.  The next integer is 251, with
311   value 2*1 + 5*6 + 1*30 = 62.  Decoding this representation is very
312   similar to decoding a conventional integer:  Start with a current
313   value of N = 0 and a weight w = 1.  Fetch the next digit d and
314   increase N by d * w.  If d is less than the current threshold (t)
315   then stop, otherwise increase w by a factor of (base - t), update t
316   for the next position, and repeat.
317
318   Encoding this representation is similar to encoding a conventional
319   integer:  If N < t then output one digit for N and stop, otherwise
320   output the digit for t + ((N - t) mod (base - t)), then replace N
321   with (N - t) div (base - t), update t for the next position, and
322   repeat.
323
324   For any particular set of values of t(j), there is exactly one
325   generalized variable-length representation of each nonnegative
326   integral value.
327
328   Bootstring uses little-endian ordering so that the deltas can be
329   separated starting with the first.  The t(j) values are defined in
330   terms of the constants base, tmin, and tmax, and a state variable
331   called bias:
332
333      t(j) = base * (j + 1) - bias,
334      clamped to the range tmin through tmax
335
336
337
338Costello                    Standards Track                     [Page 6]
339
340RFC 3492                     IDNA Punycode                    March 2003
341
342
343   The clamping means that if the formula yields a value less than tmin
344   or greater than tmax, then t(j) = tmin or tmax, respectively.  (In
345   the pseudocode in section 6 "Bootstring algorithms", the expression
346   base * (j + 1) is denoted by k for performance reasons.)  These t(j)
347   values cause the representation to favor integers within a particular
348   range determined by the bias.
349
3503.4 Bias adaptation
351
352   After each delta is encoded or decoded, bias is set for the next
353   delta as follows:
354
355   1. Delta is scaled in order to avoid overflow in the next step:
356
357         let delta = delta div 2
358
359      But when this is the very first delta, the divisor is not 2, but
360      instead a constant called damp.  This compensates for the fact
361      that the second delta is usually much smaller than the first.
362
363   2. Delta is increased to compensate for the fact that the next delta
364      will be inserting into a longer string:
365
366         let delta = delta + (delta div numpoints)
367
368      numpoints is the total number of code points encoded/decoded so
369      far (including the one corresponding to this delta itself, and
370      including the basic code points).
371
372   3. Delta is repeatedly divided until it falls within a threshold, to
373      predict the minimum number of digits needed to represent the next
374      delta:
375
376         while delta > ((base - tmin) * tmax) div 2
377         do let delta = delta div (base - tmin)
378
379   4. The bias is set:
380
381         let bias =
382           (base * the number of divisions performed in step 3) +
383           (((base - tmin + 1) * delta) div (delta + skew))
384
385      The motivation for this procedure is that the current delta
386      provides a hint about the likely size of the next delta, and so
387      t(j) is set to tmax for the more significant digits starting with
388      the one expected to be last, tmin for the less significant digits
389      up through the one expected to be third-last, and somewhere
390      between tmin and tmax for the digit expected to be second-last
391
392
393
394Costello                    Standards Track                     [Page 7]
395
396RFC 3492                     IDNA Punycode                    March 2003
397
398
399      (balancing the hope of the expected-last digit being unnecessary
400      against the danger of it being insufficient).
401
4024. Bootstring parameters
403
404   Given a set of basic code points, one needs to be designated as the
405   delimiter.  The base cannot be greater than the number of
406   distinguishable basic code points remaining.  The digit-values in the
407   range 0 through base-1 need to be associated with distinct non-
408   delimiter basic code points.  In some cases multiple code points need
409   to have the same digit-value; for example, uppercase and lowercase
410   versions of the same letter need to be equivalent if basic strings
411   are case-insensitive.
412
413   The initial value of n cannot be greater than the minimum non-basic
414   code point that could appear in extended strings.
415
416   The remaining five parameters (tmin, tmax, skew, damp, and the
417   initial value of bias) need to satisfy the following constraints:
418
419      0 <= tmin <= tmax <= base-1
420      skew >= 1
421      damp >= 2
422      initial_bias mod base <= base - tmin
423
424   Provided the constraints are satisfied, these five parameters affect
425   efficiency but not correctness.  They are best chosen empirically.
426
427   If support for mixed-case annotation is desired (see appendix A),
428   make sure that the code points corresponding to 0 through tmax-1 all
429   have both uppercase and lowercase forms.
430
4315. Parameter values for Punycode
432
433   Punycode uses the following Bootstring parameter values:
434
435      base         = 36
436      tmin         = 1
437      tmax         = 26
438      skew         = 38
439      damp         = 700
440      initial_bias = 72
441      initial_n    = 128 = 0x80
442
443   Although the only restriction Punycode imposes on the input integers
444   is that they be nonnegative, these parameters are especially designed
445   to work well with Unicode [UNICODE] code points, which are integers
446   in the range 0..10FFFF (but not D800..DFFF, which are reserved for
447
448
449
450Costello                    Standards Track                     [Page 8]
451
452RFC 3492                     IDNA Punycode                    March 2003
453
454
455   use by the UTF-16 encoding of Unicode).  The basic code points are
456   the ASCII [ASCII] code points (0..7F), of which U+002D (-) is the
457   delimiter, and some of the others have digit-values as follows:
458
459      code points    digit-values
460      ------------   ----------------------
461      41..5A (A-Z) =  0 to 25, respectively
462      61..7A (a-z) =  0 to 25, respectively
463      30..39 (0-9) = 26 to 35, respectively
464
465   Using hyphen-minus as the delimiter implies that the encoded string
466   can end with a hyphen-minus only if the Unicode string consists
467   entirely of basic code points, but IDNA forbids such strings from
468   being encoded.  The encoded string can begin with a hyphen-minus, but
469   IDNA prepends a prefix.  Therefore IDNA using Punycode conforms to
470   the RFC 952 rule that host name labels neither begin nor end with a
471   hyphen-minus [RFC952].
472
473   A decoder MUST recognize the letters in both uppercase and lowercase
474   forms (including mixtures of both forms).  An encoder SHOULD output
475   only uppercase forms or only lowercase forms, unless it uses mixed-
476   case annotation (see appendix A).
477
478   Presumably most users will not manually write or type encoded strings
479   (as opposed to cutting and pasting them), but those who do will need
480   to be alert to the potential visual ambiguity between the following
481   sets of characters:
482
483      G 6
484      I l 1
485      O 0
486      S 5
487      U V
488      Z 2
489
490   Such ambiguities are usually resolved by context, but in a Punycode
491   encoded string there is no context apparent to humans.
492
4936. Bootstring algorithms
494
495   Some parts of the pseudocode can be omitted if the parameters satisfy
496   certain conditions (for which Punycode qualifies).  These parts are
497   enclosed in {braces}, and notes immediately following the pseudocode
498   explain the conditions under which they can be omitted.
499
500
501
502
503
504
505
506Costello                    Standards Track                     [Page 9]
507
508RFC 3492                     IDNA Punycode                    March 2003
509
510
511   Formally, code points are integers, and hence the pseudocode assumes
512   that arithmetic operations can be performed directly on code points.
513   In some programming languages, explicit conversion between code
514   points and integers might be necessary.
515
5166.1 Bias adaptation function
517
518   function adapt(delta,numpoints,firsttime):
519     if firsttime then let delta = delta div damp
520     else let delta = delta div 2
521     let delta = delta + (delta div numpoints)
522     let k = 0
523     while delta > ((base - tmin) * tmax) div 2 do begin
524       let delta = delta div (base - tmin)
525       let k = k + base
526     end
527     return k + (((base - tmin + 1) * delta) div (delta + skew))
528
529   It does not matter whether the modifications to delta and k inside
530   adapt() affect variables of the same name inside the
531   encoding/decoding procedures, because after calling adapt() the
532   caller does not read those variables before overwriting them.
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562Costello                    Standards Track                    [Page 10]
563
564RFC 3492                     IDNA Punycode                    March 2003
565
566
5676.2 Decoding procedure
568
569   let n = initial_n
570   let i = 0
571   let bias = initial_bias
572   let output = an empty string indexed from 0
573   consume all code points before the last delimiter (if there is one)
574     and copy them to output, fail on any non-basic code point
575   if more than zero code points were consumed then consume one more
576     (which will be the last delimiter)
577   while the input is not exhausted do begin
578     let oldi = i
579     let w = 1
580     for k = base to infinity in steps of base do begin
581       consume a code point, or fail if there was none to consume
582       let digit = the code point's digit-value, fail if it has none
583       let i = i + digit * w, fail on overflow
584       let t = tmin if k <= bias {+ tmin}, or
585               tmax if k >= bias + tmax, or k - bias otherwise
586       if digit < t then break
587       let w = w * (base - t), fail on overflow
588     end
589     let bias = adapt(i - oldi, length(output) + 1, test oldi is 0?)
590     let n = n + i div (length(output) + 1), fail on overflow
591     let i = i mod (length(output) + 1)
592     {if n is a basic code point then fail}
593     insert n into output at position i
594     increment i
595   end
596
597   The full statement enclosed in braces (checking whether n is a basic
598   code point) can be omitted if initial_n exceeds all basic code points
599   (which is true for Punycode), because n is never less than initial_n.
600
601   In the assignment of t, where t is clamped to the range tmin through
602   tmax, "+ tmin" can always be omitted.  This makes the clamping
603   calculation incorrect when bias < k < bias + tmin, but that cannot
604   happen because of the way bias is computed and because of the
605   constraints on the parameters.
606
607   Because the decoder state can only advance monotonically, and there
608   is only one representation of any delta, there is therefore only one
609   encoded string that can represent a given sequence of integers.  The
610   only error conditions are invalid code points, unexpected end-of-
611   input, overflow, and basic code points encoded using deltas instead
612   of appearing literally.  If the decoder fails on these errors as
613   shown above, then it cannot produce the same output for two distinct
614   inputs.  Without this property it would have been necessary to re-
615
616
617
618Costello                    Standards Track                    [Page 11]
619
620RFC 3492                     IDNA Punycode                    March 2003
621
622
623   encode the output and verify that it matches the input in order to
624   guarantee the uniqueness of the encoding.
625
6266.3 Encoding procedure
627
628   let n = initial_n
629   let delta = 0
630   let bias = initial_bias
631   let h = b = the number of basic code points in the input
632   copy them to the output in order, followed by a delimiter if b > 0
633   {if the input contains a non-basic code point < n then fail}
634   while h < length(input) do begin
635     let m = the minimum {non-basic} code point >= n in the input
636     let delta = delta + (m - n) * (h + 1), fail on overflow
637     let n = m
638     for each code point c in the input (in order) do begin
639       if c < n {or c is basic} then increment delta, fail on overflow
640       if c == n then begin
641         let q = delta
642         for k = base to infinity in steps of base do begin
643           let t = tmin if k <= bias {+ tmin}, or
644                   tmax if k >= bias + tmax, or k - bias otherwise
645           if q < t then break
646           output the code point for digit t + ((q - t) mod (base - t))
647           let q = (q - t) div (base - t)
648         end
649         output the code point for digit q
650         let bias = adapt(delta, h + 1, test h equals b?)
651         let delta = 0
652         increment h
653       end
654     end
655     increment delta and n
656   end
657
658   The full statement enclosed in braces (checking whether the input
659   contains a non-basic code point less than n) can be omitted if all
660   code points less than initial_n are basic code points (which is true
661   for Punycode if code points are unsigned).
662
663   The brace-enclosed conditions "non-basic" and "or c is basic" can be
664   omitted if initial_n exceeds all basic code points (which is true for
665   Punycode), because the code point being tested is never less than
666   initial_n.
667
668   In the assignment of t, where t is clamped to the range tmin through
669   tmax, "+ tmin" can always be omitted.  This makes the clamping
670   calculation incorrect when bias < k < bias + tmin, but that cannot
671
672
673
674Costello                    Standards Track                    [Page 12]
675
676RFC 3492                     IDNA Punycode                    March 2003
677
678
679   happen because of the way bias is computed and because of the
680   constraints on the parameters.
681
682   The checks for overflow are necessary to avoid producing invalid
683   output when the input contains very large values or is very long.
684
685   The increment of delta at the bottom of the outer loop cannot
686   overflow because delta < length(input) before the increment, and
687   length(input) is already assumed to be representable.  The increment
688   of n could overflow, but only if h == length(input), in which case
689   the procedure is finished anyway.
690
6916.4 Overflow handling
692
693   For IDNA, 26-bit unsigned integers are sufficient to handle all valid
694   IDNA labels without overflow, because any string that needed a 27-bit
695   delta would have to exceed either the code point limit (0..10FFFF) or
696   the label length limit (63 characters).  However, overflow handling
697   is necessary because the inputs are not necessarily valid IDNA
698   labels.
699
700   If the programming language does not provide overflow detection, the
701   following technique can be used.  Suppose A, B, and C are
702   representable nonnegative integers and C is nonzero.  Then A + B
703   overflows if and only if B > maxint - A, and A + (B * C) overflows if
704   and only if B > (maxint - A) div C, where maxint is the greatest
705   integer for which maxint + 1 cannot be represented.  Refer to
706   appendix C "Punycode sample implementation" for demonstrations of
707   this technique in the C language.
708
709   The decoding and encoding algorithms shown in sections 6.2 and 6.3
710   handle overflow by detecting it whenever it happens.  Another
711   approach is to enforce limits on the inputs that prevent overflow
712   from happening.  For example, if the encoder were to verify that no
713   input code points exceed M and that the input length does not exceed
714   L, then no delta could ever exceed (M - initial_n) * (L + 1), and
715   hence no overflow could occur if integer variables were capable of
716   representing values that large.  This prevention approach would
717   impose more restrictions on the input than the detection approach
718   does, but might be considered simpler in some programming languages.
719
720   In theory, the decoder could use an analogous approach, limiting the
721   number of digits in a variable-length integer (that is, limiting the
722   number of iterations in the innermost loop).  However, the number of
723   digits that suffice to represent a given delta can sometimes
724   represent much larger deltas (because of the adaptation), and hence
725   this approach would probably need integers wider than 32 bits.
726
727
728
729
730Costello                    Standards Track                    [Page 13]
731
732RFC 3492                     IDNA Punycode                    March 2003
733
734
735   Yet another approach for the decoder is to allow overflow to occur,
736   but to check the final output string by re-encoding it and comparing
737   to the decoder input.  If and only if they do not match (using a
738   case-insensitive ASCII comparison) overflow has occurred.  This
739   delayed-detection approach would not impose any more restrictions on
740   the input than the immediate-detection approach does, and might be
741   considered simpler in some programming languages.
742
743   In fact, if the decoder is used only inside the IDNA ToUnicode
744   operation [IDNA], then it need not check for overflow at all, because
745   ToUnicode performs a higher level re-encoding and comparison, and a
746   mismatch has the same consequence as if the Punycode decoder had
747   failed.
748
7497. Punycode examples
750
7517.1 Sample strings
752
753   In the Punycode encodings below, the ACE prefix is not shown.
754   Backslashes show where line breaks have been inserted in strings too
755   long for one line.
756
757   The first several examples are all translations of the sentence "Why
758   can't they just speak in <language>?" (courtesy of Michael Kaplan's
759   "provincial" page [PROVINCIAL]).  Word breaks and punctuation have
760   been removed, as is often done in domain names.
761
762   (A) Arabic (Egyptian):
763       u+0644 u+064A u+0647 u+0645 u+0627 u+0628 u+062A u+0643 u+0644
764       u+0645 u+0648 u+0634 u+0639 u+0631 u+0628 u+064A u+061F
765       Punycode: egbpdaj6bu4bxfgehfvwxn
766
767   (B) Chinese (simplified):
768       u+4ED6 u+4EEC u+4E3A u+4EC0 u+4E48 u+4E0D u+8BF4 u+4E2D u+6587
769       Punycode: ihqwcrb4cv8a8dqg056pqjye
770
771   (C) Chinese (traditional):
772       u+4ED6 u+5011 u+7232 u+4EC0 u+9EBD u+4E0D u+8AAA u+4E2D u+6587
773       Punycode: ihqwctvzc91f659drss3x8bo0yb
774
775   (D) Czech: Pro<ccaron>prost<ecaron>nemluv<iacute><ccaron>esky
776       U+0050 u+0072 u+006F u+010D u+0070 u+0072 u+006F u+0073 u+0074
777       u+011B u+006E u+0065 u+006D u+006C u+0075 u+0076 u+00ED u+010D
778       u+0065 u+0073 u+006B u+0079
779       Punycode: Proprostnemluvesky-uyb24dma41a
780
781
782
783
784
785
786Costello                    Standards Track                    [Page 14]
787
788RFC 3492                     IDNA Punycode                    March 2003
789
790
791   (E) Hebrew:
792       u+05DC u+05DE u+05D4 u+05D4 u+05DD u+05E4 u+05E9 u+05D5 u+05D8
793       u+05DC u+05D0 u+05DE u+05D3 u+05D1 u+05E8 u+05D9 u+05DD u+05E2
794       u+05D1 u+05E8 u+05D9 u+05EA
795       Punycode: 4dbcagdahymbxekheh6e0a7fei0b
796
797   (F) Hindi (Devanagari):
798       u+092F u+0939 u+0932 u+094B u+0917 u+0939 u+093F u+0928 u+094D
799       u+0926 u+0940 u+0915 u+094D u+092F u+094B u+0902 u+0928 u+0939
800       u+0940 u+0902 u+092C u+094B u+0932 u+0938 u+0915 u+0924 u+0947
801       u+0939 u+0948 u+0902
802       Punycode: i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd
803
804   (G) Japanese (kanji and hiragana):
805       u+306A u+305C u+307F u+3093 u+306A u+65E5 u+672C u+8A9E u+3092
806       u+8A71 u+3057 u+3066 u+304F u+308C u+306A u+3044 u+306E u+304B
807       Punycode: n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa
808
809   (H) Korean (Hangul syllables):
810       u+C138 u+ACC4 u+C758 u+BAA8 u+B4E0 u+C0AC u+B78C u+B4E4 u+C774
811       u+D55C u+AD6D u+C5B4 u+B97C u+C774 u+D574 u+D55C u+B2E4 u+BA74
812       u+C5BC u+B9C8 u+B098 u+C88B u+C744 u+AE4C
813       Punycode: 989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5j\
814                 psd879ccm6fea98c
815
816   (I) Russian (Cyrillic):
817       U+043F u+043E u+0447 u+0435 u+043C u+0443 u+0436 u+0435 u+043E
818       u+043D u+0438 u+043D u+0435 u+0433 u+043E u+0432 u+043E u+0440
819       u+044F u+0442 u+043F u+043E u+0440 u+0443 u+0441 u+0441 u+043A
820       u+0438
821       Punycode: b1abfaaepdrnnbgefbaDotcwatmq2g4l
822
823   (J) Spanish: Porqu<eacute>nopuedensimplementehablarenEspa<ntilde>ol
824       U+0050 u+006F u+0072 u+0071 u+0075 u+00E9 u+006E u+006F u+0070
825       u+0075 u+0065 u+0064 u+0065 u+006E u+0073 u+0069 u+006D u+0070
826       u+006C u+0065 u+006D u+0065 u+006E u+0074 u+0065 u+0068 u+0061
827       u+0062 u+006C u+0061 u+0072 u+0065 u+006E U+0045 u+0073 u+0070
828       u+0061 u+00F1 u+006F u+006C
829       Punycode: PorqunopuedensimplementehablarenEspaol-fmd56a
830
831   (K) Vietnamese:
832       T<adotbelow>isaoh<odotbelow>kh<ocirc>ngth<ecirchookabove>ch\
833       <ihookabove>n<oacute>iti<ecircacute>ngVi<ecircdotbelow>t
834       U+0054 u+1EA1 u+0069 u+0073 u+0061 u+006F u+0068 u+1ECD u+006B
835       u+0068 u+00F4 u+006E u+0067 u+0074 u+0068 u+1EC3 u+0063 u+0068
836       u+1EC9 u+006E u+00F3 u+0069 u+0074 u+0069 u+1EBF u+006E u+0067
837       U+0056 u+0069 u+1EC7 u+0074
838       Punycode: TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g
839
840
841
842Costello                    Standards Track                    [Page 15]
843
844RFC 3492                     IDNA Punycode                    March 2003
845
846
847   The next several examples are all names of Japanese music artists,
848   song titles, and TV programs, just because the author happens to have
849   them handy (but Japanese is useful for providing examples of single-
850   row text, two-row text, ideographic text, and various mixtures
851   thereof).
852
853   (L) 3<nen>B<gumi><kinpachi><sensei>
854       u+0033 u+5E74 U+0042 u+7D44 u+91D1 u+516B u+5148 u+751F
855       Punycode: 3B-ww4c5e180e575a65lsy2b
856
857   (M) <amuro><namie>-with-SUPER-MONKEYS
858       u+5B89 u+5BA4 u+5948 u+7F8E u+6075 u+002D u+0077 u+0069 u+0074
859       u+0068 u+002D U+0053 U+0055 U+0050 U+0045 U+0052 u+002D U+004D
860       U+004F U+004E U+004B U+0045 U+0059 U+0053
861       Punycode: -with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n
862
863   (N) Hello-Another-Way-<sorezore><no><basho>
864       U+0048 u+0065 u+006C u+006C u+006F u+002D U+0041 u+006E u+006F
865       u+0074 u+0068 u+0065 u+0072 u+002D U+0057 u+0061 u+0079 u+002D
866       u+305D u+308C u+305E u+308C u+306E u+5834 u+6240
867       Punycode: Hello-Another-Way--fc4qua05auwb3674vfr0b
868
869   (O) <hitotsu><yane><no><shita>2
870       u+3072 u+3068 u+3064 u+5C4B u+6839 u+306E u+4E0B u+0032
871       Punycode: 2-u9tlzr9756bt3uc0v
872
873   (P) Maji<de>Koi<suru>5<byou><mae>
874       U+004D u+0061 u+006A u+0069 u+3067 U+004B u+006F u+0069 u+3059
875       u+308B u+0035 u+79D2 u+524D
876       Punycode: MajiKoi5-783gue6qz075azm5e
877
878   (Q) <pafii>de<runba>
879       u+30D1 u+30D5 u+30A3 u+30FC u+0064 u+0065 u+30EB u+30F3 u+30D0
880       Punycode: de-jg4avhby1noc0d
881
882   (R) <sono><supiido><de>
883       u+305D u+306E u+30B9 u+30D4 u+30FC u+30C9 u+3067
884       Punycode: d9juau41awczczp
885
886   The last example is an ASCII string that breaks the existing rules
887   for host name labels.  (It is not a realistic example for IDNA,
888   because IDNA never encodes pure ASCII labels.)
889
890   (S) -> $1.00 <-
891       u+002D u+003E u+0020 u+0024 u+0031 u+002E u+0030 u+0030 u+0020
892       u+003C u+002D
893       Punycode: -> $1.00 <--
894
895
896
897
898Costello                    Standards Track                    [Page 16]
899
900RFC 3492                     IDNA Punycode                    March 2003
901
902
9037.2 Decoding traces
904
905   In the following traces, the evolving state of the decoder is shown
906   as a sequence of hexadecimal values, representing the code points in
907   the extended string.  An asterisk appears just after the most
908   recently inserted code point, indicating both n (the value preceeding
909   the asterisk) and i (the position of the value just after the
910   asterisk).  Other numerical values are decimal.
911
912   Decoding trace of example B from section 7.1:
913
914   n is 128, i is 0, bias is 72
915   input is "ihqwcrb4cv8a8dqg056pqjye"
916   there is no delimiter, so extended string starts empty
917   delta "ihq" decodes to 19853
918   bias becomes 21
919   4E0D *
920   delta "wc" decodes to 64
921   bias becomes 20
922   4E0D 4E2D *
923   delta "rb" decodes to 37
924   bias becomes 13
925   4E3A * 4E0D 4E2D
926   delta "4c" decodes to 56
927   bias becomes 17
928   4E3A 4E48 * 4E0D 4E2D
929   delta "v8a" decodes to 599
930   bias becomes 32
931   4E3A 4EC0 * 4E48 4E0D 4E2D
932   delta "8d" decodes to 130
933   bias becomes 23
934   4ED6 * 4E3A 4EC0 4E48 4E0D 4E2D
935   delta "qg" decodes to 154
936   bias becomes 25
937   4ED6 4EEC * 4E3A 4EC0 4E48 4E0D 4E2D
938   delta "056p" decodes to 46301
939   bias becomes 84
940   4ED6 4EEC 4E3A 4EC0 4E48 4E0D 4E2D 6587 *
941   delta "qjye" decodes to 88531
942   bias becomes 90
943   4ED6 4EEC 4E3A 4EC0 4E48 4E0D 8BF4 * 4E2D 6587
944
945
946
947
948
949
950
951
952
953
954Costello                    Standards Track                    [Page 17]
955
956RFC 3492                     IDNA Punycode                    March 2003
957
958
959   Decoding trace of example L from section 7.1:
960
961   n is 128, i is 0, bias is 72
962   input is "3B-ww4c5e180e575a65lsy2b"
963   literal portion is "3B-", so extended string starts as:
964   0033 0042
965   delta "ww4c" decodes to 62042
966   bias becomes 27
967   0033 0042 5148 *
968   delta "5e" decodes to 139
969   bias becomes 24
970   0033 0042 516B * 5148
971   delta "180e" decodes to 16683
972   bias becomes 67
973   0033 5E74 * 0042 516B 5148
974   delta "575a" decodes to 34821
975   bias becomes 82
976   0033 5E74 0042 516B 5148 751F *
977   delta "65l" decodes to 14592
978   bias becomes 67
979   0033 5E74 0042 7D44 * 516B 5148 751F
980   delta "sy2b" decodes to 42088
981   bias becomes 84
982   0033 5E74 0042 7D44 91D1 * 516B 5148 751F
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010Costello                    Standards Track                    [Page 18]
1011
1012RFC 3492                     IDNA Punycode                    March 2003
1013
1014
10157.3 Encoding traces
1016
1017   In the following traces, code point values are hexadecimal, while
1018   other numerical values are decimal.
1019
1020   Encoding trace of example B from section 7.1:
1021
1022   bias is 72
1023   input is:
1024   4ED6 4EEC 4E3A 4EC0 4E48 4E0D 8BF4 4E2D 6587
1025   there are no basic code points, so no literal portion
1026   next code point to insert is 4E0D
1027   needed delta is 19853, encodes as "ihq"
1028   bias becomes 21
1029   next code point to insert is 4E2D
1030   needed delta is 64, encodes as "wc"
1031   bias becomes 20
1032   next code point to insert is 4E3A
1033   needed delta is 37, encodes as "rb"
1034   bias becomes 13
1035   next code point to insert is 4E48
1036   needed delta is 56, encodes as "4c"
1037   bias becomes 17
1038   next code point to insert is 4EC0
1039   needed delta is 599, encodes as "v8a"
1040   bias becomes 32
1041   next code point to insert is 4ED6
1042   needed delta is 130, encodes as "8d"
1043   bias becomes 23
1044   next code point to insert is 4EEC
1045   needed delta is 154, encodes as "qg"
1046   bias becomes 25
1047   next code point to insert is 6587
1048   needed delta is 46301, encodes as "056p"
1049   bias becomes 84
1050   next code point to insert is 8BF4
1051   needed delta is 88531, encodes as "qjye"
1052   bias becomes 90
1053   output is "ihqwcrb4cv8a8dqg056pqjye"
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066Costello                    Standards Track                    [Page 19]
1067
1068RFC 3492                     IDNA Punycode                    March 2003
1069
1070
1071   Encoding trace of example L from section 7.1:
1072
1073   bias is 72
1074   input is:
1075   0033 5E74 0042 7D44 91D1 516B 5148 751F
1076   basic code points (0033, 0042) are copied to literal portion: "3B-"
1077   next code point to insert is 5148
1078   needed delta is 62042, encodes as "ww4c"
1079   bias becomes 27
1080   next code point to insert is 516B
1081   needed delta is 139, encodes as "5e"
1082   bias becomes 24
1083   next code point to insert is 5E74
1084   needed delta is 16683, encodes as "180e"
1085   bias becomes 67
1086   next code point to insert is 751F
1087   needed delta is 34821, encodes as "575a"
1088   bias becomes 82
1089   next code point to insert is 7D44
1090   needed delta is 14592, encodes as "65l"
1091   bias becomes 67
1092   next code point to insert is 91D1
1093   needed delta is 42088, encodes as "sy2b"
1094   bias becomes 84
1095   output is "3B-ww4c5e180e575a65lsy2b"
1096
10978. Security Considerations
1098
1099   Users expect each domain name in DNS to be controlled by a single
1100   authority.  If a Unicode string intended for use as a domain label
1101   could map to multiple ACE labels, then an internationalized domain
1102   name could map to multiple ASCII domain names, each controlled by a
1103   different authority, some of which could be spoofs that hijack
1104   service requests intended for another.  Therefore Punycode is
1105   designed so that each Unicode string has a unique encoding.
1106
1107   However, there can still be multiple Unicode representations of the
1108   "same" text, for various definitions of "same".  This problem is
1109   addressed to some extent by the Unicode standard under the topic of
1110   canonicalization, and this work is leveraged for domain names by
1111   Nameprep [NAMEPREP].
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122Costello                    Standards Track                    [Page 20]
1123
1124RFC 3492                     IDNA Punycode                    March 2003
1125
1126
11279. References
1128
11299.1 Normative References
1130
1131   [RFC2119]    Bradner, S., "Key words for use in RFCs to Indicate
1132                Requirement Levels", BCP 14, RFC 2119, March 1997.
1133
11349.2 Informative References
1135
1136   [RFC952]     Harrenstien, K., Stahl, M. and E. Feinler, "DOD Internet
1137                Host Table Specification", RFC 952, October 1985.
1138
1139   [RFC1034]    Mockapetris, P., "Domain Names - Concepts and
1140                Facilities", STD 13, RFC 1034, November 1987.
1141
1142   [IDNA]       Faltstrom, P., Hoffman, P. and A. Costello,
1143                "Internationalizing Domain Names in Applications
1144                (IDNA)", RFC 3490, March 2003.
1145
1146   [NAMEPREP]   Hoffman, P. and  M. Blanchet, "Nameprep: A Stringprep
1147                Profile for Internationalized Domain Names (IDN)", RFC
1148                3491, March 2003.
1149
1150   [ASCII]      Cerf, V., "ASCII format for Network Interchange", RFC
1151                20, October 1969.
1152
1153   [PROVINCIAL] Kaplan, M., "The 'anyone can be provincial!' page",
1154                http://www.trigeminal.com/samples/provincial.html.
1155
1156   [UNICODE]    The Unicode Consortium, "The Unicode Standard",
1157                http://www.unicode.org/unicode/standard/standard.html.
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178Costello                    Standards Track                    [Page 21]
1179
1180RFC 3492                     IDNA Punycode                    March 2003
1181
1182
1183A. Mixed-case annotation
1184
1185   In order to use Punycode to represent case-insensitive strings,
1186   higher layers need to case-fold the strings prior to Punycode
1187   encoding.  The encoded string can use mixed case as an annotation
1188   telling how to convert the folded string into a mixed-case string for
1189   display purposes.  Note, however, that mixed-case annotation is not
1190   used by the ToASCII and ToUnicode operations specified in [IDNA], and
1191   therefore implementors of IDNA can disregard this appendix.
1192
1193   Basic code points can use mixed case directly, because the decoder
1194   copies them verbatim, leaving lowercase code points lowercase, and
1195   leaving uppercase code points uppercase.  Each non-basic code point
1196   is represented by a delta, which is represented by a sequence of
1197   basic code points, the last of which provides the annotation.  If it
1198   is uppercase, it is a suggestion to map the non-basic code point to
1199   uppercase (if possible); if it is lowercase, it is a suggestion to
1200   map the non-basic code point to lowercase (if possible).
1201
1202   These annotations do not alter the code points returned by decoders;
1203   the annotations are returned separately, for the caller to use or
1204   ignore.  Encoders can accept annotations in addition to code points,
1205   but the annotations do not alter the output, except to influence the
1206   uppercase/lowercase form of ASCII letters.
1207
1208   Punycode encoders and decoders need not support these annotations,
1209   and higher layers need not use them.
1210
1211B. Disclaimer and license
1212
1213   Regarding this entire document or any portion of it (including the
1214   pseudocode and C code), the author makes no guarantees and is not
1215   responsible for any damage resulting from its use.  The author grants
1216   irrevocable permission to anyone to use, modify, and distribute it in
1217   any way that does not diminish the rights of anyone else to use,
1218   modify, and distribute it, provided that redistributed derivative
1219   works do not contain misleading author or version information.
1220   Derivative works need not be licensed under similar terms.
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234Costello                    Standards Track                    [Page 22]
1235
1236RFC 3492                     IDNA Punycode                    March 2003
1237
1238
1239C. Punycode sample implementation
1240
1241/*
1242punycode.c from RFC 3492
1243http://www.nicemice.net/idn/
1244Adam M. Costello
1245http://www.nicemice.net/amc/
1246
1247This is ANSI C code (C89) implementing Punycode (RFC 3492).
1248
1249*/
1250
1251
1252/************************************************************/
1253/* Public interface (would normally go in its own .h file): */
1254
1255#include <limits.h>
1256
1257enum punycode_status {
1258  punycode_success,
1259  punycode_bad_input,   /* Input is invalid.                       */
1260  punycode_big_output,  /* Output would exceed the space provided. */
1261  punycode_overflow     /* Input needs wider integers to process.  */
1262};
1263
1264#if UINT_MAX >= (1 << 26) - 1
1265typedef unsigned int punycode_uint;
1266#else
1267typedef unsigned long punycode_uint;
1268#endif
1269
1270enum punycode_status punycode_encode(
1271  punycode_uint input_length,
1272  const punycode_uint input[],
1273  const unsigned char case_flags[],
1274  punycode_uint *output_length,
1275  char output[] );
1276
1277    /* punycode_encode() converts Unicode to Punycode.  The input     */
1278    /* is represented as an array of Unicode code points (not code    */
1279    /* units; surrogate pairs are not allowed), and the output        */
1280    /* will be represented as an array of ASCII code points.  The     */
1281    /* output string is *not* null-terminated; it will contain        */
1282    /* zeros if and only if the input contains zeros.  (Of course     */
1283    /* the caller can leave room for a terminator and add one if      */
1284    /* needed.)  The input_length is the number of code points in     */
1285    /* the input.  The output_length is an in/out argument: the       */
1286    /* caller passes in the maximum number of code points that it     */
1287
1288
1289
1290Costello                    Standards Track                    [Page 23]
1291
1292RFC 3492                     IDNA Punycode                    March 2003
1293
1294
1295    /* can receive, and on successful return it will contain the      */
1296    /* number of code points actually output.  The case_flags array   */
1297    /* holds input_length boolean values, where nonzero suggests that */
1298    /* the corresponding Unicode character be forced to uppercase     */
1299    /* after being decoded (if possible), and zero suggests that      */
1300    /* it be forced to lowercase (if possible).  ASCII code points    */
1301    /* are encoded literally, except that ASCII letters are forced    */
1302    /* to uppercase or lowercase according to the corresponding       */
1303    /* uppercase flags.  If case_flags is a null pointer then ASCII   */
1304    /* letters are left as they are, and other code points are        */
1305    /* treated as if their uppercase flags were zero.  The return     */
1306    /* value can be any of the punycode_status values defined above   */
1307    /* except punycode_bad_input; if not punycode_success, then       */
1308    /* output_size and output might contain garbage.                  */
1309
1310enum punycode_status punycode_decode(
1311  punycode_uint input_length,
1312  const char input[],
1313  punycode_uint *output_length,
1314  punycode_uint output[],
1315  unsigned char case_flags[] );
1316
1317    /* punycode_decode() converts Punycode to Unicode.  The input is  */
1318    /* represented as an array of ASCII code points, and the output   */
1319    /* will be represented as an array of Unicode code points.  The   */
1320    /* input_length is the number of code points in the input.  The   */
1321    /* output_length is an in/out argument: the caller passes in      */
1322    /* the maximum number of code points that it can receive, and     */
1323    /* on successful return it will contain the actual number of      */
1324    /* code points output.  The case_flags array needs room for at    */
1325    /* least output_length values, or it can be a null pointer if the */
1326    /* case information is not needed.  A nonzero flag suggests that  */
1327    /* the corresponding Unicode character be forced to uppercase     */
1328    /* by the caller (if possible), while zero suggests that it be    */
1329    /* forced to lowercase (if possible).  ASCII code points are      */
1330    /* output already in the proper case, but their flags will be set */
1331    /* appropriately so that applying the flags would be harmless.    */
1332    /* The return value can be any of the punycode_status values      */
1333    /* defined above; if not punycode_success, then output_length,    */
1334    /* output, and case_flags might contain garbage.  On success, the */
1335    /* decoder will never need to write an output_length greater than */
1336    /* input_length, because of how the encoding is defined.          */
1337
1338/**********************************************************/
1339/* Implementation (would normally go in its own .c file): */
1340
1341#include <string.h>
1342
1343
1344
1345
1346Costello                    Standards Track                    [Page 24]
1347
1348RFC 3492                     IDNA Punycode                    March 2003
1349
1350
1351/*** Bootstring parameters for Punycode ***/
1352
1353enum { base = 36, tmin = 1, tmax = 26, skew = 38, damp = 700,
1354       initial_bias = 72, initial_n = 0x80, delimiter = 0x2D };
1355
1356/* basic(cp) tests whether cp is a basic code point: */
1357#define basic(cp) ((punycode_uint)(cp) < 0x80)
1358
1359/* delim(cp) tests whether cp is a delimiter: */
1360#define delim(cp) ((cp) == delimiter)
1361
1362/* decode_digit(cp) returns the numeric value of a basic code */
1363/* point (for use in representing integers) in the range 0 to */
1364/* base-1, or base if cp is does not represent a value.       */
1365
1366static punycode_uint decode_digit(punycode_uint cp)
1367{
1368  return  cp - 48 < 10 ? cp - 22 :  cp - 65 < 26 ? cp - 65 :
1369          cp - 97 < 26 ? cp - 97 :  base;
1370}
1371
1372/* encode_digit(d,flag) returns the basic code point whose value      */
1373/* (when used for representing integers) is d, which needs to be in   */
1374/* the range 0 to base-1.  The lowercase form is used unless flag is  */
1375/* nonzero, in which case the uppercase form is used.  The behavior   */
1376/* is undefined if flag is nonzero and digit d has no uppercase form. */
1377
1378static char encode_digit(punycode_uint d, int flag)
1379{
1380  return d + 22 + 75 * (d < 26) - ((flag != 0) << 5);
1381  /*  0..25 map to ASCII a..z or A..Z */
1382  /* 26..35 map to ASCII 0..9         */
1383}
1384
1385/* flagged(bcp) tests whether a basic code point is flagged */
1386/* (uppercase).  The behavior is undefined if bcp is not a  */
1387/* basic code point.                                        */
1388
1389#define flagged(bcp) ((punycode_uint)(bcp) - 65 < 26)
1390
1391/* encode_basic(bcp,flag) forces a basic code point to lowercase */
1392/* if flag is zero, uppercase if flag is nonzero, and returns    */
1393/* the resulting code point.  The code point is unchanged if it  */
1394/* is caseless.  The behavior is undefined if bcp is not a basic */
1395/* code point.                                                   */
1396
1397static char encode_basic(punycode_uint bcp, int flag)
1398{
1399
1400
1401
1402Costello                    Standards Track                    [Page 25]
1403
1404RFC 3492                     IDNA Punycode                    March 2003
1405
1406
1407  bcp -= (bcp - 97 < 26) << 5;
1408  return bcp + ((!flag && (bcp - 65 < 26)) << 5);
1409}
1410
1411/*** Platform-specific constants ***/
1412
1413/* maxint is the maximum value of a punycode_uint variable: */
1414static const punycode_uint maxint = -1;
1415/* Because maxint is unsigned, -1 becomes the maximum value. */
1416
1417/*** Bias adaptation function ***/
1418
1419static punycode_uint adapt(
1420  punycode_uint delta, punycode_uint numpoints, int firsttime )
1421{
1422  punycode_uint k;
1423
1424  delta = firsttime ? delta / damp : delta >> 1;
1425  /* delta >> 1 is a faster way of doing delta / 2 */
1426  delta += delta / numpoints;
1427
1428  for (k = 0;  delta > ((base - tmin) * tmax) / 2;  k += base) {
1429    delta /= base - tmin;
1430  }
1431
1432  return k + (base - tmin + 1) * delta / (delta + skew);
1433}
1434
1435/*** Main encode function ***/
1436
1437enum punycode_status punycode_encode(
1438  punycode_uint input_length,
1439  const punycode_uint input[],
1440  const unsigned char case_flags[],
1441  punycode_uint *output_length,
1442  char output[] )
1443{
1444  punycode_uint n, delta, h, b, out, max_out, bias, j, m, q, k, t;
1445
1446  /* Initialize the state: */
1447
1448  n = initial_n;
1449  delta = out = 0;
1450  max_out = *output_length;
1451  bias = initial_bias;
1452
1453  /* Handle the basic code points: */
1454
1455
1456
1457
1458Costello                    Standards Track                    [Page 26]
1459
1460RFC 3492                     IDNA Punycode                    March 2003
1461
1462
1463  for (j = 0;  j < input_length;  ++j) {
1464    if (basic(input[j])) {
1465      if (max_out - out < 2) return punycode_big_output;
1466      output[out++] =
1467        case_flags ?  encode_basic(input[j], case_flags[j]) : input[j];
1468    }
1469    /* else if (input[j] < n) return punycode_bad_input; */
1470    /* (not needed for Punycode with unsigned code points) */
1471  }
1472
1473  h = b = out;
1474
1475  /* h is the number of code points that have been handled, b is the  */
1476  /* number of basic code points, and out is the number of characters */
1477  /* that have been output.                                           */
1478
1479  if (b > 0) output[out++] = delimiter;
1480
1481  /* Main encoding loop: */
1482
1483  while (h < input_length) {
1484    /* All non-basic code points < n have been     */
1485    /* handled already.  Find the next larger one: */
1486
1487    for (m = maxint, j = 0;  j < input_length;  ++j) {
1488      /* if (basic(input[j])) continue; */
1489      /* (not needed for Punycode) */
1490      if (input[j] >= n && input[j] < m) m = input[j];
1491    }
1492
1493    /* Increase delta enough to advance the decoder's    */
1494    /* <n,i> state to <m,0>, but guard against overflow: */
1495
1496    if (m - n > (maxint - delta) / (h + 1)) return punycode_overflow;
1497    delta += (m - n) * (h + 1);
1498    n = m;
1499
1500    for (j = 0;  j < input_length;  ++j) {
1501      /* Punycode does not need to check whether input[j] is basic: */
1502      if (input[j] < n /* || basic(input[j]) */ ) {
1503        if (++delta == 0) return punycode_overflow;
1504      }
1505
1506      if (input[j] == n) {
1507        /* Represent delta as a generalized variable-length integer: */
1508
1509        for (q = delta, k = base;  ;  k += base) {
1510          if (out >= max_out) return punycode_big_output;
1511
1512
1513
1514Costello                    Standards Track                    [Page 27]
1515
1516RFC 3492                     IDNA Punycode                    March 2003
1517
1518
1519          t = k <= bias /* + tmin */ ? tmin :     /* +tmin not needed */
1520              k >= bias + tmax ? tmax : k - bias;
1521          if (q < t) break;
1522          output[out++] = encode_digit(t + (q - t) % (base - t), 0);
1523          q = (q - t) / (base - t);
1524        }
1525
1526        output[out++] = encode_digit(q, case_flags && case_flags[j]);
1527        bias = adapt(delta, h + 1, h == b);
1528        delta = 0;
1529        ++h;
1530      }
1531    }
1532
1533    ++delta, ++n;
1534  }
1535
1536  *output_length = out;
1537  return punycode_success;
1538}
1539
1540/*** Main decode function ***/
1541
1542enum punycode_status punycode_decode(
1543  punycode_uint input_length,
1544  const char input[],
1545  punycode_uint *output_length,
1546  punycode_uint output[],
1547  unsigned char case_flags[] )
1548{
1549  punycode_uint n, out, i, max_out, bias,
1550                 b, j, in, oldi, w, k, digit, t;
1551
1552  /* Initialize the state: */
1553
1554  n = initial_n;
1555  out = i = 0;
1556  max_out = *output_length;
1557  bias = initial_bias;
1558
1559  /* Handle the basic code points:  Let b be the number of input code */
1560  /* points before the last delimiter, or 0 if there is none, then    */
1561  /* copy the first b code points to the output.                      */
1562
1563  for (b = j = 0;  j < input_length;  ++j) if (delim(input[j])) b = j;
1564  if (b > max_out) return punycode_big_output;
1565
1566  for (j = 0;  j < b;  ++j) {
1567
1568
1569
1570Costello                    Standards Track                    [Page 28]
1571
1572RFC 3492                     IDNA Punycode                    March 2003
1573
1574
1575    if (case_flags) case_flags[out] = flagged(input[j]);
1576    if (!basic(input[j])) return punycode_bad_input;
1577    output[out++] = input[j];
1578  }
1579
1580  /* Main decoding loop:  Start just after the last delimiter if any  */
1581  /* basic code points were copied; start at the beginning otherwise. */
1582
1583  for (in = b > 0 ? b + 1 : 0;  in < input_length;  ++out) {
1584
1585    /* in is the index of the next character to be consumed, and */
1586    /* out is the number of code points in the output array.     */
1587
1588    /* Decode a generalized variable-length integer into delta,  */
1589    /* which gets added to i.  The overflow checking is easier   */
1590    /* if we increase i as we go, then subtract off its starting */
1591    /* value at the end to obtain delta.                         */
1592
1593    for (oldi = i, w = 1, k = base;  ;  k += base) {
1594      if (in >= input_length) return punycode_bad_input;
1595      digit = decode_digit(input[in++]);
1596      if (digit >= base) return punycode_bad_input;
1597      if (digit > (maxint - i) / w) return punycode_overflow;
1598      i += digit * w;
1599      t = k <= bias /* + tmin */ ? tmin :     /* +tmin not needed */
1600          k >= bias + tmax ? tmax : k - bias;
1601      if (digit < t) break;
1602      if (w > maxint / (base - t)) return punycode_overflow;
1603      w *= (base - t);
1604    }
1605
1606    bias = adapt(i - oldi, out + 1, oldi == 0);
1607
1608    /* i was supposed to wrap around from out+1 to 0,   */
1609    /* incrementing n each time, so we'll fix that now: */
1610
1611    if (i / (out + 1) > maxint - n) return punycode_overflow;
1612    n += i / (out + 1);
1613    i %= (out + 1);
1614
1615    /* Insert n at position i of the output: */
1616
1617    /* not needed for Punycode: */
1618    /* if (decode_digit(n) <= base) return punycode_invalid_input; */
1619    if (out >= max_out) return punycode_big_output;
1620
1621    if (case_flags) {
1622      memmove(case_flags + i + 1, case_flags + i, out - i);
1623
1624
1625
1626Costello                    Standards Track                    [Page 29]
1627
1628RFC 3492                     IDNA Punycode                    March 2003
1629
1630
1631      /* Case of last character determines uppercase flag: */
1632      case_flags[i] = flagged(input[in - 1]);
1633    }
1634
1635    memmove(output + i + 1, output + i, (out - i) * sizeof *output);
1636    output[i++] = n;
1637  }
1638
1639  *output_length = out;
1640  return punycode_success;
1641}
1642
1643/******************************************************************/
1644/* Wrapper for testing (would normally go in a separate .c file): */
1645
1646#include <assert.h>
1647#include <stdio.h>
1648#include <stdlib.h>
1649#include <string.h>
1650
1651/* For testing, we'll just set some compile-time limits rather than */
1652/* use malloc(), and set a compile-time option rather than using a  */
1653/* command-line option.                                             */
1654
1655enum {
1656  unicode_max_length = 256,
1657  ace_max_length = 256
1658};
1659
1660static void usage(char **argv)
1661{
1662  fprintf(stderr,
1663    "\n"
1664    "%s -e reads code points and writes a Punycode string.\n"
1665    "%s -d reads a Punycode string and writes code points.\n"
1666    "\n"
1667    "Input and output are plain text in the native character set.\n"
1668    "Code points are in the form u+hex separated by whitespace.\n"
1669    "Although the specification allows Punycode strings to contain\n"
1670    "any characters from the ASCII repertoire, this test code\n"
1671    "supports only the printable characters, and needs the Punycode\n"
1672    "string to be followed by a newline.\n"
1673    "The case of the u in u+hex is the force-to-uppercase flag.\n"
1674    , argv[0], argv[0]);
1675  exit(EXIT_FAILURE);
1676}
1677
1678static void fail(const char *msg)
1679
1680
1681
1682Costello                    Standards Track                    [Page 30]
1683
1684RFC 3492                     IDNA Punycode                    March 2003
1685
1686
1687{
1688  fputs(msg,stderr);
1689  exit(EXIT_FAILURE);
1690}
1691
1692static const char too_big[] =
1693  "input or output is too large, recompile with larger limits\n";
1694static const char invalid_input[] = "invalid input\n";
1695static const char overflow[] = "arithmetic overflow\n";
1696static const char io_error[] = "I/O error\n";
1697
1698/* The following string is used to convert printable */
1699/* characters between ASCII and the native charset:  */
1700
1701static const char print_ascii[] =
1702  "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
1703  "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
1704  " !\"#$%&'()*+,-./"
1705  "0123456789:;<=>?"
1706  "@ABCDEFGHIJKLMNO"
1707  "PQRSTUVWXYZ[\\]^_"
1708  "`abcdefghijklmno"
1709  "pqrstuvwxyz{|}~\n";
1710
1711int main(int argc, char **argv)
1712{
1713  enum punycode_status status;
1714  int r;
1715  unsigned int input_length, output_length, j;
1716  unsigned char case_flags[unicode_max_length];
1717
1718  if (argc != 2) usage(argv);
1719  if (argv[1][0] != '-') usage(argv);
1720  if (argv[1][2] != 0) usage(argv);
1721
1722  if (argv[1][1] == 'e') {
1723    punycode_uint input[unicode_max_length];
1724    unsigned long codept;
1725    char output[ace_max_length+1], uplus[3];
1726    int c;
1727
1728    /* Read the input code points: */
1729
1730    input_length = 0;
1731
1732    for (;;) {
1733      r = scanf("%2s%lx", uplus, &codept);
1734      if (ferror(stdin)) fail(io_error);
1735
1736
1737
1738Costello                    Standards Track                    [Page 31]
1739
1740RFC 3492                     IDNA Punycode                    March 2003
1741
1742
1743      if (r == EOF || r == 0) break;
1744
1745      if (r != 2 || uplus[1] != '+' || codept > (punycode_uint)-1) {
1746        fail(invalid_input);
1747      }
1748
1749      if (input_length == unicode_max_length) fail(too_big);
1750
1751      if (uplus[0] == 'u') case_flags[input_length] = 0;
1752      else if (uplus[0] == 'U') case_flags[input_length] = 1;
1753      else fail(invalid_input);
1754
1755      input[input_length++] = codept;
1756    }
1757
1758    /* Encode: */
1759
1760    output_length = ace_max_length;
1761    status = punycode_encode(input_length, input, case_flags,
1762                             &output_length, output);
1763    if (status == punycode_bad_input) fail(invalid_input);
1764    if (status == punycode_big_output) fail(too_big);
1765    if (status == punycode_overflow) fail(overflow);
1766    assert(status == punycode_success);
1767
1768    /* Convert to native charset and output: */
1769
1770    for (j = 0;  j < output_length;  ++j) {
1771      c = output[j];
1772      assert(c >= 0 && c <= 127);
1773      if (print_ascii[c] == 0) fail(invalid_input);
1774      output[j] = print_ascii[c];
1775    }
1776
1777    output[j] = 0;
1778    r = puts(output);
1779    if (r == EOF) fail(io_error);
1780    return EXIT_SUCCESS;
1781  }
1782
1783  if (argv[1][1] == 'd') {
1784    char input[ace_max_length+2], *p, *pp;
1785    punycode_uint output[unicode_max_length];
1786
1787    /* Read the Punycode input string and convert to ASCII: */
1788
1789    fgets(input, ace_max_length+2, stdin);
1790    if (ferror(stdin)) fail(io_error);
1791
1792
1793
1794Costello                    Standards Track                    [Page 32]
1795
1796RFC 3492                     IDNA Punycode                    March 2003
1797
1798
1799    if (feof(stdin)) fail(invalid_input);
1800    input_length = strlen(input) - 1;
1801    if (input[input_length] != '\n') fail(too_big);
1802    input[input_length] = 0;
1803
1804    for (p = input;  *p != 0;  ++p) {
1805      pp = strchr(print_ascii, *p);
1806      if (pp == 0) fail(invalid_input);
1807      *p = pp - print_ascii;
1808    }
1809
1810    /* Decode: */
1811
1812    output_length = unicode_max_length;
1813    status = punycode_decode(input_length, input, &output_length,
1814                             output, case_flags);
1815    if (status == punycode_bad_input) fail(invalid_input);
1816    if (status == punycode_big_output) fail(too_big);
1817    if (status == punycode_overflow) fail(overflow);
1818    assert(status == punycode_success);
1819
1820    /* Output the result: */
1821
1822    for (j = 0;  j < output_length;  ++j) {
1823      r = printf("%s+%04lX\n",
1824                 case_flags[j] ? "U" : "u",
1825                 (unsigned long) output[j] );
1826      if (r < 0) fail(io_error);
1827    }
1828
1829    return EXIT_SUCCESS;
1830  }
1831
1832  usage(argv);
1833  return EXIT_SUCCESS;  /* not reached, but quiets compiler warning */
1834}
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850Costello                    Standards Track                    [Page 33]
1851
1852RFC 3492                     IDNA Punycode                    March 2003
1853
1854
1855Author's Address
1856
1857   Adam M. Costello
1858   University of California, Berkeley
1859   http://www.nicemice.net/amc/
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906Costello                    Standards Track                    [Page 34]
1907
1908RFC 3492                     IDNA Punycode                    March 2003
1909
1910
1911Full Copyright Statement
1912
1913   Copyright (C) The Internet Society (2003).  All Rights Reserved.
1914
1915   This document and translations of it may be copied and furnished to
1916   others, and derivative works that comment on or otherwise explain it
1917   or assist in its implementation may be prepared, copied, published
1918   and distributed, in whole or in part, without restriction of any
1919   kind, provided that the above copyright notice and this paragraph are
1920   included on all such copies and derivative works.  However, this
1921   document itself may not be modified in any way, such as by removing
1922   the copyright notice or references to the Internet Society or other
1923   Internet organizations, except as needed for the purpose of
1924   developing Internet standards in which case the procedures for
1925   copyrights defined in the Internet Standards process must be
1926   followed, or as required to translate it into languages other than
1927   English.
1928
1929   The limited permissions granted above are perpetual and will not be
1930   revoked by the Internet Society or its successors or assigns.
1931
1932   This document and the information contained herein is provided on an
1933   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
1934   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
1935   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
1936   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
1937   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
1938
1939Acknowledgement
1940
1941   Funding for the RFC Editor function is currently provided by the
1942   Internet Society.
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962Costello                    Standards Track                    [Page 35]
1963
1964