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
011public class AuthTokenSigner {
012        public static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
013        private PrivateKey privateKey;
014
015        public AuthTokenSigner(byte[] privateKeyData) {
016                assertNotNull("privateKeyData", privateKeyData);
017                BouncyCastleRegistrationUtil.registerBouncyCastleIfNeeded();
018                try {
019                        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
020                        EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyData);
021                        this.privateKey = keyFactory.generatePrivate(privateKeySpec);
022                } catch (RuntimeException e) {
023                        throw e;
024                } catch (Exception e) {
025                        throw new RuntimeException(e);
026                }
027        }
028
029        public SignedAuthToken sign(byte[] authTokenData) {
030                assertNotNull("authTokenData", authTokenData);
031                Signature signingEngine;
032                try {
033                        signingEngine = Signature.getInstance(SIGNATURE_ALGORITHM);
034                        signingEngine.initSign(privateKey);
035                        signingEngine.update(authTokenData);
036                        byte[] signature = signingEngine.sign();
037
038//                      SignedObject signedObject = new SignedObject(authTokenData, privateKey, signingEngine);
039
040                        SignedAuthToken signedAuthToken = new SignedAuthToken();
041                        signedAuthToken.setAuthTokenData(authTokenData);
042                        signedAuthToken.setSignature(signature);
043                        return signedAuthToken;
044                } catch (Exception e) {
045                        throw new RuntimeException(e);
046                }
047        }
048}