private void CheckStatement(
            LdsSecurityObject so,
            AlgorithmIdentifier digestAlgorithmIdentifier,
            DataGroupHash[]             datagroupHash,
            LdsVersionInfo versionInfo)
        {
            if (digestAlgorithmIdentifier != null)
            {
                if (!so.DigestAlgorithmIdentifier.Equals(digestAlgorithmIdentifier))
                {
                    Fail("ids don't match.");
                }
            }
            else if (so.DigestAlgorithmIdentifier != null)
            {
                Fail("digest algorithm Id found when none expected.");
            }

            if (datagroupHash != null)
            {
                DataGroupHash[] datas = so.GetDatagroupHash();

                for (int i = 0; i != datas.Length; i++)
                {
                    if (!datagroupHash[i].Equals(datas[i]))
                    {
                        Fail("name registration authorities don't match.");
                    }
                }
            }
            else if (so.GetDatagroupHash() != null)
            {
                Fail("data hash groups found when none expected.");
            }

            if (versionInfo != null)
            {
                if (!versionInfo.Equals(so.VersionInfo))
                {
                    Fail("versionInfo doesn't match");
                }
            }
            else if (so.VersionInfo != null)
            {
                Fail("version info found when none expected.");
            }
        }
        private void CheckConstruction(
            LdsSecurityObject so,
            AlgorithmIdentifier digestAlgorithmIdentifier,
            DataGroupHash[]             datagroupHash)
        {
            CheckStatement(so, digestAlgorithmIdentifier, datagroupHash, null);

            so = LdsSecurityObject.GetInstance(so);

            CheckStatement(so, digestAlgorithmIdentifier, datagroupHash, null);

            Asn1Sequence seq = (Asn1Sequence)Asn1Object.FromByteArray(
                so.ToAsn1Object().GetEncoded());

            so = LdsSecurityObject.GetInstance(seq);

            CheckStatement(so, digestAlgorithmIdentifier, datagroupHash, null);
        }
        private void CheckConstruction(
            LdsSecurityObject so,
            AlgorithmIdentifier digestAlgorithmIdentifier,
            DataGroupHash[]         datagroupHash,
            LdsVersionInfo versionInfo)
        {
            if (!so.Version.Equals(BigInteger.One))
            {
                Fail("version number not 1");
            }

            CheckStatement(so, digestAlgorithmIdentifier, datagroupHash, versionInfo);

            so = LdsSecurityObject.GetInstance(so);

            CheckStatement(so, digestAlgorithmIdentifier, datagroupHash, versionInfo);

            Asn1Sequence seq = (Asn1Sequence)Asn1Object.FromByteArray(
                so.ToAsn1Object().GetEncoded());

            so = LdsSecurityObject.GetInstance(seq);

            CheckStatement(so, digestAlgorithmIdentifier, datagroupHash, versionInfo);
        }
        public override void PerformTest()
        {
            AlgorithmIdentifier algoId = new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1);

            DataGroupHash[] datas = new DataGroupHash[2];

            datas[0] = new DataGroupHash(1, new DerOctetString(GenerateHash()));
            datas[1] = new DataGroupHash(2, new DerOctetString(GenerateHash()));

            LdsSecurityObject so = new LdsSecurityObject(algoId, datas);

            CheckConstruction(so, algoId, datas);

            LdsVersionInfo versionInfo = new LdsVersionInfo("Hello", "world");

            so = new LdsSecurityObject(algoId, datas, versionInfo);

            CheckConstruction(so, algoId, datas, versionInfo);

            try
            {
                LdsSecurityObject.GetInstance(null);
            }
            catch (Exception)
            {
                Fail("GetInstance() failed to handle null.");
            }

            try
            {
                LdsSecurityObject.GetInstance(new object());

                Fail("GetInstance() failed to detect bad object.");
            }
            catch (ArgumentException)
            {
                // expected
            }

            try
            {
                LdsSecurityObject.GetInstance(DerSequence.Empty);

                Fail("constructor failed to detect empty sequence.");
            }
            catch (ArgumentException)
            {
                // expected
            }

            try
            {
                new LdsSecurityObject(algoId, new DataGroupHash[1]);

                Fail("constructor failed to detect small DataGroupHash array.");
            }
            catch (ArgumentException)
            {
                // expected
            }

            try
            {
                new LdsSecurityObject(algoId, new DataGroupHash[LdsSecurityObject.UBDataGroups + 1]);

                Fail("constructor failed to out of bounds DataGroupHash array.");
            }
            catch (ArgumentException)
            {
                // expected
            }
        }
Beispiel #5
0
        /// <summary>
        /// Constructs a new EF_SOD file.
        /// </summary>
        /// <param name="data">bytes of the EF_DG1 file</param>
        public SODFile(byte[] data)
        {
            MemoryStream      dataStream = new MemoryStream(data);
            BERTLVInputStream tlvStream  = new BERTLVInputStream(dataStream);
            int tag = tlvStream.readTag();

            if (tag != IDGFile.EF_SOD_TAG)
            {
                throw new ArgumentException("Expected EF_SOD_TAG");
            }
            int length = tlvStream.readLength();

            Asn1InputStream     sodAsn1          = new Asn1InputStream(dataStream);
            DerSequence         seq              = (DerSequence)sodAsn1.ReadObject();
            DerObjectIdentifier objectIdentifier = (DerObjectIdentifier)seq[0];

            //DerTaggedObject o = (DerTaggedObject)seq[1];
            DerSequence s2 = (DerSequence)((DerTaggedObject)seq[1]).GetObject();
            IEnumerator e  = s2.GetEnumerator();

            e.MoveNext();
            DerInteger version = (DerInteger)e.Current;

            e.MoveNext();
            Asn1Set digestAlgorithms = (Asn1Set)e.Current;

            e.MoveNext();
            ContentInfo contentInfo = ContentInfo.GetInstance(e.Current);

            Asn1Set signerInfos  = null;
            bool    certsBer     = false;
            bool    crlsBer      = false;
            Asn1Set certificates = null;
            Asn1Set crls         = null;

            while (e.MoveNext())
            {
                Object o = e.Current;
                if (o is Asn1TaggedObject)
                {
                    Asn1TaggedObject tagged = (Asn1TaggedObject)o;
                    switch (tagged.TagNo)
                    {
                    case 0:
                        certsBer     = tagged is BerTaggedObject;
                        certificates = Asn1Set.GetInstance(tagged, false);
                        break;

                    case 1:
                        crlsBer = tagged is BerTaggedObject;
                        crls    = Asn1Set.GetInstance(tagged, false);
                        break;

                    default:
                        throw new ArgumentException("unknown tag value " + tagged.TagNo);
                    }
                }
                else
                {
                    signerInfos = (Asn1Set)o;
                }
            }
            _signedData = new SignedData(digestAlgorithms, contentInfo, certificates, crls, signerInfos);
            byte[]          content  = ((DerOctetString)contentInfo.Content).GetOctets();
            Asn1InputStream inStream = new Asn1InputStream(content);

            _lds = new LdsSecurityObject((Asn1Sequence)inStream.ReadObject());
        }