コード例 #1
0
ファイル: OfdReaderTests.cs プロジェクト: fendaq/OfdSharp
        public void OfdReaderFileInfoTest()
        {
            string    filePath = Path.Combine(Directory.GetCurrentDirectory(), "Files", "test.ofd");
            FileInfo  fileInfo = new FileInfo(filePath);
            OfdReader reader   = new OfdReader(fileInfo);

            Assert.IsNotNull(reader);
        }
コード例 #2
0
ファイル: OfdReaderTests.cs プロジェクト: yangl5619/OfdSharp
        public void OfdReaderFileTest()
        {
            string    filePath = Path.Combine(Directory.GetCurrentDirectory(), "Files", "test.ofd");
            OfdReader reader   = new OfdReader(filePath);

            Assert.IsNotNull(reader);
            Assert.AreEqual(reader.FileInfo.FullName, filePath);
        }
コード例 #3
0
ファイル: OfdReaderTests.cs プロジェクト: fendaq/OfdSharp
        public void OfdReaderFileTest()
        {
            string     filePath   = Path.Combine(Directory.GetCurrentDirectory(), "Files", "test.ofd");
            FileStream fileStream = File.OpenRead(filePath);
            OfdReader  reader     = new OfdReader(fileStream);

            Assert.IsNotNull(reader);
        }
コード例 #4
0
        public void ExeValidateInvalidFileTest()
        {
            string       filePath     = Path.Combine(Directory.GetCurrentDirectory(), "Files", "032001900311_25577301.ofd");
            OfdReader    reader       = new OfdReader(filePath);
            VerifyResult verifyResult = OfdValidator.Validate(reader);

            Assert.IsNotNull(verifyResult);
            Assert.AreEqual(VerifyResult.Success, verifyResult);
        }
コード例 #5
0
ファイル: OfdReaderTests.cs プロジェクト: yangl5619/OfdSharp
        public void GetSignaturesTest()
        {
            string    filePath = Path.Combine(Directory.GetCurrentDirectory(), "Files", "test.ofd");
            OfdReader reader   = new OfdReader(filePath);

            Assert.IsNotNull(reader);

            string signatures = reader.GetSignatures();

            Assert.IsNotNull(signatures);
        }
コード例 #6
0
ファイル: OfdReaderTests.cs プロジェクト: yangl5619/OfdSharp
        public void GetBodyTest()
        {
            string    filePath = Path.Combine(Directory.GetCurrentDirectory(), "Files", "test.ofd");
            OfdReader reader   = new OfdReader(filePath);

            Assert.IsNotNull(reader);

            string body = reader.GetBody();

            Assert.IsNotNull(body);
        }
コード例 #7
0
ファイル: OfdValidator.cs プロジェクト: fendaq/OfdSharp
 /// <summary>
 /// 验证文件完整性
 /// </summary>
 private static VerifyResult CheckFileIntegrity(OfdReader reader, Signature signature, IDigest digest)
 {
     foreach (Reference referenceItem in signature.SignedInfo.ReferenceCollect.Items)
     {
         VerifyResult verifyResult = CheckFileIntegrity(reader, digest, referenceItem);
         if (verifyResult != VerifyResult.Success)
         {
             return(verifyResult);
         }
     }
     return(VerifyResult.Success);
 }
コード例 #8
0
ファイル: OfdValidator.cs プロジェクト: fendaq/OfdSharp
        /// <summary>
        /// 检查电子签章数据
        /// 验证文件:Doc_0\Signs\Sign_0\Signature.xml、Doc_0\Signs\Sign_0\SignedValue.dat
        /// </summary>
        private static VerifyResult CheckSignedValue(OfdReader reader, Signature signature)
        {
            string signatureFilePath = reader.GetSignatures();

            byte[] tbsContent  = reader.ReadContent(signatureFilePath);
            byte[] signedValue = reader.ReadContent(signature.SignedValue);

            SesV4ValidateContainer validateContainer = new SesV4ValidateContainer();

            //SesV1ValidateContainer validateContainer = new SesV1ValidateContainer();
            return(validateContainer.Validate(SigType.Seal, tbsContent, signedValue));
        }
コード例 #9
0
ファイル: OfdReaderTests.cs プロジェクト: fendaq/OfdSharp
        public void GetInvoiceInfoTest()
        {
            string    filePath = Path.Combine(Directory.GetCurrentDirectory(), "Files", "test.ofd");
            OfdReader reader   = new OfdReader(filePath);

            Assert.IsNotNull(reader);
            InvoiceInfo invoiceInfo = reader.GetInvoiceInfo();

            Assert.IsNotNull(invoiceInfo);
            Console.WriteLine(DateTime.Parse(invoiceInfo.IssueDate));
            Assert.AreEqual(9709m, decimal.Parse(invoiceInfo.TaxExclusiveTotalAmount));
        }
