diff options
author | Stephen Jennings <Stephen.G.Jennings@gmail.com> | 2011-11-13 12:32:19 -0800 |
---|---|---|
committer | Stephen Jennings <Stephen.G.Jennings@gmail.com> | 2011-11-13 13:15:41 -0800 |
commit | 5cd2d78c4a0085bdafc1292ff21992e9621a4a1a (patch) | |
tree | c82fc7c842529553841a1f0b87d0f5f099e91cf6 | |
parent | 594166213822635486e63e4085486c5f736ece4c (diff) | |
download | OATH.Net-5cd2d78c4a0085bdafc1292ff21992e9621a4a1a.zip OATH.Net-5cd2d78c4a0085bdafc1292ff21992e9621a4a1a.tar.gz OATH.Net-5cd2d78c4a0085bdafc1292ff21992e9621a4a1a.tar.bz2 |
Allow converting segments with no padding.
-rw-r--r-- | OATH.Net/Base32.cs | 71 |
1 files changed, 54 insertions, 17 deletions
diff --git a/OATH.Net/Base32.cs b/OATH.Net/Base32.cs index 68073c5..0e0fb3c 100644 --- a/OATH.Net/Base32.cs +++ b/OATH.Net/Base32.cs @@ -89,31 +89,68 @@ namespace OathNet private static byte[] ConvertSegmentToBinary(char[] segment) { - if (segment.Length != 8) + if (segment.Length > 8) { - throw new ArgumentException("Segment must be 8 characters in length."); + throw new ArgumentException("Segment must be no more than 8 characters in length."); } byte[] result = new byte[5]; var s = segment; - var bytesCreated = 0; - - try + + // Find the length of the segment, up to the first padding + // If no padding is found, use the entire segment + var length = Array.FindIndex(segment, c => c == Padding); + if (length == -1) { - result[0] = (byte)(AlphabetReverse[s[0]] << 3 | AlphabetReverse[s[1]] >> 2); - bytesCreated = 1; - result[1] = (byte)(AlphabetReverse[s[1]] << 6 | AlphabetReverse[s[2]] << 1 | AlphabetReverse[s[3]] >> 4); - bytesCreated = 2; - result[2] = (byte)(AlphabetReverse[s[3]] << 4 | AlphabetReverse[s[4]] >> 1); - bytesCreated = 3; - result[3] = (byte)(AlphabetReverse[s[4]] << 7 | AlphabetReverse[s[5]] << 2 | AlphabetReverse[s[6]] >> 3); - bytesCreated = 4; - result[4] = (byte)(AlphabetReverse[s[6]] << 5 | AlphabetReverse[s[7]]); - bytesCreated = 5; + length = segment.Length; } - catch (KeyNotFoundException) + + var resized = false; + + switch (length) { - Array.Resize(ref result, bytesCreated); + case 8: + resized = true; + result[4] = (byte)(AlphabetReverse[s[6]] << 5 | AlphabetReverse[s[7]]); + goto case 7; + case 7: + if (!resized) + { + Array.Resize(ref result, 4); + resized = true; + } + + result[3] = (byte)(AlphabetReverse[s[4]] << 7 | AlphabetReverse[s[5]] << 2 | AlphabetReverse[s[6]] >> 3); + goto case 5; + case 5: + if (!resized) + { + Array.Resize(ref result, 3); + resized = true; + } + + result[2] = (byte)(AlphabetReverse[s[3]] << 4 | AlphabetReverse[s[4]] >> 1); + goto case 4; + case 4: + if (!resized) + { + Array.Resize(ref result, 2); + resized = true; + } + + result[1] = (byte)(AlphabetReverse[s[1]] << 6 | AlphabetReverse[s[2]] << 1 | AlphabetReverse[s[3]] >> 4); + goto case 2; + case 2: + if (!resized) + { + Array.Resize(ref result, 1); + resized = true; + } + + result[0] = (byte)(AlphabetReverse[s[0]] << 3 | AlphabetReverse[s[1]] >> 2); + break; + default: + throw new ArgumentException("Segment is not a valid 8 character block of base32."); } return result; |