Decode the public key before giving it to Ed25519Signature2020LdVerifier
This commit is contained in:
		
							parent
							
								
									07b3abcc57
								
							
						
					
					
						commit
						f08e835e95
					
				@ -3,6 +3,7 @@ package org.oneedtech.inspect.vc.probe;
 | 
			
		||||
import java.io.StringReader;
 | 
			
		||||
import java.net.URI;
 | 
			
		||||
 | 
			
		||||
import org.bouncycastle.util.Arrays;
 | 
			
		||||
import org.oneedtech.inspect.core.probe.Probe;
 | 
			
		||||
import org.oneedtech.inspect.core.probe.RunContext;
 | 
			
		||||
import org.oneedtech.inspect.core.report.ReportItems;
 | 
			
		||||
@ -10,6 +11,7 @@ import org.oneedtech.inspect.vc.Credential;
 | 
			
		||||
import org.oneedtech.inspect.vc.util.CachingDocumentLoader;
 | 
			
		||||
 | 
			
		||||
import com.apicatalog.ld.DocumentError;
 | 
			
		||||
import com.apicatalog.multibase.Multibase;
 | 
			
		||||
import com.apicatalog.vc.processor.StatusVerifier;
 | 
			
		||||
import com.danubetech.verifiablecredentials.VerifiableCredential;
 | 
			
		||||
 | 
			
		||||
@ -36,7 +38,42 @@ public class EmbeddedProofProbe extends Probe<Credential> {
 | 
			
		||||
		vc.setDocumentLoader(new CachingDocumentLoader()); 
 | 
			
		||||
						
 | 
			
		||||
		URI method = vc.getLdProof().getVerificationMethod();
 | 
			
		||||
		byte[] publicKey = method.toString().getBytes(); 
 | 
			
		||||
 | 
			
		||||
		// The verification method must dereference to an Ed25519VerificationKey2020.
 | 
			
		||||
		// Danubetech's Ed25519Signature2020LdVerifier expects the decoded public key
 | 
			
		||||
		// from the Ed25519VerificationKey2020 (32 bytes).
 | 
			
		||||
 | 
			
		||||
		String publicKeyMultibase = "";
 | 
			
		||||
 | 
			
		||||
		// Formats accepted:
 | 
			
		||||
		//
 | 
			
		||||
		// [controller]#[publicKeyMultibase]
 | 
			
		||||
		// did:key:[publicKeyMultibase]
 | 
			
		||||
		// [publicKeyMultibase]
 | 
			
		||||
 | 
			
		||||
		if (method.toString().contains("#")) {
 | 
			
		||||
			publicKeyMultibase = method.getFragment();
 | 
			
		||||
		} else {
 | 
			
		||||
			if (method.toString().startsWith("did")) {
 | 
			
		||||
				String didScheme = method.getSchemeSpecificPart();
 | 
			
		||||
				if (didScheme.startsWith("key:")) {
 | 
			
		||||
					publicKeyMultibase = didScheme.substring(4);
 | 
			
		||||
				} else {
 | 
			
		||||
					return fatal("Unknown verification method: " + method.toString(), ctx);
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				publicKeyMultibase = method.toString();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Decode the Multibase to Multicodec and check that it is an Ed25519 public key
 | 
			
		||||
		byte[] publicKeyMulticodec = Multibase.decode(publicKeyMultibase);
 | 
			
		||||
		if (publicKeyMulticodec[0] != -19 || publicKeyMulticodec[1] != 1) {
 | 
			
		||||
			return fatal("Verification method does not contain an Ed25519 public key", ctx);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Extract the publicKey bytes from the Multicodec
 | 
			
		||||
		byte[] publicKey = Arrays.copyOfRange(publicKeyMulticodec, 2, publicKeyMulticodec.length);
 | 
			
		||||
		
 | 
			
		||||
		Ed25519Signature2020LdVerifier verifier = new Ed25519Signature2020LdVerifier(publicKey); 
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user