001package co.codewizards.cloudstore.core.auth;
002
003import static co.codewizards.cloudstore.core.util.Util.*;
004
005import java.security.KeyFactory;
006import java.security.PrivateKey;
007import java.security.Signature;
008import java.security.spec.EncodedKeySpec;
009import java.security.spec.PKCS8EncodedKeySpec;
010
011import co.codewizards.cloudstore.core.util.AssertUtil;
012
013public class AuthTokenSigner {
014        public static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
015        private PrivateKey privateKey;
016
017        public AuthTokenSigner(byte[] privateKeyData) {
018                AssertUtil.assertNotNull(privateKeyData, "privateKeyData");
019                BouncyCastleRegistrationUtil.registerBouncyCastleIfNeeded();
020                try {
021                        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
022                        EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyData);
023                        this.privateKey = keyFactory.generatePrivate(privateKeySpec);
024                } catch (RuntimeException e) {
025                        throw e;
026                } catch (Exception e) {
027                        throw new RuntimeException(e);
028                }
029        }
030
031        public SignedAuthToken sign(byte[] authTokenData) {
032                AssertUtil.assertNotNull(authTokenData, "authTokenData");
033                Signature signingEngine;
034                try {
035                        signingEngine = Signature.getInstance(SIGNATURE_ALGORITHM);
036                        signingEngine.initSign(privateKey);
037                        signingEngine.update(authTokenData);
038                        byte[] signature = signingEngine.sign();
039
040//                      SignedObject signedObject = new SignedObject(authTokenData, privateKey, signingEngine);
041
042                        SignedAuthToken signedAuthToken = new SignedAuthToken();
043                        signedAuthToken.setAuthTokenData(authTokenData);
044                        signedAuthToken.setSignature(signature);
045                        return signedAuthToken;
046                } catch (Exception e) {
047                        throw new RuntimeException(e);
048                }
049        }
050}