protected static byte[] CHUIDFull(UInt16 fascnAgencyCode, UInt16 fascnSystemSiteCode, UInt32 fascnCredentialNumber,
                                          IEnumerable <byte> guid, byte[] expirationDate)
        {
            if (null == expirationDate)
            {
                throw new ArgumentNullException("expirationDate");
            }

            if (8 != expirationDate.Count())
            {
                throw new ArgumentException("expirationDate: array should be of size 8");
            }

            ServiceExtensions.CheckCryptoLibary();

            var value = buildTLV(0x30, FASCN(fascnAgencyCode, fascnSystemSiteCode, fascnCredentialNumber)).Concat(buildTLV(0x34, GUID(guid)))
                        .Concat(buildTLV(0x35, expirationDate));

            return(buildTLV(0xEE, value.Concat(buildTLV(0x3E, Crypto.CryptoUtils.SignCHUIDByRandomKeyPair(value)))));
        }