android
  • xamarin
  • xamarin.android
  • bouncycastle
  • spongycastle
  • 2016-07-01 4 views 3 likes 
    3

    Кто-нибудь успешно связал SpongyCastle с Xamarin.Android? Я сталкиваюсь с кучей предупреждений с моим Metadata.xml в проекте привязки.Xamarin.Android binding Spongy Castle/Bouncy Castle

    До сих пор у меня есть:

    <remove-node path="/api/package[@name='org.spongycastle.x509']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.crypto']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.crypto.tls']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.cms']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.crypto.prng']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.openpgp']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.openssl']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.cert.ocsp']" /> 
    
    <remove-node path="/api/package[@name='org.spongycastle.jcajce']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.dh']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.ec']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.digest']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.keystore.bc']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.symmetric']" /> 
    
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.dsa']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.util']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.symmetric.util']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.gost']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.ies']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.rsa']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jcajce.provider.asymmetric.x509']" /> 
    
    <remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='CertStoreCollectionSpi']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='MultiCertStoreSpi']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='X509CRLEntryObject']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='X509CRLObject']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='X509CertificateObject']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='X509LDAPCertStoreSpi']"/> 
    <remove-node path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='PKIXPolicyNode']" /> 
    
    <remove-node path="/api/package[@name='org.spongycastle.pqc.jcajce.provider.rainbow']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.pqc.jcajce.provider.mceliece']"/> 
    <remove-node path="/api/package[@name='org.spongycastle.pqc.jcajce.provider.util']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.pqc.crypto.ntru']" /> 
    <remove-node path="/api/package[@name='org.spongycastle.pqc.math.ntru.polynomial']" /> 
    

    Так компилируется, но при использовании привязки проекта в проекте Xamarin.Android занимает несколько минут. для компиляции, а затем он не отвечает на вопрос о размере HEAP Java.

    Когда я устанавливаю размер кучи в 1 ГБ, он завершается, но при запуске приложения в режиме отладки на устройстве прерывается отладка.

    Есть ли способ использовать ARR без библиотеки привязки? Мне просто нужно вызвать метод оболочки, который я сделал в этом ARR, и получить из него результат. Мне не нужно обращаться к полной библиотеке через C#. Или есть лучший способ?

    Update: И когда я строю процессор выглядит следующим образом (Посмотрите на Java): enter image description here

    +0

    Почему бы не использовать Bouncy Castle? – jzeferino

    +0

    Я не специалист по криптографии, но когда на многих форумах так много людей заявляет: «К сожалению, на платформе Android имеется неполная и устаревшая версия Bouncy Castle для Android, которая также затрудняет установку обновленной версии библиотеки. , нам пришлось придерживаться Spongy Castle, версия Bouncy Castle переупакована, чтобы заставить ее работать на Android ». - Я выбираю Spongy Castle. ref: https://aerogear.org/docs/specs/aerogear-crypto/ – chrisva

    +0

    Недавно я использовал bouncy castle в pcl с Android. Не было проблем. – jzeferino

    ответ

    0

    Я закончил удаление почти всего, что связано с BouncyCastle и SpongyCastle в файле metadata.xml в проекте привязки. Затем я скопировал части сгенерированного BouncyCastleProvider из сгенерированной папки с файлами в проекте Binding. Поэтому я создал свою собственную обертку JNI только для тех частей, которые мне нужно было вызвать.

    Отлично работает. Теперь время компиляции сокращается до нескольких секунд, а развертывание выполняется быстро во время отладки. И мне нравятся сторонние библиотеки.

    Мое предположение заключалось в том, чтобы сначала сгенерировать классы C#, а затем выбрать реализовать части JNI в моей собственной библиотеке и добавить/удалить узлы в Metadata.xml.

    using System; 
    using System.Collections.Generic; 
    using Android.Runtime; 
    namespace Org.Spongycastle.Jce.Provider 
    { 
    
    // Metadata.xml XPath class reference: path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='BouncyCastleProvider']" 
    [global::Android.Runtime.Register("org/spongycastle/jce/provider/BouncyCastleProvider", DoNotGenerateAcw = true)] 
    public sealed partial class BouncyCastleProvider : global::Java.Security.Provider 
    { 
        // Metadata.xml XPath field reference: path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='BouncyCastleProvider']/field[@name='PROVIDER_NAME']" 
        [Register("PROVIDER_NAME")] 
        public const string ProviderName = (string)"SC"; 
    
        internal static IntPtr java_class_handle; 
        internal static IntPtr class_ref 
        { 
         get 
         { 
          return JNIEnv.FindClass("org/spongycastle/jce/provider/BouncyCastleProvider", ref java_class_handle); 
         } 
        } 
    
        protected override IntPtr ThresholdClass 
        { 
         get { return class_ref; } 
        } 
    
        protected override global::System.Type ThresholdType 
        { 
         get { return typeof(BouncyCastleProvider); } 
        } 
    
        internal BouncyCastleProvider(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { } 
    
        static IntPtr id_ctor; 
        // Metadata.xml XPath constructor reference: path="/api/package[@name='org.spongycastle.jce.provider']/class[@name='BouncyCastleProvider']/constructor[@name='BouncyCastleProvider' and count(parameter)=0]" 
        [Register(".ctor", "()V", "")] 
        public unsafe BouncyCastleProvider() 
         : base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer) 
        { 
         if (Handle != IntPtr.Zero) 
          return; 
    
         try 
         { 
          if (GetType() != typeof(BouncyCastleProvider)) 
          { 
           SetHandle(
             global::Android.Runtime.JNIEnv.StartCreateInstance(GetType(), "()V"), 
             JniHandleOwnership.TransferLocalRef); 
           global::Android.Runtime.JNIEnv.FinishCreateInstance(Handle, "()V"); 
           return; 
          } 
    
          if (id_ctor == IntPtr.Zero) 
           id_ctor = JNIEnv.GetMethodID(class_ref, "<init>", "()V"); 
          SetHandle(
            global::Android.Runtime.JNIEnv.StartCreateInstance(class_ref, id_ctor), 
            JniHandleOwnership.TransferLocalRef); 
          JNIEnv.FinishCreateInstance(Handle, class_ref, id_ctor); 
         } 
         finally 
         { 
         } 
        } 
    } 
    } 
    
    1

    По ARR, вы имеете в виду AAR? В случае использования только некоторые детали, вы можете напрямую использовать JNI: https://developer.xamarin.com/guides/android/advanced_topics/java_integration_overview/working_with_jni/

    Самый простой способ будет <remove-node> всех элементов, которые не хотят, чтобы держать и работать на те, которые вы хотите сохранить. Однако вам может потребоваться убедиться, что вы сохраните зависимости, чтобы они правильно привязывались. Это может стать довольно неприятным.

    У меня есть общее руководство, которое может помочь в некоторых областях, с этим обязательным:

    https://github.com/JonDouglas/xamarin-support-docs/blob/master/Android/android-bindings-troubleshooting.md

    Как упомянуто @jzeferino вы всегда можете пойти по пути использования то, что это немного больше боя проверенного чем сверните свою собственную привязку.

    BouncyCastle-PCL: https://github.com/onovotny/BouncyCastle-PCL

    PCL Crypto: https://github.com/AArnott/PCLCrypto

    Оба они обеспечивают соответствующие криптографические методы для выполнения вашей задачи. В случае PCLCrypto они либо обеспечиваются реализацией Mono, либо реализацией платформы.

    +0

    @chrisva Я думаю, что это лучший путь для выбора, и вот почему я сказал переехать в замок Бунси. – jzeferino

    +0

    Да, это AAR, я имею в виду. Спасибо, что указали мне в сторону PCL, который уже там. Я их хорошо знаю. У моей сторонней библиотеки есть зависимости от Spongy Castle, поэтому я не ищу ее легко. Я хочу узнать, как сделать привязку наиболее оптимизированным способом, потому что то, что мы построим, потребует нескольких обязательных проектов в будущем с различной сложностью. Поэтому JNI представляется нам очень интересным для нас в этом случае. Я погружусь в него и расскажу о том, как это происходит. Благодарю. – chrisva

    +0

    И этот гид замечательный кстати @ jon-douglas – chrisva

    Смежные вопросы