public KdfResult DeriveKey(IAns942Parameters param) { if (!(param is ConcatAns942Parameters concatParams)) { return(new KdfResult("Unable to parse concat parameters")); } if (concatParams.KeyLen <= 0 || concatParams.KeyLen > 65536) { return(new KdfResult($"KeyLen must be between [1, 65536]. Value given was: {concatParams.KeyLen}")); } var d = (int)System.Math.Ceiling(concatParams.KeyLen / (decimal)_sha.HashFunction.OutputLen); var counter = BitString.To32BitString(1); var h = new BitString(0); for (var i = 1; i <= d; i++) { // H[i] = Hash(ZZ || counter || otherInfo) var hashInput = concatParams.Zz.ConcatenateBits(counter).ConcatenateBits(concatParams.OtherInfo); h = h.ConcatenateBits(_sha.HashMessage(hashInput).Digest); counter = counter.BitStringAddition(BitString.One()); } return(new KdfResult(h.GetMostSignificantBits(concatParams.KeyLen))); }
public KdfResult DeriveKey(IAns942Parameters param) { if (!(param is DerAns942Parameters derParams)) { return(new KdfResult("Unable to parse der parameters")); } if (derParams.KeyLen <= 0 || derParams.KeyLen > 65536) { return(new KdfResult($"KeyLen must be between [1, 65536]. Value given was: {derParams.KeyLen}")); } var d = (int)System.Math.Ceiling(derParams.KeyLen / (decimal)_sha.HashFunction.OutputLen); var h = new BitString(0); var counter = BitString.To32BitString(0); for (var i = 1; i <= d; i++) { // Increment Counter counter = counter.BitStringAddition(BitString.One()); // Prepare ANS.1/DER encoded OtherInfo var derEncodedOtherInfo = DerEncode(derParams, counter); var str = derEncodedOtherInfo.ToHex(); // H[i] = Hash(ZZ || otherInfo) h = h.ConcatenateBits(_sha.HashMessage(derParams.Zz.ConcatenateBits(derEncodedOtherInfo)).Digest); } return(new KdfResult(h.GetMostSignificantBits(derParams.KeyLen))); }