Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }