private IFFX GetCipher(byte[] tweak, FfsConfigurationResponse ffs, FpeEncryptionKeyResponse encryptionKey, int radix) { IFFX cypher; // set the tweak range and radix based on the FFS record long twkmin = ffs.TweakMinLength.HasValue ? ffs.TweakMinLength.Value : 0; long twkmax = ffs.TweakMaxLength.HasValue ? ffs.TweakMaxLength.Value : 0; _fpe = ffs.EncryptionAlgorithm; switch (_fpe.ToLower()) { case FpeNameConstants.ff1: cypher = new FF1(encryptionKey.UnwrappedDataKey, tweak, twkmin, twkmax, radix); break; case FpeNameConstants.ff3_1: cypher = new FF3_1(encryptionKey.UnwrappedDataKey, tweak, radix); break; default: throw new InvalidOperationException($"Unknown FPE Algorithm: {_fpe}"); } return(cypher); }
private int DecodeKeyNumIndex(FfsConfigurationResponse ffs, string str, int position) { if (position < 0) { // throw new InvalidOperationException($"Bad String decoding position for: {str}"); position = 0; } var charBuf = str.Substring(position, 1); int encodedValue = ffs.OutputCharacters.IndexOf(charBuf); return(encodedValue); }
private FpeParseModel ParseInput(string input, FfsConfigurationResponse ffs, bool encrypt) { var inputRgxPattern = $"[{RegexEscape(ffs.InputCharacters)}]"; var firstCharacter = ffs.OutputCharacters.Substring(0, 1); var invalidRgxPattern = $"[{RegexEscape(ffs.InputCharacters)}{RegexEscape(ffs.Passthrough)}]"; if (!encrypt) { inputRgxPattern = $"[{RegexEscape(ffs.OutputCharacters)}]"; firstCharacter = ffs.InputCharacters.Substring(0, 1); invalidRgxPattern = $"[{RegexEscape(ffs.OutputCharacters)}{RegexEscape(ffs.Passthrough)}]"; } var inputRgx = new Regex(inputRgxPattern); var inputMatches = inputRgx.Matches(input); var formattedPassthroughCharacters = Regex.Replace(input, inputRgxPattern, firstCharacter); if (encrypt) { var invalidRgx = new Regex(invalidRgxPattern); MatchCollection invalidMatch = invalidRgx.Matches(input); if (invalidMatch.Count != input.Length) { throw new ArgumentOutOfRangeException("invalid character found in the input"); } } var inputSb = new StringBuilder(); foreach (Match group in inputMatches) { inputSb.Append(group.Value); } var result = new FpeParseModel { StringTemplate = formattedPassthroughCharacters, Trimmed = inputSb.ToString(), }; return(result); }
private string EncodeKeyNum(FfsConfigurationResponse ffs, int keyNumber, string str, int position) { string buf; if (position < 0) { throw new InvalidOperationException($"Bad String decoding position for: {str}"); } var strChars = str.ToCharArray(); var charBuf = strChars[position]; var ct_value = ffs.OutputCharacters.IndexOf(charBuf); var msb_encoding_bits = ffs.MsbEncodingBits; ct_value = ct_value + (keyNumber << (int)msb_encoding_bits.Value); var ch = ffs.OutputCharacters.Substring(ct_value, 1); strChars[position] = ch.ToCharArray()[0]; buf = new string(strChars); return(buf); }