All Downloads are FREE. Search and download functionalities are using the official Maven repository.

smime.rand.TestCrypto Maven / Gradle / Ivy

package smime.rand;

import com.sun.mail.util.BASE64DecoderStream;
import smime.*;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public final class TestCrypto {

    private static InputStream unbase64(String str) throws IOException {
        BASE64DecoderStream stream = new BASE64DecoderStream(new ByteArrayInputStream(str.getBytes()));
        BiByteArrayStream bis = new BiByteArrayStream();
        while (true) {
            int c = stream.read();
            if (c < 0)
                break;
            bis.output().write(c);
        }
        return bis.input();
    }

    private static void checkEqual(String s1, String s2) {
        if (!s1.equals(s2))
            throw new IllegalStateException("'" + s1 + "' <> '" + s2 + "'");
    }

    private static void checkSize(List list, int n) {
        if (list.size() != n)
            throw new IllegalStateException(list.size() + " <> " + n);
    }

    public static void test(CryptoFactory factory, Random rnd, boolean printSignatures, SignKey sign1, SignKey sign2, EncryptKey enc1) throws IOException, CryptoException {
        String data = RandomMessageBuilder.randomString(rnd);
        test(factory, data, printSignatures, sign1, sign2, enc1);
    }

    public static void test(CryptoFactory factory, String data, boolean printSignatures, SignKey sign1, SignKey sign2, EncryptKey enc1) throws IOException, CryptoException {
        Crypto crypto = factory.getCrypto();
        {
            String encrypted = crypto.encryptData(data, enc1);
            String decrypted = crypto.decryptData(unbase64(encrypted));
            checkEqual(data, decrypted);
        }
        {
            String undetached = crypto.signData(data, sign1, false);
            List signers = new ArrayList<>();
            String sdata = crypto.getSigners(unbase64(undetached), signers);
            checkEqual(data, sdata);
            checkSize(signers, 1);
            if (printSignatures) {
                System.out.println(signers);
            }
        }
        {
            String detached = crypto.signData(data, sign1, true);
            List dsigners = new ArrayList<>();
            crypto.getSignersDetached(data, unbase64(detached), dsigners);
            checkSize(dsigners, 1);
            if (printSignatures) {
                System.out.println(dsigners);
            }
        }
        {
            String sdetached = crypto.signData(data, sign1, true);
            String cosigned = crypto.cosignData(data, unbase64(sdetached), sign2);
            List signers = new ArrayList<>();
            crypto.getSignersDetached(data, unbase64(cosigned), signers);
            checkSize(signers, 2);
            if (printSignatures) {
                System.out.println(signers);
            }
        }
        {
            String sundetached = crypto.signData(data, sign1, false);
            String cosigned = crypto.cosignData(null, unbase64(sundetached), sign2);
            List signers = new ArrayList<>();
            String sdata = crypto.getSigners(unbase64(cosigned), signers);
            checkEqual(data, sdata);
            checkSize(signers, 2);
            if (printSignatures) {
                System.out.println(signers);
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy