// 
// Decompiled by Procyon v0.6.0
// 

package com.nimbusds.jose.crypto;

import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.util.Base64URL;
import com.nimbusds.jose.JWSHeader;
import java.security.GeneralSecurityException;
import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.jwk.Curve;
import com.google.crypto.tink.subtle.Ed25519Sign;
import com.nimbusds.jose.jwk.OctetKeyPair;
import com.nimbusds.jose.shaded.jcip.ThreadSafe;
import com.nimbusds.jose.JWSSigner;
import com.nimbusds.jose.crypto.impl.EdDSAProvider;

@ThreadSafe
public class Ed25519Signer extends EdDSAProvider implements JWSSigner
{
    private final OctetKeyPair privateKey;
    private final Ed25519Sign tinkSigner;
    
    public Ed25519Signer(final OctetKeyPair privateKey) throws JOSEException {
        if (!Curve.Ed25519.equals(privateKey.getCurve())) {
            throw new JOSEException("Ed25519Signer only supports OctetKeyPairs with crv=Ed25519");
        }
        if (!privateKey.isPrivate()) {
            throw new JOSEException("The OctetKeyPair doesn't contain a private part");
        }
        this.privateKey = privateKey;
        try {
            this.tinkSigner = new Ed25519Sign(privateKey.getDecodedD());
        }
        catch (final GeneralSecurityException e) {
            throw new JOSEException(e.getMessage(), e);
        }
    }
    
    public OctetKeyPair getPrivateKey() {
        return this.privateKey;
    }
    
    @Override
    public Base64URL sign(final JWSHeader header, final byte[] signingInput) throws JOSEException {
        final JWSAlgorithm alg = header.getAlgorithm();
        if (!JWSAlgorithm.Ed25519.equals(alg) && !JWSAlgorithm.EdDSA.equals(alg)) {
            throw new JOSEException("Ed25519Verifier requires alg=Ed25519 or alg=EdDSA in JWSHeader");
        }
        byte[] jwsSignature;
        try {
            jwsSignature = this.tinkSigner.sign(signingInput);
        }
        catch (final GeneralSecurityException e) {
            throw new JOSEException(e.getMessage(), e);
        }
        return Base64URL.encode(jwsSignature);
    }
}
