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

package com.nimbusds.jose.jwk.gen;

import java.util.Collections;
import java.util.LinkedHashSet;
import com.nimbusds.jose.jwk.JWK;
import java.security.GeneralSecurityException;
import com.google.crypto.tink.subtle.Ed25519Sign;
import com.nimbusds.jose.util.Base64URL;
import java.security.InvalidKeyException;
import com.nimbusds.jose.JOSEException;
import com.google.crypto.tink.subtle.X25519;
import java.util.Objects;
import java.util.Set;
import com.nimbusds.jose.jwk.Curve;
import com.nimbusds.jose.jwk.OctetKeyPair;

public class OctetKeyPairGenerator extends JWKGenerator<OctetKeyPair>
{
    private final Curve crv;
    public static final Set<Curve> SUPPORTED_CURVES;
    
    public OctetKeyPairGenerator(final Curve crv) {
        if (!OctetKeyPairGenerator.SUPPORTED_CURVES.contains(Objects.requireNonNull(crv))) {
            throw new IllegalArgumentException("Curve not supported for OKP generation");
        }
        this.crv = crv;
    }
    
    @Override
    public OctetKeyPair generate() throws JOSEException {
        Base64URL privateKey;
        Base64URL publicKey;
        if (this.crv.equals(Curve.X25519)) {
            byte[] privateKeyBytes;
            byte[] publicKeyBytes;
            try {
                privateKeyBytes = X25519.generatePrivateKey();
                publicKeyBytes = X25519.publicFromPrivate(privateKeyBytes);
            }
            catch (final InvalidKeyException e) {
                throw new JOSEException(e.getMessage(), e);
            }
            privateKey = Base64URL.encode(privateKeyBytes);
            publicKey = Base64URL.encode(publicKeyBytes);
        }
        else {
            if (!this.crv.equals(Curve.Ed25519)) {
                throw new JOSEException("Curve not supported");
            }
            Ed25519Sign.KeyPair tinkKeyPair;
            try {
                if (this.secureRandom != null) {
                    final byte[] seed = new byte[32];
                    this.secureRandom.nextBytes(seed);
                    tinkKeyPair = Ed25519Sign.KeyPair.newKeyPairFromSeed(seed);
                }
                else {
                    tinkKeyPair = Ed25519Sign.KeyPair.newKeyPair();
                }
            }
            catch (final GeneralSecurityException e2) {
                throw new JOSEException(e2.getMessage(), e2);
            }
            privateKey = Base64URL.encode(tinkKeyPair.getPrivateKey());
            publicKey = Base64URL.encode(tinkKeyPair.getPublicKey());
        }
        final OctetKeyPair.Builder builder = new OctetKeyPair.Builder(this.crv, publicKey).d(privateKey).keyUse(this.use).keyOperations(this.ops).algorithm(this.alg).expirationTime(this.exp).notBeforeTime(this.nbf).issueTime(this.iat);
        if (this.tprKid) {
            builder.keyIDFromThumbprint();
        }
        else {
            builder.keyID(this.kid);
        }
        return builder.build();
    }
    
    static {
        final Set<Curve> curves = new LinkedHashSet<Curve>();
        curves.add(Curve.X25519);
        curves.add(Curve.Ed25519);
        SUPPORTED_CURVES = Collections.unmodifiableSet((Set<? extends Curve>)curves);
    }
}
