国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java.security.Provider 源碼學習筆記

quietin / 1638人閱讀

摘要:內部類提供本服務的服務的類型算法名稱本服務的實現類的名稱別名列表空如果服務沒有別名屬性映射空如果實現沒有屬性以的算法為例輸出的結果其中查看支持的密鑰類型繼承類函數前三種是類的全路徑名稱帶有后三種中的方法返回中所有的條目返回中所有的條目中

java.security.Provider 內部類Service
/**
* Construct a new service.
*
* @param provider     提供本服務的Provider
* @param type         服務的類型
* @param algorithm     算法名稱
* @param className     本服務的實現類的名稱
* @param aliases     別名列表|空(如果服務沒有別名)
* @param attributes 屬性映射|空(如果實現沒有屬性)
*
* @throws NullPointerException if provider, type, algorithm, or
* className is null
*/
public Service(Provider provider, String type, String algorithm,
    String className, List aliases, Map attributes)

以BC的RSA算法為例toString()輸出的結果

BC: Cipher.RSA -> org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$NoPadding
  aliases: [RSA//RAW, RSA//NOPADDING]
  attributes: {SupportedKeyFormats=PKCS#8|X.509, SupportedKeyClasses=javax.crypto.interfaces.RSAPublicKey|javax.crypto.interfaces.RSAPrivateKey}

BC: Cipher.RSA/OAEP -> org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$OAEPPadding
  aliases: [RSA//OAEPPADDING]

其中:

Service.className = org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$NoPadding

Service.type = Cipher

Service.algorithm = RSA

查看支持的密鑰類型:

public boolean supportsParameter(Object parameter)

attributes:SupportedKeyFormats=PKCS#8|X.509

繼承Properties類

函數put

Key=

type.algorithm

type.oid

type.OID.oid

Alg.Alias.type.algorithm

Alg.Alias.type.oid

Alg.Alias.type.OID.oid

value = className

key = type.algorithm(前三種),value是spi類的全路徑名稱

key = 帶有Alg.Alias..(后三種),value = type.algorithm中的algorithm.

方法

返回Provider中所有的property條目Set

public synchronized Set> entrySet()

返回Provider中所有的Property條目中的Set

public Set keySet() 

返回Provider中所有的Property條目中的Collection

public Collection values()

根據Type和algorithm獲取Service

public synchronized Service getService(String type, String algorithm)

繼承自Property的函數

添加
public synchronized Object put(Object key, Object value)
public synchronized void putAll(Map t)

刪除
public synchronized Object remove(Object key)
public synchronized void clear()

獲取
public Object get(Object key)
public String getProperty(String key)

type,algorithm到service的轉換
provider.put(key,value)
name = key,value = value
private void parseLegacyPut(String name, String value) {
    if (name.toLowerCase(ENGLISH).startsWith(ALIAS_PREFIX_LOWER)) {
        // e.g. put("Alg.Alias.MessageDigest.SHA", "SHA-1");
        // aliasKey ~ MessageDigest.SHA
        String stdAlg = value;
        String aliasKey = name.substring(ALIAS_LENGTH);
        String[] typeAndAlg = getTypeAndAlgorithm(aliasKey);
        if (typeAndAlg == null) {
            return;
        }
        String type = getEngineName(typeAndAlg[0]);
        String aliasAlg = typeAndAlg[1].intern();
        ServiceKey key = new ServiceKey(type, stdAlg, true);
        Service s = legacyMap.get(key);
        if (s == null) {
            s = new Service(this);
            s.type = type;
            s.algorithm = stdAlg;
            legacyMap.put(key, s);
        }
        legacyMap.put(new ServiceKey(type, aliasAlg, true), s);
        s.addAlias(aliasAlg);
    } else {
        String[] typeAndAlg = getTypeAndAlgorithm(name);
        if (typeAndAlg == null) {
            return;
        }
        int i = typeAndAlg[1].indexOf(" ");
        if (i == -1) {
            // e.g. put("MessageDigest.SHA-1", "sun.security.provider.SHA");
            String type = getEngineName(typeAndAlg[0]);
            String stdAlg = typeAndAlg[1].intern();
            String className = value;
            ServiceKey key = new ServiceKey(type, stdAlg, true);
            Service s = legacyMap.get(key);
            if (s == null) {
                s = new Service(this);
                s.type = type;
                s.algorithm = stdAlg;
                legacyMap.put(key, s);
            }
            s.className = className;
        } else { // attribute
            // e.g. put("MessageDigest.SHA-1 ImplementedIn", "Software");
            String attributeValue = value;
            String type = getEngineName(typeAndAlg[0]);
            String attributeString = typeAndAlg[1];
            String stdAlg = attributeString.substring(0, i).intern();
            String attributeName = attributeString.substring(i + 1);
            // kill additional spaces
            while (attributeName.startsWith(" ")) {
                attributeName = attributeName.substring(1);
            }
            attributeName = attributeName.intern();
            ServiceKey key = new ServiceKey(type, stdAlg, true);
            Service s = legacyMap.get(key);
            if (s == null) {
                s = new Service(this);
                s.type = type;
                s.algorithm = stdAlg;
                legacyMap.put(key, s);
            }
            s.addAttribute(attributeName, attributeValue);
        }
    }
}

調用parseLegacyPut(),實際是將type,algorithm等轉換成Map legacyMap;

引擎類在getInstance()的時候去調用Provider.getService(type,algorithm)方法,通過ServiceKey(type,algorithm)獲取到Service.
然后在引擎類的getInstance()中調用service.newInstance()返回引擎類spi的實例

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76920.html

相關文章

  • 【LNMPR源碼學習筆記匯總

    摘要:此文用于匯總跟隨陳雷老師及團隊的視頻,學習源碼過程中的思考整理與心得體會,此文會不斷更新視頻傳送門每日學習記錄使用錄像設備記錄每天的學習源碼學習源碼學習內存管理筆記源碼學習內存管理筆記源碼學習內存管理筆記源碼學習基本變量筆記 此文用于匯總跟隨陳雷老師及團隊的視頻,學習源碼過程中的思考、整理與心得體會,此文會不斷更新 視頻傳送門:【每日學習記錄】使用錄像設備記錄每天的學習 PHP7...

    Barrior 評論0 收藏0
  • Laravel學習筆記之Container源碼解析

    摘要:實際上的綁定主要有三種方式且只是一種的,這些已經在學習筆記之實例化源碼解析聊過,其實現方法并不復雜。從以上源碼發現的反射是個很好用的技術,這里給出個,看下能干些啥打印結果太長了,就不粘貼了。 說明:本文主要學習Laravel中Container的源碼,主要學習Container的綁定和解析過程,和解析過程中的依賴解決。分享自己的研究心得,希望對別人有所幫助。實際上Container的綁...

    huayeluoliuhen 評論0 收藏0
  • Java concurrent 源碼學習筆記1 - 概覽

    摘要:源碼學習筆記基于包源碼大致分為以下幾組對包集合框架的擴展更好的支持多線程并發操作線程池相關鎖基本數據類型的原子性封裝 Java concurrent 源碼學習筆記基于JDK1.8 concurrent包源碼大致分為以下幾組: 對util包集合框架的擴展(更好的支持多線程并發操作) 線程池相關 鎖 基本數據類型的原子性封裝 showImg(https://segmentfault.c...

    CocoaChina 評論0 收藏0

發表評論

0條評論

quietin

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<