Charles Forsythbase class for PK signatures6377e8f12 years agoHistory
77 lines · 1.9 KB · Java
RawDownload
package plan9.auth; import plan9.lib.Attrs;import plan9.lib.Base16;import plan9.lib.Strings; import java.math.BigInteger;import java.nio.ByteBuffer; import java.util.ArrayList;import java.util.Arrays; public class PKsig {	public String alg;	// signature algorithm (eg, "rsa") that determines parameters 	public static class Param {		String	label;		byte[]	value; 		public Param(String l, byte[] v){			this.label = l;			this.value = v;		}	} 	public ArrayList<Param>	sig;	// values in known order 	private static final Base16 base16 = new Base16(); 	public PKsig(String alg) {		this.alg = alg;		this.sig = new ArrayList<Param>();	} 	// initialise a signature value for the current algorithm, requiring each given name to have a base16 value in av	public void init(Attrs av, String... names) throws CryptoError {		for(String n : names){			String s = av.findattrval(n);			if(s == null)				throw new CryptoError("missing signature attribute: "+n);			byte v[] = base16.dec(s);			//if(v == null)			//	throw new CryptoError("invalid signature attribute value: "+n+": "+s);			add(n, v);		}	} 	public final PKsig add(String n, byte[] v){		sig.add(new Param(n, Arrays.copyOf(v, v.length)));		return this;	} 	public final BigInteger getb(int n) {		// the exception "can't happen" because we've checked validity when building sig		if(n < 0 || n >= this.sig.size())			throw new RuntimeException("invalid PKsig parameter index (internal error)");		return new BigInteger(1, this.sig.get(n).value);	} 	// just the values; caller supplies full algorithm	public String toString(){		StringBuilder bs = new StringBuilder(64);		for(Param p : sig){			if(bs.length() > 0)				bs.append(' ');			bs.append(p.label);			bs.append('=');			bs.append(base16.enc(p.value));		}		return bs.toString();	} 	public void pack(ByteBuffer b){		for(Param p : sig)			b.put(p.value);	}}