The reference code is, of course, more precise.
Raw seeds are always 112 bits. To encode, clients xor all the bytes together and append that byte to the end, then use the following base 32 encoding -
| 2 - 00000 | 3 - 00001 | 4 - 00010 | 5 - 00011 |
| 6 - 00100 | 7 - 00101 | 8 - 00110 | 9 - 00111 |
| A - 01000 | B - 01001 | C - 01010 | D - 01011 |
| E - 01100 | F - 01101 | G - 01110 | H - 01111 |
| I - 10000 | J - 10001 | K - 10010 | M - 10011 |
| N - 10100 | P - 10101 | Q - 10110 | R - 10111 |
| S - 11000 | T - 11001 | U - 11010 | V - 11011 |
| W - 11100 | X - 11101 | Y - 11110 | Z - 11111 |
This encoding avoids the easily confused 0, O, 1 and L characters, and sorts in the same order as the binary version.
Keys are always displayed all caps, grouped into six groups of four letters, like this: EXU8 IG3T 8TV9 4FV5 GBSQ NUSX.
When keys are entered, upper and lower case are treated the same. Whitespace is stripped before using.
If the key entered is the wrong length or the checksum (it's last byte) doesn't match, it's rejected. This is to detect typos and discourage users from using keys they make up themselves rather than are auto-generated.