この例に従って、Android でメールの署名と暗号化に lib Spongy Castle を使用します。
/* Add BC */
Security.addProvider(new BouncyCastleProvider());
/* Open the keystore */
KeyStore keystore = KeyStore.getInstance("PKCS12", "SC");
keystore.load(new FileInputStream(pkcs12Keystore),
password.toCharArray());
Certificate[] chain = keystore.getCertificateChain(keyalias);
/* Get the private key to sign the message with */
PrivateKey privateKey = (PrivateKey) keystore.getKey(keyalias,
password.toCharArray());
/* Create the SMIMESignedGenerator */
SMIMECapabilityVector capabilities = new SMIMECapabilityVector();
capabilities.addCapability(SMIMECapability.dES_EDE3_CBC);
capabilities.addCapability(SMIMECapability.rC2_CBC, 128);
capabilities.addCapability(SMIMECapability.dES_CBC);
ASN1EncodableVector attributes = new ASN1EncodableVector();
attributes.add(new SMIMEEncryptionKeyPreferenceAttribute(
new IssuerAndSerialNumber(new X500Name(
((X509Certificate) chain[0]).getIssuerDN()
.getName()), ((X509Certificate) chain[0])
.getSerialNumber())));
attributes.add(new SMIMECapabilitiesAttribute(capabilities));
SMIMESignedGenerator signer = new SMIMESignedGenerator();
signer.addSignerInfoGenerator(new JcaSimpleSignerInfoGeneratorBuilder()
.setProvider("SC")
.setSignedAttributeGenerator(new AttributeTable(attributes))
.build("DSA".equals(privateKey.getAlgorithm()) ? "SHA1withDSA"
: "MD5withDSA", privateKey,
(X509Certificate) chain[0]));
/* Add the list of certs to the generator */
List certList = new ArrayList();
certList.add(chain[0]);
Store certs = new JcaCertStore(certList);
signer.addCertificates(certs);
/* Sign the message */
MimeMultipart mm = signer.generate(originalMessage, "SC");
signedMessage = new MimeMessage(session);
/* Set all original MIME headers in the signed message */
Enumeration headers = originalMessage.getAllHeaderLines();
while (headers.hasMoreElements()) {
signedMessage.addHeaderLine((String) headers.nextElement());
}
/* Set the content of the signed message */
signedMessage.setContent(mm);
signedMessage.saveChanges();
ByteArrayOutputStream out = new ByteArrayOutputStream();
signedMessage.writeTo(out);
FileOutputStream f = new FileOutputStream(new File(
"/sdcard/MobilePKI/out.txt"));
f.write(out.toByteArray());
f.close();
アプリを実行すると、次のエラーが返されます。
11-13 08:54:11.867: E/dalvikvm(13188): Could not find class '[Ljava.awt.datatransfer.DataFlavor;', referenced from method org.spongycastle.mail.smime.handlers.multipart_signed.<clinit>
11-13 08:54:11.890: E/AndroidRuntime(13188): FATAL EXCEPTION: main
11-13 08:54:11.890: E/AndroidRuntime(13188): java.lang.VerifyError: org.spongycastle.mail.smime.handlers.multipart_signed
11-13 08:54:11.890: E/AndroidRuntime(13188): at java.lang.Class.newInstanceImpl(Native Method)
11-13 08:54:11.890: E/AndroidRuntime(13188): at java.lang.Class.newInstance(Class.java:1409)
11-13 08:54:11.890: E/AndroidRuntime(13188): at javax.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:609)
11-13 08:54:11.890: E/AndroidRuntime(13188): at javax.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:563)
11-13 08:54:11.890: E/AndroidRuntime(13188): at javax.activation.DataHandler.getDataContentHandler(DataHandler.java:626)
11-13 08:54:11.890: E/AndroidRuntime(13188): at javax.activation.DataHandler.writeTo(DataHandler.java:329)
11-13 08:54:11.890: E/AndroidRuntime(13188): at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1403)
11-13 08:54:11.890: E/AndroidRuntime(13188): at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1745)
11-13 08:54:11.890: E/AndroidRuntime(13188): at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1721)
Spongy Castle lib のソースコードには java.awt.datatransfer が必要なようです:
package org.spongycastle.mail.smime.handlers;
import org.spongycastle.mail.smime.SMIMEStreamingProcessor;
import javax.activation.ActivationDataFlavor;
import javax.activation.DataContentHandler;
import javax.activation.DataSource;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.internet.ContentType;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import java.awt.datatransfer.DataFlavor;
import java.io.BufferedInputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
パッケージ java.awt をインポートする必要があると思います。プロジェクトに rt.jar (java.awt.* を含む) をインポートしましたが、まだこのエラーが発生しています。