package com.eactive.eai.authserver.jwt;

import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.MGF1ParameterSpec;
import java.security.spec.PSSParameterSpec;

import org.springframework.security.jwt.crypto.sign.Signer;

/**
 * PS256 (RSA-PSS + SHA-256) 서명 구현체.
 * RFC 7518 §3.5 파라미터: Hash=SHA-256, MGF=MGF1/SHA-256, saltLen=32, trailer=0xBC
 * JDK 11+ 내장 RSASSA-PSS 사용. JDK 8 환경은 BouncyCastle 프로바이더 등록이 필요하다.
 *
 * JwtHelper를 우회하는 PssJwtAccessTokenConverter와 함께 사용한다.
 * (spring-security-jwt 1.1.1은 JwtAlgorithms에 PS256을 등록하지 않아 JwtHelper 직접 사용 불가)
 */
public class RsaPssSigner implements Signer {

    private static final PSSParameterSpec PSS_SPEC =
            new PSSParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, 32, 1);

    private final RSAPrivateKey privateKey;

    public RsaPssSigner(RSAPrivateKey privateKey) {
        this.privateKey = privateKey;
    }

    @Override
    public byte[] sign(byte[] bytes) {
        try {
            Signature sig = Signature.getInstance("RSASSA-PSS");
            sig.setParameter(PSS_SPEC);
            sig.initSign(privateKey);
            sig.update(bytes);
            return sig.sign();
        } catch (Exception e) {
            throw new RuntimeException("RSA-PSS 서명 실패", e);
        }
    }

    @Override
    public String algorithm() {
        return "PS256";
    }
}