コード例 #10
0
ファイル: OfdValidator.cs プロジェクト: fendaq/OfdSharp
 /// <summary>
 /// 验证文件完整性
 /// </summary>
 private static VerifyResult CheckFileIntegrity(OfdReader reader, IDigest digest, Reference item)
 {
     byte[] contentBytes = reader.ReadContent(item.FileRef);
     digest.BlockUpdate(contentBytes, 0, contentBytes.Length);
     byte[] output = new byte[32];
     digest.DoFinal(output, 0);
     byte[] checkBytes = Convert.FromBase64String(item.CheckValue.Value);
     if (!Arrays.AreEqual(output, checkBytes))
     {
         return(VerifyResult.FileTampered);
     }
     return(VerifyResult.Success);
 }
コード例 #11
0
ファイル: OfdReaderTests.cs プロジェクト: fendaq/OfdSharp
        public void GetSignaturesByStreamTest()
        {
            string     filePath = Path.Combine(Directory.GetCurrentDirectory(), "Files", "test.ofd");
            FileStream stream   = File.OpenRead(filePath);
            OfdReader  reader   = new OfdReader(stream);

            Assert.IsNotNull(reader);

            string signatures = reader.GetSignatures();

            Assert.IsNotNull(signatures);

            reader.Close();
        }
コード例 #12
0
ファイル: NormalStamp.cs プロジェクト: fendaq/OfdSharp
        public List <StampAnnot> GetAppearance(OfdReader ctx, AtomicSignId idProvider)
        {
            // 解析OFD页码获取页面对应的ID
            string     id         = string.Empty; //ctx.getPageObjectId(page).ref ();
            StampAnnot annotation = new StampAnnot()
            {
                Id       = idProvider.IncrementAndGet(),
                Boundary = $"{Tlx} {Tly} {Width} {Height}",
                PageRef  = string.Empty
            };
            List <StampAnnot> res = new List <StampAnnot>(1)
            {
                annotation
            };

            return(res);
        }
コード例 #13
0
ファイル: NormalStamp.cs プロジェクト: yangl5619/OfdSharp
        public List <StampAnnotation> GetAppearance(OfdReader ctx, AtomicSignId idProvider)
        {
            // 解析OFD页码获取页面对应的ID
            string          id         = string.Empty; //ctx.getPageObjectId(page).ref ();
            StampAnnotation annotation = new StampAnnotation(null)
            {
                Id       = idProvider.IncrementAndGet(),
                Boundary = (new StBox(Tlx, Tly, Width, Height)),
                PageRef  = string.Empty
            };
            List <StampAnnotation> res = new List <StampAnnotation>(1)
            {
                annotation
            };

            return(res);
        }
コード例 #14
0
ファイル: OfdValidator.cs プロジェクト: fendaq/OfdSharp
        /// <summary>
        /// 执行OFD电子签名验证
        ///校验过程:
        /// 1. 检查文件完整性
        /// 获取SignedInfo节点
        /// 1)从此节点获取References,References由多个Reference组成
        /// 2)从此节点获取CheckMethod,签名方法: IDigest digest = DigestUtilities.GetDigest(GMObjectIdentifiers.sm3);//1.2.156.10197.1.401
        /// 3)循环每个Reference,FileRef节点指名了签名文件路径,CheckValue节点指名了签名值base64字符串
        /// 4)读取FileRef指向的文件的内容
        /// 5)使用3)步获取签名方法对文件内容签名,并与CheckValue获取的值比较
        /// 2.签章验证
        /// 1)获取SignedValue节点,获取签章值文件路径:/Doc_0/Signs/Sign_0/SignedValue.dat
        /// 2)从SignedInfo节点下获取Seal节点,获取印章数据文件路径:/Doc_0/Signs/Sign_0/Seal.esl
        /// 3)读取印章数据文件并检查印章匹配
        /// 4)获取SignatureMethod节点,获取签名算法名称:1.2.156.10197.1.501,获取签名算法:IDigest digest = DigestUtilities.GetDigest(GMObjectIdentifiers.sm2sign_with_sm3);//1.2.156.10197.1.401
        /// 5)使用签章数据检验签名信息是否匹配
        /// </summary>
        public static VerifyResult Validate(OfdReader reader)
        {
            //1、读取OFD.xml文件的ofd:Signatures节点
            //2、读取Doc_0\Signs\Signatures.xml文件的ofd:Signature节点,从BaseLoc特性获取签名文件路径,如/Doc_0/Signs/Sign_0/Signature.xml
            //3、读取/Doc_0/Signs/Sign_0/Signature.xml文件
            Signature signature = reader.GetSignature();
            //获取签名算法
            IDigest digest = DigestUtilities.GetDigest(signature.SignedInfo.ReferenceCollect.CheckMethod);
            //验证文件完整性
            VerifyResult result = CheckFileIntegrity(reader, signature, digest);

            if (result != VerifyResult.Success)
            {
                return(result);
            }
            //电子印章与电子签章数据的匹配性检查
            result = CheckSealMatch(reader, signature);

            //检查电子签章数据
            return(result == VerifyResult.Success ? CheckSignedValue(reader, signature) : result);
        }
