/*
* Copyright 2006-2017 ICEsoft Technologies Canada Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS
* IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.icepdf.core.pobjects.acroform.signature;
import org.bouncycastle.asn1.ASN1Sequence;
import org.icepdf.core.pobjects.HexStringObject;
import org.icepdf.core.pobjects.acroform.SignatureDictionary;
import org.icepdf.core.pobjects.acroform.SignatureFieldDictionary;
import org.icepdf.core.pobjects.acroform.signature.exceptions.SignatureIntegrityException;
import org.icepdf.core.util.Utils;
import java.util.logging.Logger;
/**
* Pkcs7Validator is based on the RFC3852 specification for Cryptographic Message Syntax (CMS). The
* Digital SignatureFactory is responsible for creating any SignatureValidator implementation and does so based on the
* subFilter value of the SignatureFieldDictionary. In this particular cas the validation takes place when the
* subFilter is equal to "adbe.pkcs7.detached".
* <br>
* Also the subfilter "adbe.pkcs7.sha1". PKCS#7 The SHA1 digest of the document's byte range shall be encapsulated in
* the PKCS#7 SignedData field with ContentInfo of type Data. The digest of that SignedData shall be incorporated as
* the normal PKCS#7 digest.
*/
public class Pkcs7Validator extends AbstractPkcsValidator {
private static final Logger logger =
Logger.getLogger(Pkcs7Validator.class.toString());
public Pkcs7Validator(SignatureFieldDictionary signatureFieldDictionary) throws SignatureIntegrityException {
super(signatureFieldDictionary);
}
public void init() throws SignatureIntegrityException {
SignatureDictionary signatureDictionary = signatureFieldDictionary.getSignatureDictionary();
announceSignatureType(signatureDictionary);
// get the signature bytes.
HexStringObject hexStringObject = signatureDictionary.getContents();
// make sure we don't loose any bytes converting the string in the raw.
byte[] cmsData = Utils.convertByteCharSequenceToByteArray(hexStringObject.getLiteralString());
// Signed-data content type -- start of parsing
ASN1Sequence signedData = captureSignedData(cmsData);
// parse out the singer data.
parseSignerData(signedData, cmsData);
/**
* End of signature validation checking and data gather;
* This section should be moved to a base class and extened for the SHA1 and 7Detatched.
*/
initialized = true;
}
public void validate() throws SignatureIntegrityException {
validateDocument();
}
}