Chrisc,
Чтобы отслеживать добавление нового провайдера, вы можете добавлять файлы в любое место, в том числе в приложении.В Android уже есть несколько провайдеров, зарегистрированных в разных пакетах.Например, в dalvik / libcore / security / src / main / java / java / security / Security.java
// Register default providers
private static void registerDefaultProviders() {
secprops.put("security.provider.1", "org.apache.harmony.security.provider.cert.DRLCertFactory"); //$NON-NLS-1$ //$NON-NLS-2$
secprops.put("security.provider.2", "org.apache.harmony.security.provider.crypto.CryptoProvider"); //$NON-NLS-1$ //$NON-NLS-2$
secprops.put("security.provider.3", "org.apache.harmony.xnet.provider.jsse.JSSEProvider"); //$NON-NLS-1$ //$NON-NLS-2$
secprops.put("security.provider.4", "org.bouncycastle.jce.provider.BouncyCastleProvider"); //$NON-NLS-1$ //$NON-NLS-2$
}
, а также избыточно в libcore / security / src / main / java / java / security /security.properties
Однако, даже если вы добавите свои собственные классы в тот же пакет, это не повлияет на существующего провайдера.Это потому, что классы Provider, такие как в данном случае JSSEProvider, определяют, какие классы используются для обеспечения различных реализаций алгоритма (через свойства, которые вы видите выше)
В вашем случае вы, вероятно, захотите предоставить новыйРеализация SSLContext.В JSSEProvider вы можете видеть, что он регистрирует SSLContextImpl для предоставления реализации SSLContext «TLS» (иначе SSL): put («SSLContext.TLS», SSLContextImpl.class.getName ());
Таким образом, вы можете добавитьваш собственный провайдер, который регистрирует альтернативную реализацию.
Вам не нужно добавлять своего провайдера в Security.java или security.properties, но вы можете использовать Security.addProvider для добавления нового или даже Security.insertProviderAt для управления тем, где ваш провайдер будет отображаться в порядке приоритета.
После регистрации вашего собственного провайдера вы можете убедиться, что вы получаете экземпляр от своего нового провайдера, используя SSLContext.getInstance ("SSLContext", "your-имя провайдера").В качестве альтернативы, если ваш поставщик имеет более высокий приоритет, чем встроенный, все программы, вызывающие SSLContext.getInstance ("SSLContext"), получат вашу новую реализацию.
Еще одно замечание: SSLSocket также можно создавать с помощью SSLSocketFactory.getDefault ().Это можно переопределить, чтобы использовать свой собственный SSLSocketFactory с ssl.SocketFactory.provider = org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl (глядя на SSLSocketFactory.getDefault).Я не уверен, что это можно сделать в приложении, в отличие от добавления нового поставщика.
Наконец, что касается кода C ++, вы, очевидно, можете предоставить свой собственный собственный код JNI.Если вы просто делаете это в приложении, вы регистрируете его как любой другой код JNI (или его автозагрузку), но у меня нет подробностей об этом, так как я работаю со встроенным кодом большую часть времени.Как и в большинстве нативного кода, вам следует избегать коллизий имен символов, если вы встраиваете свой код в виртуальную машину, как текущий код.Мы стараемся сделать как можно большую часть кода статически ограниченной для файла, чтобы избежать таких проблем.Однако предоставление другой версии самого libssl.so - это совсем другое дело.Если вам нужно сделать что-то подобное, у меня нет ни одного протестированного устройства.
Этот документ может оказаться полезным и для фона, добавляющего новых провайдеров: Как реализовать провайдера в криптографии Java ™Архитектура http://download -llnw.oracle.com / javase / 6 / docs / technotes / guides / security / crypto / HowToImplAProvider.html
-бри