2012-11-13 24 views
2

我使用lib Spongy Castle根據this example在Android上簽名和加密郵件。如何修復Spongy Castle在Android上的錯誤:無法找到類java.awt.datatransfer.DataFlavor

  /* 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) 

海綿城堡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; 

(鏈接:https://github.com/rtyley/spongycastle/blob/spongy-master/scmail-jdk15on/src/main/java/org/spongycastle/mail/smime/handlers/multipart_signed.java

我覺得它必須導入包java.awt和我導入的rt.jar(包括java.aw *。)到我的項目,但它仍然有這個錯誤。

+0

哪個包做的rt.jar來自發送加密的SMIME消息的例子嗎?你確定它包含'java.awt.datatransfer。*'? –

+0

我從JRE系統庫中獲得了rt.jar,它包含java.awt.datatransfer。* –

+1

Android不是標準的Java平臺。你可以看看[this](http://stackoverflow.com/questions/3897775/using-awt-with-android)SO主題了解更多信息。 –

回答

0

我定我的錯誤:
+我下載源代碼spongycastle lib
+取代線 「進口java.awt.datatransfer.DataFlavor中;」通過「import myjava.awt.datatransfer.DataFlavor;」 (包myjava.awt.datatransfer包括在additionnal lib
+重建spongycastle LIB
+使用新spongycastle LIB

0

我設法解決這個問題:

0)運行become-spongy.sh腳本(從在郵件包裝 1) 「海綿狀的腳本」 分支)在郵件創建的AndroidManifest.xml/SRC /主/

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.spongycastle"> 
</manifest> 

2)變化郵件/的build.gradle

apply plugin: 'com.android.library' 
dependencies { 
    compile 'com.sun.mail:android-mail:1.5.5' 
    compile 'com.sun.mail:android:1.5.5' 
    compile 'com.madgag.spongycastle:pkix:1.54.0.0' 
    compile 'com.madgag.spongycastle:prov:1.54.0.0' 
    compile 'com.madgag.spongycastle:core:1.54.0.0' 
    testCompile 'junit:junit:4.12' 
} 

android { 
    compileSdkVersion 24 
    buildToolsVersion "24.0.0" 

    defaultConfig { 
     minSdkVersion 15 
     targetSdkVersion 24 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

3)在處理程序中的文件(spongycastle /郵件/ SRC /主/ JAVA /組織/ spongycastle /郵件/ SMIME /處理/): a)將import java.awt.datatransfer.DataFlavor b)移走取代的java.awt.datatransfer .DataFlavor變量/返回類型與javax.activation.ActivationDataFlavor

4)在你的Android項目包括文件夾作爲模塊

5)建立和樂趣; d

在這裏,您可以看到如何正在運行的spongycastle郵件包看起來像:https://github.com/Skywalker-11/spongycastle

這裏是一個Android應用程序看起來像一個使用固定的版本,以通過SMTP https://github.com/Skywalker-11/SpongyCastleMailTestApp

相關問題