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); }
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); }
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); }
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); }
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); }
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); }
/// <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); }
/// <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)); }
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)); }
/// <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); }
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(); }
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); }
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); }
/// <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); }
/// <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); }
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; }