provider java_java.security.Provider 源码学习笔记

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的实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值