コード例 #15
0
ファイル: OfdValidator.cs プロジェクト: fendaq/OfdSharp
        /// <summary>
        /// 检查印章匹配[可选-存在Seal.esl则验证,不存在不验证]
        /// 验证文件:Doc_0\Signs\Sign_0\Seal.esl、Doc_0\Signs\Sign_0\SignedValue.dat
        /// </summary>
        private static VerifyResult CheckSealMatch(OfdReader reader, Signature signature)
        {
            if (signature.SignedInfo.Seal == null)
            {
                return(VerifyResult.Success);
            }
            byte[]           sesSignatureBin = reader.ReadContent(signature.SignedValue);
            SesVersionHolder holder          = VersionParser.ParseSignatureVersion(sesSignatureBin);

            if (holder.Version == SesVersion.V4)
            {
                SesSignature v4Signature = SesSignature.GetInstance(holder.Sequence);
                SeSeal       seal        = v4Signature.TbsSign.EsSeal;
                byte[]       expect      = seal.GetDerEncoded();

                byte[] sealBytes = reader.ReadContent(signature.SignedInfo.Seal.BaseLoc.Value);
                if (!Arrays.AreEqual(expect, sealBytes))
                {
                    return(VerifyResult.SealNotMatch);
                }
            }
            return(VerifyResult.Success);
        }
コード例 #16
0
ファイル: RidingStamp.cs プロジェクト: yangl5619/OfdSharp
        public List <StampAnnotation> GetAppearance(OfdReader ctx, AtomicSignId idProvider)
        {
            throw new NotImplementedException();
            //// 总页码数
            //int numPage = ctx.getNumberOfPages();
            //List<StampAnnot> res = new ArrayList<>(numPage);

            //if (side == Side.Right || side == Side.Left)
            //{
            //    // 按页码平分印章图片
            //    double itemWith = this.width / numPage;
            //    for (int i = 0; i < numPage; i++)
            //    {

            //        Page page = ctx.getPage(i + 1);
            //        ST_Box pageSize = ctx.getPageSize(page);
            //        double x;
            //        ST_Box clip = null;
            //        if (side == Side.Right)
            //        {
            //            x = pageSize.getWidth() - itemWith * (i + 1);
            //            clip = new ST_Box(i * itemWith, 0, itemWith, this.height);
            //        }
            //        else
            //        {
            //            x = 0 - itemWith * (numPage - 1 - i);
            //            clip = new ST_Box((numPage - 1 - i) * itemWith, 0, itemWith, this.height);
            //        }

            //        double y = pageSize.getHeight() / 2 - this.height / 2;

            //        ST_RefID ref = ctx.getPageObjectId(i + 1).ref ();
            //        StampAnnot annot = new StampAnnot()
            //                .setID(idProvider.incrementAndGet())
            //                .setBoundary(new ST_Box(x, y, this.width, this.height))
            //                .setPageRef(ref)
            //                .setClip(clip);
            //        res.add(annot);
            //    }
            //}
            //else
            //{
            //    double itemHeight = this.height / numPage;
            //    for (int i = 0; i < numPage; i++)
            //    {

            //        Page page = ctx.getPage(i + 1);
            //        ST_Box pageSize = ctx.getPageSize(page);

            //        double x = pageSize.getWidth() / 2 - this.width / 2;
            //        double y;
            //        ST_Box clip = null;
            //        if (side == Side.Bottom)
            //        {
            //            y = pageSize.getHeight() - itemHeight * (i + 1);
            //            clip = new ST_Box(0, itemHeight * i, this.width, itemHeight);
            //        }
            //        else
            //        {
            //            y = 0 - itemHeight * (numPage - 1 - i);
            //            clip = new ST_Box(0, (numPage - 1 - i) * itemHeight, this.width, itemHeight);
            //        }

            //        ST_RefID ref = ctx.getPageObjectId(i + 1).ref ();
            //        StampAnnot annot = new StampAnnot()
            //                .setID(idProvider.incrementAndGet())
            //                .setBoundary(new ST_Box(x, y, this.width, this.height))
            //                .setPageRef(ref)
            //                .setClip(clip);
            //        res.add(annot);
            //    }

            //}
            //return res;
        }