package won.cryptography.rdfsign;
import org.apache.jena.query.Dataset;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.Statement;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import won.cryptography.utils.TestSigningUtils;
import won.cryptography.utils.TestingKeys;
/**
* User: ypanchenko
* Date: 14.07.2014
*/
public class WonVerifierTest
{
private static final String RESOURCE_FILE = "/won-signed-messages/create-need-msg.trig";
private static final String NEED_CORE_DATA_URI =
"http://localhost:8080/won/resource/need/3144709509622353000/core/#data";
private static final String NEED_CORE_DATA_SIG_URI =
"http://localhost:8080/won/resource/need/3144709509622353000/core/#data-sig";
private static final String EVENT_ENV1_URI =
"http://localhost:8080/won/resource/event/7719577021233193000#data";
private static final String EVENT_ENV1_SIG_URI =
"http://localhost:8080/won/resource/event/7719577021233193000#data-sig";
private static final String EVENT_ENV2_URI =
"http://localhost:8080/won/resource/event/7719577021233193000#envelope-s7gl";
private static final String EVENT_ENV2_SIG_URI =
"http://localhost:8080/won/resource/event/7719577021233193000#envelope-s7gl-sig";
TestingKeys keys;
@Before
public void init() throws Exception {
keys = new TestingKeys(TestSigningUtils.KEYS_FILE);
}
@Test
public void testVerifyCreateNeedData() throws Exception {
// create dataset that contains need core data graph and its signature graph
Dataset testDataset = TestSigningUtils.prepareTestDatasetFromNamedGraphs(
RESOURCE_FILE, new String[]{NEED_CORE_DATA_URI, NEED_CORE_DATA_SIG_URI});
// verify
WonVerifier verifier = new WonVerifier(testDataset);
// TODO load public keys from certificate referenced from signatures
boolean verified = verifier.verify(keys.getPublicKeys());
SignatureVerificationState result = verifier.getVerificationResult();
Assert.assertTrue(result.getMessage(), verified);
Assert.assertEquals(1, result.getSignatureGraphNames().size());
Assert.assertEquals(NEED_CORE_DATA_URI, result.getSignedGraphName(NEED_CORE_DATA_SIG_URI));
// modify a model and check that it does not verify..
Model m = testDataset.getNamedModel(NEED_CORE_DATA_URI);
Statement stmt = m.listStatements().nextStatement();
m.remove(stmt);
verifier = new WonVerifier(testDataset);
verified = verifier.verify(keys.getPublicKeys());
result = verifier.getVerificationResult();
Assert.assertTrue(!verified);
Assert.assertEquals(1, result.getSignatureGraphNames().size());
Assert.assertEquals(NEED_CORE_DATA_URI, result.getSignedGraphName(NEED_CORE_DATA_SIG_URI));
// add the removed statement back
m.add(stmt);
verifier = new WonVerifier(testDataset);
verified = verifier.verify(keys.getPublicKeys());
// now it should verify again
Assert.assertTrue(verified);
}
@Test
public void testVerifyCreatedNeedOwnerEvent() throws Exception {
// create dataset that contains need core data graph and its signature graph,
// envelope created by owner and the envelope's signature
Dataset testDataset = TestSigningUtils.prepareTestDatasetFromNamedGraphs(
RESOURCE_FILE, new String[]{
NEED_CORE_DATA_URI, NEED_CORE_DATA_SIG_URI,
EVENT_ENV1_URI, EVENT_ENV1_SIG_URI
});
// verify
WonVerifier verifier = new WonVerifier(testDataset);
// TODO load public keys from certificate referenced from signatures
boolean verified = verifier.verify(keys.getPublicKeys());
SignatureVerificationState result = verifier.getVerificationResult();
Assert.assertTrue(result.getMessage(), verified);
Assert.assertEquals(2, result.getSignatureGraphNames().size());
Assert.assertEquals(NEED_CORE_DATA_URI, result.getSignedGraphName(NEED_CORE_DATA_SIG_URI));
Assert.assertEquals(EVENT_ENV1_URI, result.getSignedGraphName(EVENT_ENV1_SIG_URI));
}
@Test
public void testVerifyCreatedNeedNodeEvent() throws Exception {
// create dataset that contains need core data graph and its signature graph,
// envelope created by owner and the envelope's signature, envelope created
// by node and its signature
Dataset testDataset = TestSigningUtils.prepareTestDatasetFromNamedGraphs(
RESOURCE_FILE, new String[]{
NEED_CORE_DATA_URI, NEED_CORE_DATA_SIG_URI,
EVENT_ENV1_URI, EVENT_ENV1_SIG_URI,
EVENT_ENV2_URI, EVENT_ENV2_SIG_URI
});
// verify
WonVerifier verifier = new WonVerifier(testDataset);
boolean verified = verifier.verify(keys.getPublicKeys());
SignatureVerificationState result = verifier.getVerificationResult();
Assert.assertTrue(result.getMessage(), verified);
Assert.assertEquals(3, result.getSignatureGraphNames().size());
Assert.assertEquals(NEED_CORE_DATA_URI, result.getSignedGraphName(NEED_CORE_DATA_SIG_URI));
Assert.assertEquals(EVENT_ENV1_URI, result.getSignedGraphName(EVENT_ENV1_SIG_URI));
Assert.assertEquals(EVENT_ENV2_URI, result.getSignedGraphName(EVENT_ENV2_SIG_URI));
}
// TODO test more versions of not valid signatures, e.g. signatures missing, graphs missing,
// wrong signature value, references signature values are wrong, etc.
}