jtulach@44: package org.apidesign.impl.security.extension; jtulach@44: jtulach@44: import org.apidesign.api.security.Digest; jtulach@44: import java.nio.ByteBuffer; jtulach@44: import java.security.MessageDigest; jtulach@44: import java.security.NoSuchAlgorithmException; jtulach@44: import java.security.Provider; jtulach@44: import java.security.Security; jtulach@44: import java.util.Collections; jtulach@44: import java.util.List; jtulach@44: import java.util.Map; jtulach@44: jtulach@44: /** jtulach@44: * jtulach@44: * @author Jaroslav Tulach jtulach@44: */ jtulach@51: // BEGIN: day.end.bridges.BridgeToOld jtulach@51: public final class BridgeToOld extends Provider { jtulach@44: jtulach@44: public BridgeToOld() { jtulach@44: super("spi.Digestor", 1.0, ""); jtulach@44: Security.addProvider(this); jtulach@44: } jtulach@51: jtulach@51: // BEGIN: day.end.bridges.cycle jtulach@51: private ThreadLocal searching = new ThreadLocal(); jtulach@51: final boolean isSearching() { jtulach@51: return Boolean.TRUE.equals(searching.get()); jtulach@51: } jtulach@44: jtulach@44: @Override jtulach@44: public synchronized Service getService(String type, String algorithm) { jtulach@51: Boolean prev = searching.get(); jtulach@51: try { jtulach@51: searching.set(Boolean.TRUE); jtulach@51: if ("MessageDigest".equals(type)) { jtulach@51: Digest dig = Digest.getInstance(algorithm); jtulach@51: if (dig != null) { jtulach@132: return new ServiceImpl( jtulach@132: dig, this, type, algorithm, "", jtulach@132: Collections.emptyList(), jtulach@132: Collections.emptyMap()); jtulach@51: } jtulach@44: } jtulach@51: return null; jtulach@51: } finally { jtulach@51: searching.set(prev); jtulach@44: } jtulach@44: } jtulach@51: // END: day.end.bridges.cycle jtulach@44: jtulach@44: private static class ServiceImpl extends Service { jtulach@44: Digest dig; jtulach@44: jtulach@132: public ServiceImpl(Digest dig, Provider provider, jtulach@132: String type, String algorithm, String className, jtulach@132: List aliases, Map attributes jtulach@132: ) { jtulach@44: super(provider, type, algorithm, className, aliases, attributes); jtulach@44: this.dig = dig; jtulach@44: } jtulach@44: jtulach@44: @Override jtulach@132: public Object newInstance(Object constructorParameter) jtulach@132: throws NoSuchAlgorithmException { jtulach@44: return new MessageDigest(getAlgorithm()) { jtulach@44: private byte[] res; jtulach@44: jtulach@44: @Override jtulach@44: protected void engineUpdate(byte input) { jtulach@44: ByteBuffer bb = ByteBuffer.wrap(new byte[] { input }); jtulach@44: res = dig.digest(bb); jtulach@44: } jtulach@44: jtulach@44: @Override jtulach@132: protected void engineUpdate( jtulach@132: byte[] input, int offset, int len jtulach@132: ) { jtulach@44: ByteBuffer bb = ByteBuffer.wrap(input); jtulach@44: bb.position(offset); jtulach@44: bb.limit(offset + len); jtulach@44: res = dig.digest(bb); jtulach@44: } jtulach@44: jtulach@44: @Override jtulach@44: protected byte[] engineDigest() { jtulach@44: return res; jtulach@44: } jtulach@44: jtulach@44: @Override jtulach@44: protected void engineReset() { jtulach@44: dig = Digest.getInstance(getAlgorithm()); jtulach@44: } jtulach@44: }; jtulach@44: } jtulach@44: jtulach@44: jtulach@44: } jtulach@44: jtulach@44: } jtulach@51: // END: day.end.bridges.BridgeToOld