Derive.cs

Contains the functions needed to derive the key and IV

// ------------------------------------------------------------------------------------------
// <copyright file="Derive.cs" company="SecMaker AB">
//   SecMaker AB
// </copyright>
// <summary>
//   Defines the Client partial class.
// </summary>
// ------------------------------------------------------------------------------------------

namespace SecMaker.NiP.Client
{
	using System;
	using System.Linq;

	public partial class Client
	{
		private void Derive()
		{
            var keySize = _symmetricalKeySize / 8;
            var ivSize = keySize / 2;

            _key =
				DeriveKey(_cltNonce, _srvNonce, _dateTimeKey, "key", 1, keySize);

			_iv =
				DeriveKey(_cltNonce, _srvNonce, _dateTimeKey, "iv", _counter, ivSize);
		}

		private byte[] DeriveKey(byte[] cltNonce, byte[] srvNonce, byte[] key, string keyType, int count, int size)
		{
			var typeBytes =
				Utility.ToBytes(keyType);

			var keyData =
				new byte[0];

			var counter =
				count;

			while (keyData.Length < size)
			{
				var sCount =
					Convert.ToString(counter);

				var countBytes =
					Utility.ToBytes(sCount);

				var bytes =
					srvNonce.Concat(cltNonce).Concat(typeBytes).Concat(countBytes).ToArray();

				keyData =
					keyData.Concat(
						Utility.GenerateHmac(
							_sHashAlg,
							bytes,
							key)
							.Take(size)).ToArray();

				counter++;
			}

			var data =
				keyData.Take(size).ToArray();

			return data;
		}
	}
}