11package com .pedrouid .crypto ;
22
3- import android .widget .Toast ;
4-
5- import java .io .IOException ;
6- import java .security .SecureRandom ;
7- import java .util .HashMap ;
8- import java .util .Map ;
9-
10- import java .util .UUID ;
11-
12- import java .security .MessageDigest ;
13- import java .security .NoSuchAlgorithmException ;
14- import java .security .spec .InvalidKeySpecException ;
15- import java .security .InvalidKeyException ;
16-
17- import java .nio .charset .StandardCharsets ;
3+ import android .util .Base64 ;
184
19- import javax .crypto .Cipher ;
20- import javax .crypto .SecretKey ;
21- import javax .crypto .spec .SecretKeySpec ;
22- import javax .crypto .spec .IvParameterSpec ;
23- import javax .crypto .spec .PBEKeySpec ;
24- import javax .crypto .SecretKeyFactory ;
25- import javax .crypto .Mac ;
5+ import com .facebook .react .bridge .Promise ;
6+ import com .facebook .react .bridge .ReactApplicationContext ;
7+ import com .facebook .react .bridge .ReactContextBaseJavaModule ;
8+ import com .facebook .react .bridge .ReactMethod ;
269
2710import org .spongycastle .crypto .ExtendedDigest ;
11+ import org .spongycastle .crypto .PBEParametersGenerator ;
2812import org .spongycastle .crypto .digests .SHA1Digest ;
2913import org .spongycastle .crypto .digests .SHA224Digest ;
3014import org .spongycastle .crypto .digests .SHA256Digest ;
3115import org .spongycastle .crypto .digests .SHA384Digest ;
32- import org .spongycastle .crypto .digests .SHA384Digest ;
3316import org .spongycastle .crypto .digests .SHA512Digest ;
3417import org .spongycastle .crypto .generators .PKCS5S2ParametersGenerator ;
35- import org .spongycastle .crypto .PBEParametersGenerator ;
3618import org .spongycastle .crypto .params .KeyParameter ;
37- import org .spongycastle .util .encoders .Hex ;
3819
39- import android .util .Base64 ;
40-
41- import com .facebook .react .bridge .NativeModule ;
42- import com .facebook .react .bridge .ReactApplicationContext ;
43- import com .facebook .react .bridge .Promise ;
44- import com .facebook .react .bridge .ReactContext ;
45- import com .facebook .react .bridge .ReactContextBaseJavaModule ;
46- import com .facebook .react .bridge .ReactMethod ;
47- import com .facebook .react .bridge .Callback ;
20+ import java .security .NoSuchAlgorithmException ;
21+ import java .util .HashMap ;
22+ import java .util .Map ;
4823
4924public class RCTPbkdf2 extends ReactContextBaseJavaModule {
5025
@@ -58,27 +33,18 @@ public String getName() {
5833 }
5934
6035 @ ReactMethod
61- public void hash (String pwd , String saltBase64 , Integer iterations , Integer keyLen , String hash , Promise promise ) {
36+ public void hash (String pwdBase64 , String saltBase64 , Integer iterations , Integer keyLen , String hash , Promise promise ) {
6237 try {
63- String strs = pbkdf2 (pwd , saltBase64 , iterations , keyLen , hash );
64- promise .resolve (strs );
38+ byte [] pwdBytes = Base64 .decode (pwdBase64 , Base64 .DEFAULT );
39+ byte [] saltBytes = Base64 .decode (saltBase64 , Base64 .DEFAULT );
40+ byte [] digest = pbkdf2 (pwdBytes , saltBytes , iterations , keyLen , hash );
41+ promise .resolve (Base64 .encodeToString (digest , Base64 .NO_WRAP ));
6542 } catch (Exception e ) {
6643 promise .reject ("-1" , e .getMessage ());
6744 }
6845 }
6946
70- public static String bytesToHex (byte [] bytes ) {
71- final char [] hexArray = "0123456789abcdef" .toCharArray ();
72- char [] hexChars = new char [bytes .length * 2 ];
73- for ( int j = 0 ; j < bytes .length ; j ++ ) {
74- int v = bytes [j ] & 0xFF ;
75- hexChars [j * 2 ] = hexArray [v >>> 4 ];
76- hexChars [j * 2 + 1 ] = hexArray [v & 0x0F ];
77- }
78- return new String (hexChars );
79- }
80-
81- private static String pbkdf2 (String pwd , String salt , Integer iterations , Integer keyLen , String hash ) throws NoSuchAlgorithmException , InvalidKeySpecException {
47+ private static byte [] pbkdf2 (byte [] pwd , byte [] salt , Integer iterations , Integer keyLen , String hash ) throws NullPointerException , NoSuchAlgorithmException {
8248 Map <String , ExtendedDigest > algMap = new HashMap <String , ExtendedDigest >();
8349 algMap .put ("SHA1" , new SHA1Digest ());
8450 algMap .put ("SHA224" , new SHA224Digest ());
@@ -87,10 +53,12 @@ private static String pbkdf2(String pwd, String salt, Integer iterations, Intege
8753 algMap .put ("SHA512" , new SHA512Digest ());
8854 ExtendedDigest alg = algMap .get (hash );
8955
56+ if (alg == null ) {
57+ throw new NoSuchAlgorithmException ("Specified hash algorithm is not supported" );
58+ }
59+
9060 PBEParametersGenerator gen = new PKCS5S2ParametersGenerator (alg );
91- byte [] saltBytes = Base64 .decode (salt , Base64 .DEFAULT );
92- gen .init (pwd .getBytes (StandardCharsets .UTF_8 ), saltBytes , iterations );
93- byte [] key = ((KeyParameter ) gen .generateDerivedParameters (keyLen * 8 )).getKey ();
94- return bytesToHex (key );
61+ gen .init (pwd , salt , iterations );
62+ return ((KeyParameter ) gen .generateDerivedParameters (keyLen * 8 )).getKey ();
9563 }
9664}
0 commit comments