public IKdfParameter CreateParameter(OneStepNoCounterConfiguration kdfConfiguration)
        {
            var fiPieces = kdfConfiguration.FixedInfoPattern.Split("||", StringSplitOptions.RemoveEmptyEntries).ToList();
            var fiPiecesRemovedDelimiter = fiPieces.Select(fiPiece => fiPiece.Replace("||", "")).ToList();

            var param = new KdfParameterOneStepNoCounter()
            {
                L                  = kdfConfiguration.L,
                AuxFunction        = kdfConfiguration.AuxFunction,
                FixedInfoPattern   = kdfConfiguration.FixedInfoPattern,
                FixedInputEncoding = kdfConfiguration.FixedInfoEncoding,
                // If the fixedInfoPattern contains these optional context specific fields, make up a value for them
                Context = kdfConfiguration.FixedInfoPattern.Contains(nameof(KdfParameterOneStep.Context), StringComparison.OrdinalIgnoreCase) ?
                          _entropyProvider.GetEntropy(BitsOfEntropy) : null,
                AlgorithmId = kdfConfiguration.FixedInfoPattern.Contains(nameof(KdfParameterOneStep.AlgorithmId), StringComparison.OrdinalIgnoreCase) ?
                              _entropyProvider.GetEntropy(BitsOfEntropy) : null,
                Label = kdfConfiguration.FixedInfoPattern.Contains(nameof(KdfParameterOneStep.Label), StringComparison.OrdinalIgnoreCase) ?
                        _entropyProvider.GetEntropy(BitsOfEntropy) : null,
                T           = GetNullOrT(kdfConfiguration.FixedInfoPattern),
                EntropyBits = GetEntropyBitsOrNull(kdfConfiguration.FixedInfoPattern),
            };

            if (kdfConfiguration.SaltLen > 0)
            {
                param.Salt = kdfConfiguration.SaltMethod == MacSaltMethod.Default
                    ? new BitString(kdfConfiguration.SaltLen)
                    : _entropyProvider.GetEntropy(kdfConfiguration.SaltLen);
            }

            return(param);
        }
Exemple #2
0
        public KdfResult Kdf(KdfParameterOneStepNoCounter param, BitString fixedInfo)
        {
            var result      = _kdfVisitor.Kdf(param, fixedInfo);
            var dkmBytesLen = result.DerivedKey.BitLength.CeilingDivide(BitString.BITSINBYTE);

            // Modify a random byte within DKM
            result.DerivedKey[_random.GetRandomInt(0, dkmBytesLen)] += 2;

            return(result);
        }
Exemple #3
0
        public KdfResult Kdf(KdfParameterOneStepNoCounter param, BitString fixedInfo)
        {
            var zBytesLen = param.Z.BitLength.CeilingDivide(BitString.BITSINBYTE);

            var modifiedParam = new KdfParameterOneStepNoCounter()
            {
                L                  = param.L,
                Salt               = param.Salt,
                Z                  = param.Z.GetDeepCopy(),
                AuxFunction        = param.AuxFunction,
                FixedInfoPattern   = param.FixedInfoPattern,
                FixedInputEncoding = param.FixedInputEncoding
            };

            // Modify a random byte within Z
            modifiedParam.Z[_random.GetRandomInt(0, zBytesLen)] += 2;

            return(_kdfVisitor.Kdf(modifiedParam, fixedInfo));
        }
Exemple #4
0
        public KdfResult Kdf(KdfParameterOneStepNoCounter param, BitString fixedInfo)
        {
            var kdf = _kdfOneStepFactory.GetInstance(param.AuxFunction, false);

            return(kdf.DeriveKey(param.Z, param.L, fixedInfo, param.Salt));
        }