1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package fr.paris.lutece.util.rsa;
35
36 import java.security.GeneralSecurityException;
37 import java.security.KeyFactory;
38 import java.security.KeyPair;
39 import java.security.KeyPairGenerator;
40 import java.security.NoSuchAlgorithmException;
41 import java.security.PrivateKey;
42 import java.security.PublicKey;
43 import java.security.spec.PKCS8EncodedKeySpec;
44 import java.security.spec.X509EncodedKeySpec;
45 import java.util.Base64;
46
47 import fr.paris.lutece.portal.service.datastore.DatastoreService;
48
49 public class RSAKeyDatastoreProvider implements IRSAKeyProvider
50 {
51
52 private static final String DATASTORE_PUBLIC_KEY = "lutece.rsa.key.public";
53 private static final String DATASTORE_PRIVATE_KEY = "lutece.rsa.key.private";
54
55 @Override
56 public PublicKey getPublicKey( ) throws GeneralSecurityException
57 {
58 if ( !DatastoreService.existsKey( DATASTORE_PUBLIC_KEY ) )
59 {
60 initKeys( );
61 }
62
63 X509EncodedKeySpec keySpecPublic = new X509EncodedKeySpec(
64 Base64.getDecoder( ).decode( DatastoreService.getDataValue( DATASTORE_PUBLIC_KEY, "" ).getBytes( ) ) );
65
66 KeyFactory keyFactory = KeyFactory.getInstance( "RSA" );
67
68 return keyFactory.generatePublic( keySpecPublic );
69
70 }
71
72 @Override
73 public PrivateKey getPrivateKey( ) throws GeneralSecurityException
74 {
75 if ( !DatastoreService.existsKey( DATASTORE_PRIVATE_KEY ) )
76 {
77 initKeys();
78 }
79
80 PKCS8EncodedKeySpec keySpecPrivate = new PKCS8EncodedKeySpec(
81 Base64.getDecoder( ).decode( DatastoreService.getDataValue( DATASTORE_PRIVATE_KEY, "" ).getBytes( ) ) );
82
83 KeyFactory keyFactory = KeyFactory.getInstance( "RSA" );
84
85 return keyFactory.generatePrivate( keySpecPrivate );
86 }
87
88
89
90
91
92 private void initKeys( ) throws GeneralSecurityException
93 {
94
95 KeyPairGenerator keyGen = KeyPairGenerator.getInstance( "RSA" );
96 keyGen.initialize( 2048 );
97 KeyPair pair = keyGen.generateKeyPair( );
98 PrivateKey privateKey = pair.getPrivate( );
99 PublicKey publicKey = pair.getPublic( );
100
101
102 DatastoreService.setDataValue( DATASTORE_PUBLIC_KEY, Base64.getEncoder( ).encodeToString( publicKey.getEncoded( ) ) );
103 DatastoreService.setDataValue( DATASTORE_PRIVATE_KEY, Base64.getEncoder( ).encodeToString( privateKey.getEncoded( ) ) );
104 }
105
106 }