Привязка Xamarin.Android к губчатому замку/надувному замку

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

Пока у меня есть:

<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#. Или есть лучший способ?

Обновление: когда я собираю процессор, он выглядит так (посмотрите на Java): введите здесь описание изображения


person chrisva    schedule 01.07.2016    source источник
comment
Почему бы не использовать Bouncy Castle?   -  person jzeferino    schedule 01.07.2016
comment
Я не эксперт по криптографии, но когда так много людей на разных форумах заявляют: платформа Android, к сожалению, поставляет неполную и устаревшую версию Bouncy Castle для Android, что также затрудняет установку обновленной версии библиотеки. Тем не менее, нам пришлось придерживаться Spongy Castle, версии Bouncy Castle, перепакованной для работы на Android. - Я выбираю Губчатый Замок. ссылка: aerogear.org/docs/specs/aerogear-crypto   -  person chrisva    schedule 02.07.2016
comment
Недавно я использовал надувной замок в pcl с Android. Не было проблем.   -  person jzeferino    schedule 02.07.2016
comment
Вероятно, это зависит от того, что вам нужно сделать. У меня есть зависимость от нескольких библиотек, которые делают довольно интересные вещи с NFC. Таким образом, рекомендуется использовать SpongyCastle библиотеками, от которых у меня есть зависимости. В любом случае, это больше касается решения привязки/вызовов Java из Xamarin, а не того, какие библиотеки нужны.   -  person chrisva    schedule 02.07.2016


Ответы (2)


Под 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, либо реализацией платформы.

person Jon Douglas    schedule 02.07.2016
comment
@chrisva Я думаю, что это лучший путь, и поэтому я сказал переехать в Надувной замок. - person jzeferino; 02.07.2016
comment
Да, это AAR, я имею в виду. Спасибо, что указали мне направление на уже существующие PCL. Я знаю их довольно хорошо. В моей сторонней библиотеке есть зависимости от Spongy Castle, поэтому я не ищу простого способа обойти это. Я хочу научиться делать привязку наиболее оптимизированным способом, потому что то, что мы создадим, потребует в будущем несколько проектов привязки разной сложности. Так что JNI кажется нам очень интересным подходом в этом случае. Я углублюсь в это и дам обновленную информацию о том, как это происходит. Спасибо. - person chrisva; 03.07.2016
comment
Кстати, этот путеводитель просто великолепен @jon-douglas. - person chrisva; 03.07.2016

В итоге я удалил почти все, что связано с BouncyCastle и SpongyCastle, в моем файле metadata.xml в проекте привязки. Затем я скопировал части сгенерированного BouncyCastleProvider из папки сгенерированных файлов в Binding Project. Поэтому я создал свою собственную оболочку 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
        {
        }
    }
}
}
person chrisva    schedule 05.07.2016