From fce70d1b948c4e01f5da1b044699de94bf35abd7 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 24 Feb 2022 11:43:42 +0100 Subject: [PATCH] Throwing exceptions instead of catching them (#1) --- .../7.2/executionHistory/executionHistory.bin | Bin 84789 -> 84789 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.2/fileHashes/fileHashes.bin | Bin 25697 -> 25997 bytes .gradle/7.2/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.2/fileHashes/resourceHashesCache.bin | Bin 19245 -> 19585 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/buildOutputCleanup/outputFiles.bin | Bin 19811 -> 19919 bytes .gradle/checksums/checksums.lock | Bin 17 -> 17 bytes .gradle/checksums/md5-checksums.bin | Bin 19697 -> 19847 bytes .gradle/checksums/sha1-checksums.bin | Bin 20549 -> 20711 bytes .gradle/checksums/sha256-checksums.bin | Bin 19487 -> 19685 bytes .gradle/checksums/sha512-checksums.bin | Bin 19967 -> 20261 bytes build.gradle | 4 +- .../security/encryption/AESEncrypter.java | 15 +-- .../security/encryption/KeyLoader.java | 13 ++- .../security/encryption/RSAEncrypter.java | 104 ++++++++++-------- .../netcode/security/identity/Identity.java | 14 ++- .../netcode/security/identity/Signature.java | 8 +- 18 files changed, 94 insertions(+), 64 deletions(-) diff --git a/.gradle/7.2/executionHistory/executionHistory.bin b/.gradle/7.2/executionHistory/executionHistory.bin index 2ec55863347d913a45fed58e55b76394bd9ccda2..2a2489616ec214b6102c04f65e4896e4603a876c 100644 GIT binary patch delta 5008 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 GQ~wLcr5Tq1 diff --git a/.gradle/7.2/executionHistory/executionHistory.lock b/.gradle/7.2/executionHistory/executionHistory.lock index b31282f6382641767a210c9fea204164ec469cf5..024520e56309c9d44671e994dadf72dc58c32264 100644 GIT binary patch literal 17 UcmZQpeq!)r)0>WO3=r@c06=X9LI3~& literal 17 UcmZQpeq!)r)0>WO3=nV?0613?{ED3#GH0w?FI@l zU$BvKSyr{-@lBhLwv04_*fj?Ry@o`;P86s#lkRi(a zpjW3S)T&!AR1!G2#1VBvhTMgNADq8=S{ycKPt!991R{^-#WF#Z3I}w!Ugj`g6TV+=1*5qheX6*c#p>92UN&D9P~kMcXkgulTs z3_{ac3>yhT?j?;!GF=v(4_ed)e6Rzp^q0$Oo8mZFA8f`SI)l8&gFG!Uh0s%8k6*ijViIiH@J8nge zO&c}M;%mF??Q;|+r1yUbVg-R#AqN2+VRo!7QL{S zSep3N-6q*<)i$u~GZOL_U4=I&S{l1bM9|WtiCqchCV!3OI;$?58`!RMcpE0JLnRMh z&IZy*s>Xgz?i260iKizUS>*6F7-@z|Xy#e4ktmB5cy!`etKyT7^Q@7B3JQjpXcGg3 zO{UUBE4#Rgyt?|cqdb%DXg#NM3?p;E&YMax+Uu03&Zk#D=;XR9&1oJ0*2`>Yk6IlB*_ z!-q<7nLJS$NM7Y=e&BWCx`)?&u`CY!3xm#I9`8N!{`>dwhT1WDTLi#;*QqheVP$t|#@@5q z^S~*w2`a_2{0L}%;xZYwU>o*QKrZ(73GVtWlNBdP1jB(y$OY;wRe8mT{wQ zIlXhq?z!84yj_`nBh?wdP8je=i%hW`HWFJ*$d1++*xWy@We7g$bFV+dYorOXL#Pz1 z&c=7OG2y3XloZL0HiyP>&>u91pw-9&)7Yy5dRx)hd9cbKd3+Fry(=IKdnKR|dzZiz z_G-Y207O&(U+i53b=%NbIkwO$FijS31}miu62CjlH8_0DGB$ z6o#VNzyW(%;94LR+sJ3ZtaIhguZ}67 zg_9;sJRJi8#6{A?6?RCVTVj3Zc(qpP`GUy;OxQ!EU`P184Ez5d@K+1#neASNNsiT* zM#rc;Z6uEnl>#j#2R0Hrq+~1Cy6anGi(8$ZY(r$w0Yq@%Hw2nO?gn5Mq3&9dA7Tkzp?}>$Gjr7EbyE|1SUg03%ZwezrwtGqOp%(fu;d%yq|J x?J~{?HBx&2)EEV$Dn&s91J1&9nz{dA;omRX4Kn!fuZM_?T90zc!X+b^{s-MK(P;nx delta 2082 zcmZXVdpuNW7{_OnC8hEia!fSFeG-LiN|bAEVZ^A-kff&EvgEGOwk%3650kYvyV#U2 z(sXsHY>8AWMYSOr-DX?t*6vDet9Q|9j!c8U=N}cH)19D;+ZU8ihh2t6Vm%`^9eBo*O6tXp?6=yDOLEo3P9D*8eU0K! zw)=swN1tb@u8z60*@Z@Em+5?k@Ka5m2#jnN0Fhyu*D-s41?b&=SV#Vp(O}ws( zxRaQeM9yVs=wv7&dXH2qF2oUS@p&V&b4K^)V`K_BQK-4XsE@0@TK3G$?$1~yb)F^P z2x~IlQzjz~%B0&1+_g!Bo>hU#>q%R>?aPp{YptROl*!B=hSo9(mdQ5Dgx;~!%R@>} zu5>iQ2WA!k8oo@SLDP8CtV3PpmH8ZX&%&K+DAE)++vXwKM(${;HVB5V=((RTZA}Zw zZ%=B$1a7@~mLg#ncmG`XS)r6(T6+9Yv9uZ!Qsfk(;bx?WSlT;0&HSKKXq6`lx!mt9 zz{n_aqOi_GlU!MTjvlFltH$eJ51#i4m6qgS0^d9Kv5G{`o4k9PDbq^1&nGyM&3V&< zDa4Eb2R|lZx@+MGyTaz-w%Yun!m{@bIH?P9eoWz&v2@Pjln1n2`tROtTT&O|Nyd$G7KSq)KzH4xGS* zCJE4N(UT%i*xiua*Q~$T*t?Wx(WfTL{ud*Q;5&Z{*)wOR1-Jc~L~?(P%5u$${dsqu zd9mC+aIq~CrchEzP1WSDp{*x3dp^zYXtjKflipy(WfJ+%=APfc@wdp$Y_XY<#Hq*0 z2#DZ@ksEkI2iIbmY%BBvsM}W(H5wkGa|>U^8q5QzGTniXl>iE{ z+AeMjm_Lo&L;%Aes4IJf3^uOr;er4x)0zX)zF(h%%A6DcZ{X!+G zs5yKnUdPa`s=M`%-Qg2~KeB%DN%3vM9%bkYK1ICxZ^?L;@jMSNdtG-si6D(Ck~0e7 zo0$Z2jn>sgti7unVw~^h@V~;n;e0JiilytTAFUm#w6DXz5#7kL zP(6$$xqdr`n|AjVWTZtME_68BF@PRg*~`<+0`_fW5>x&OWer14#THgqR%z9F<>F)z zv~Hw+|4takDg)Rd)LIG{ucK5N1Y@-u@~}#U=1d2UhB__~YSQc~@G|4s4SX`VM?K1bA XdhcMYr=tk{5s?LWAg6do_=M6&gk+ag diff --git a/.gradle/7.2/fileHashes/fileHashes.lock b/.gradle/7.2/fileHashes/fileHashes.lock index 268ac3fb7a72d978b3dbb531547cab4f84d20e49..f858649f38895ac7e4e2f733fe4807ef9df412f1 100644 GIT binary patch literal 17 VcmZR6a$avj&W+1U8Nh(03;;n|1*-r6 literal 17 VcmZR6a$avj&W+1U8Nh(q5&%IP1#JKT diff --git a/.gradle/7.2/fileHashes/resourceHashesCache.bin b/.gradle/7.2/fileHashes/resourceHashesCache.bin index c98df58c221df4fc2d985c05524fd21ba3f88d7b..89e9bdc4bfe08d9d1cfad753ff61ca942736bd59 100644 GIT binary patch delta 606 zcmZ2Gjj?ei;|3E6Muo|y5)}eVp6-`^*Yo!|0~mN0PF^aZpt0tzYWKyHd%i*i{r^M3 z#?9|rbxxOCL&dL8-YcOXaIj;oQOYB&V^G1Zldno-2)ufu)%w%pQv^iN$9A%*d9tdMf=%w4jX_as zmsdaqf5J?t(Nzyp|Nm?y)Z}=WIE-dsU>4k{_(Oc70f*>jM~^p5^~OM@l0Ym7!U9#D zE)(o5UYh^*$<{XY`LF{hD2J-z&2ND-Gv!ZKEdP`+ECQ-$or8yU*Zvv_1GuGYVHYDwn8R5JJSvg_KL6SK91tF7;_)PMpN%^{~FB)OYR zO;69P^XR!T^++?Oih~t;*HqjBPgxjNdO9xu`VUh@kyh9SjcGr>`sT%5ym?UHNgq?m qyswFV8+XfdeNd8J#oe%`22;hPj%kW3efkyJz6WnO|0io9NCg1bc*br3 delta 65 zcmZpi$+&hJ;|3E6MzP7J5*3q=N=QuRm6VulE158PtK@;nOQj4Zzm<~U`40sQ3`~j} R6@Q3tH25L9+0o+-697wy8{z-} diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 01310941971ac34ddfb75c5527016af3cb227200..7fee6bc2f27c0820db822b71f462a6f3125bba1c 100644 GIT binary patch literal 17 VcmZS1j5&NM;p*{E3}C>h2>?H)1$F=c literal 17 VcmZS1j5&NM;p*{E3}C>>002LI1x)|| diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index 6066105b6a6f1adfd8e4b61159d37bf63e6b3cb0..52bfb1c84955f942cead0ff4e44b76f586d8ddd0 100644 GIT binary patch delta 167 zcmaDni}Czy#tkMCjQ*QVB{Y}>cAndA{n^H@fdLGB+b4%gSqL0sx;OK{tNzPS!I_g= zrG5xJ+GQsC^RZY6R4{pSsdNI9fRDO(H`fiFIH>6A$!BF11VVO}S1eViSA+_dPJSx8 uL7-TlVcN6YoQqJwy_0+8x|rB2H!A)R-)OKvV6&r#66@sqp7N6oynO-GJTHq)$ literal 17 UcmZQRT6y1EWyh~O3=nVv06x40)&Kwi diff --git a/.gradle/checksums/md5-checksums.bin b/.gradle/checksums/md5-checksums.bin index 035502834ebe06c468bd5666b2dbe9c07313ec6e..2378b0acacb9b69a88605b20e79dd0dfd28e0289 100644 GIT binary patch delta 236 zcmex3ld*j^;|3E6M(NF_5*&;IJI`&m{%m8{zyJomp_5G|Ed(CzG86szSS$o0=<{)M zs^kxWke%ffOBL!Bp(>Rphe~NP&fKW@Lwut_gXm^Qj}0u7|9bJ&Pl%|!t24t*e%+G| z`4cjpJY-;Ctk(`sJ_ONM(F>&YjDdtE5Q7X;6wt9x){nct{BDEAkEfXrzly$=E_J#ddgh~y;d`ySFE?I> u=t_wJ>tgFS!PI5?>_MNk@|J6%F{S5k*n5`F=|6S20;;VNVp*gJNE-lTvrCEq delta 43 zcmV+`0M!5Ip#jC90kAX}0Vb0*7{HSa8IZHJ8Q=kvts83rp|K(O7qKvS6th7{1PFR- B5L^HN diff --git a/.gradle/checksums/sha256-checksums.bin b/.gradle/checksums/sha256-checksums.bin index e9b11ea3f8a137c04ee38839a7d6eda1a92770ae..3e2bdd61bca2d5a964338c54c0dc13a07391a2ed 100644 GIT binary patch delta 307 zcmbO~gYoH1#tkMCj6#!5B`O4Vp4)Ey*~YGc0StT=PhKivA@FFIndr~QVj)mL`N>x$ zPN;uV>bu>+aVs zLB`PK#l`xphD|vwDKNK)9Fjj6<{2{*4V1d|XM~{2V02+=K ANB{r; diff --git a/.gradle/checksums/sha512-checksums.bin b/.gradle/checksums/sha512-checksums.bin index 76c5421a98dde7b3950d432b0c5ecd9259e68352..b57b66d1226e6a6dda0a3b24c9ba6013f233bcec 100644 GIT binary patch delta 404 zcmexAn{nwp#tkMCj6#!5B`O4Vp4)Ey*~YGc0Sx>OPhKivA@FFIndr~QVj&Pg-~W@Z zN}Ny$*;!t(RH0rGsxt9E8em{xJh)NuhxkT=2(itM9{X79je$xdfjAI^9d=CR&H21Y zO3(L<=Efw!%%dw^;!m$y_ib;0oyCzPRz}6&BHon?4&|)x@X8cjwl$d1LrlTv{bZ%$ z>cw}@YdzL|0yMu~J2?3e#Qut2ARUKl1B->FFEf*hPs|E+fjwGP^#?CZNc?tD^1*GR zde$RJ>c4Dk?LLTgi`jD4mPrY{Ypm^_bh}VN@o(J!Qv13{Kkk|ch!rU@U@O@AO)#wp z@_o5D!-*?i;M$W7OK;?7OqJghuxYZWUD|__GgNE6Z*^?Q(WzMOdd`?zhF3#S>q4nr ef7jU-iLB`PK#l`xphD|vwDKNK)9Fjj6<{2{*4V1d|XM~{8103gQ} AQUCw| diff --git a/build.gradle b/build.gradle index 0528289..49359cc 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group = 'dev.netcode' -version = '0.0.3' +version = '0.0.4' java { toolchain { @@ -21,7 +21,7 @@ publishing { from components.java groupId = 'dev.netcode' artifactId = 'security' - version = '0.0.3' + version = '0.0.4' pom { name = 'netcodes Java security Utilities' description = 'Security utilities including encryption' diff --git a/src/main/java/dev/netcode/security/encryption/AESEncrypter.java b/src/main/java/dev/netcode/security/encryption/AESEncrypter.java index 9873c38..546cd98 100644 --- a/src/main/java/dev/netcode/security/encryption/AESEncrypter.java +++ b/src/main/java/dev/netcode/security/encryption/AESEncrypter.java @@ -1,6 +1,6 @@ package dev.netcode.security.encryption; -import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; @@ -26,15 +26,16 @@ public class AESEncrypter { public static SecretKeySpec getKey(String password) { MessageDigest sha = null; SecretKeySpec privateKey = null; + byte[] key = password.getBytes(StandardCharsets.UTF_8); try { - byte[] key = password.getBytes("UTF-8"); sha = MessageDigest.getInstance("SHA-256"); - key = sha.digest(key); - key = Arrays.copyOf(key, 16); - privateKey = new SecretKeySpec(key, "AES"); - } catch(NoSuchAlgorithmException | UnsupportedEncodingException e) { + } catch (NoSuchAlgorithmException e) { + // SHA-256 exists so this should never be thrown e.printStackTrace(); - } + } + key = sha.digest(key); + key = Arrays.copyOf(key, 16); + privateKey = new SecretKeySpec(key, "AES"); return privateKey; } diff --git a/src/main/java/dev/netcode/security/encryption/KeyLoader.java b/src/main/java/dev/netcode/security/encryption/KeyLoader.java index 22b24db..1958dcf 100644 --- a/src/main/java/dev/netcode/security/encryption/KeyLoader.java +++ b/src/main/java/dev/netcode/security/encryption/KeyLoader.java @@ -5,6 +5,7 @@ import java.nio.file.Path; import java.security.PrivateKey; import java.security.PublicKey; +import java.security.spec.InvalidKeySpecException; import java.util.Base64; import dev.netcode.util.Result; @@ -19,8 +20,9 @@ public class KeyLoader { * @param file Path of the file containing the Base64 encoded public key * @return the public key * @throws IOException if the file can not be read + * @throws InvalidKeySpecException in case the loaded key is malformed or currupted */ - public static PublicKey loadPublicKeyFromFile(Path file) throws IOException { + public static PublicKey loadPublicKeyFromFile(Path file) throws IOException, InvalidKeySpecException { String publicContent = new String(Files.readAllBytes(file)); publicContent = publicContent.replace("\n", "").replace("\r", ""); publicContent = publicContent.substring(26,publicContent.length()-24); @@ -33,8 +35,9 @@ public static PublicKey loadPublicKeyFromFile(Path file) throws IOException { * @param file Path of the file containing the Base64 encoded private key * @return the private key * @throws IOException if the file can not be read + * @throws InvalidKeySpecException in case the loaded key is malformed or currupted */ - public static PrivateKey loadPrivateKeyFromFile(Path file) throws IOException { + public static PrivateKey loadPrivateKeyFromFile(Path file) throws IOException, InvalidKeySpecException { String privateContent = new String(Files.readAllBytes(file)); privateContent = privateContent.replace("\n", "").replace("\r", ""); privateContent = privateContent.substring(27,privateContent.length()-25); @@ -48,8 +51,9 @@ public static PrivateKey loadPrivateKeyFromFile(Path file) throws IOException { * @param password used to decrypt the file * @return the public key * @throws IOException if the file can not be read + * @throws InvalidKeySpecException in case the loaded key is malformed or currupted */ - public static Result loadPublicKeyFromEncryptedFile(Path file, String password) throws IOException { + public static Result loadPublicKeyFromEncryptedFile(Path file, String password) throws IOException, InvalidKeySpecException { String publicContent = new String(Files.readAllBytes(file)); var result = AESEncrypter.decrypt(publicContent, password); if(!result.wasSuccessful()) { @@ -66,8 +70,9 @@ public static Result loadPublicKeyFromEncryptedFile(Path file, String * @param password used to decrypt the file * @return the private key * @throws IOException if the file can not be read + * @throws InvalidKeySpecException in case the loaded key is malformed or currupted */ - public static Result loadPrivateKeyFromEncryptedFile(Path file, String password) throws IOException { + public static Result loadPrivateKeyFromEncryptedFile(Path file, String password) throws IOException, InvalidKeySpecException { String privateContent = new String(Files.readAllBytes(file)); var result = AESEncrypter.decrypt(privateContent, password); if(!result.wasSuccessful()) { diff --git a/src/main/java/dev/netcode/security/encryption/RSAEncrypter.java b/src/main/java/dev/netcode/security/encryption/RSAEncrypter.java index 5d46f37..194e21e 100644 --- a/src/main/java/dev/netcode/security/encryption/RSAEncrypter.java +++ b/src/main/java/dev/netcode/security/encryption/RSAEncrypter.java @@ -2,6 +2,7 @@ import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; @@ -12,6 +13,8 @@ import java.security.PublicKey; import java.security.SecureRandom; import java.security.Signature; +import java.security.SignatureException; +import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; @@ -19,6 +22,7 @@ import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; /** * This class simplifies the process of RSA Encrypting data. @@ -49,18 +53,21 @@ public static KeyPair generateKeyPair(int size) { * @param cipher data to be decrypted * @param privateKey to be used to decrypt the data * @return decrypted data as UTF-8 encoded String + * @throws InvalidKeyException in case the key format is not supported + * @throws BadPaddingException in case something failed while padding + * @throws IllegalBlockSizeException in case the blocksize is invalid */ - public static String decrypt(byte[] cipher, PrivateKey privateKey) { + public static String decrypt(byte[] cipher, PrivateKey privateKey) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException { byte[] dec = {}; - Cipher c; + Cipher c = null; try { c = Cipher.getInstance("RSA"); - c.init(Cipher.DECRYPT_MODE, privateKey); - dec = c.doFinal(cipher); - } catch(Exception e) { - System.out.println("Error while decrypting: " + e.getMessage()); + } catch (NoSuchAlgorithmException |NoSuchPaddingException e) { + // RSA exists so this should never be thrown e.printStackTrace(); } + c.init(Cipher.DECRYPT_MODE, privateKey); + dec = c.doFinal(cipher); return new String(dec, StandardCharsets.UTF_8); } @@ -69,21 +76,21 @@ public static String decrypt(byte[] cipher, PrivateKey privateKey) { * @param message to be encrypted * @param publicKey ised to encrypt the data * @return byte array of encrypted data + * @throws InvalidKeyException in case the key format is not supported + * @throws BadPaddingException in case something failed while padding + * @throws IllegalBlockSizeException in case the blocksize is invalid */ - public static byte[] encrypt(String message, PublicKey publicKey) { + public static byte[] encrypt(String message, PublicKey publicKey) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = null; byte[] encrypted = null; try { cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.ENCRYPT_MODE, publicKey); - } catch (Exception e) { - System.out.println("Error while encrypting: " + e.getMessage()); - } - try { - encrypted = cipher.doFinal(message.getBytes("UTF8")); - } catch (IllegalBlockSizeException | BadPaddingException | UnsupportedEncodingException e) { - System.out.println("Error while encrypting: " + e.getMessage()); + } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { + // RSA exists so this should never be thrown + e.printStackTrace(); } + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + encrypted = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8)); return encrypted; } @@ -93,19 +100,22 @@ public static byte[] encrypt(String message, PublicKey publicKey) { * @param privateKey used to sign the data * @param input data to be signed * @return Signature as String + * @throws InvalidKeyException in case the key format is not supported + * @throws SignatureException in case something went wrong while creating the signature */ - public static String sign(PrivateKey privateKey, String input) { + public static String sign(PrivateKey privateKey, String input) throws InvalidKeyException, SignatureException { + Signature privateSignature = null; try { - Signature privateSignature = Signature.getInstance("SHA256withRSA"); - privateSignature.initSign(privateKey); - privateSignature.update(input.getBytes(StandardCharsets.UTF_8)); - - byte[] signature = privateSignature.sign(); - return Base64.getEncoder().encodeToString(signature); - } catch(Exception e) { - System.err.println("Signing failed: "+e.getMessage()); - return null; + privateSignature = Signature.getInstance("SHA256withRSA"); + } catch (NoSuchAlgorithmException e) { + // SHA256withRSA exists so this should never be thrown + e.printStackTrace(); } + privateSignature.initSign(privateKey); + privateSignature.update(input.getBytes(StandardCharsets.UTF_8)); + + byte[] signature = privateSignature.sign(); + return Base64.getEncoder().encodeToString(signature); } /** @@ -134,34 +144,38 @@ public static boolean verifySignature(PublicKey publicKey, String data, String s * Generates a public key from byte array * @param key byte array * @return public key + * @throws InvalidKeySpecException in case the key format is not supported */ - public static PublicKey generatePublicKeyFromString(byte[] key){ - try{ - X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(key); - KeyFactory kf = KeyFactory.getInstance("RSA"); - - return kf.generatePublic(X509publicKey); - } catch(Exception e){ - e.printStackTrace(); - return null; - } + public static PublicKey generatePublicKeyFromString(byte[] key) throws InvalidKeySpecException{ + X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(key); + KeyFactory kf; + try { + kf = KeyFactory.getInstance("RSA"); + } catch (NoSuchAlgorithmException e) { + //should never be thrown + e.printStackTrace(); + return null; + } + return kf.generatePublic(X509publicKey); } /** * Generates a private key from byte array * @param key byte array * @return private key + * @throws InvalidKeySpecException in case the key format is not supported */ - public static PrivateKey generatePrivateKeyFromString(byte[] key){ - try{ - PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key); - KeyFactory kf = KeyFactory.getInstance("RSA"); - - return kf.generatePrivate(pkcs8EncodedKeySpec); - } catch(Exception e){ - e.printStackTrace(); - return null; - } + public static PrivateKey generatePrivateKeyFromString(byte[] key) throws InvalidKeySpecException{ + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key); + KeyFactory kf; + try { + kf = KeyFactory.getInstance("RSA"); + } catch (NoSuchAlgorithmException e) { + // should never be thrown + e.printStackTrace(); + return null; + } + return kf.generatePrivate(pkcs8EncodedKeySpec); } /** diff --git a/src/main/java/dev/netcode/security/identity/Identity.java b/src/main/java/dev/netcode/security/identity/Identity.java index 8d90a2b..af8b976 100644 --- a/src/main/java/dev/netcode/security/identity/Identity.java +++ b/src/main/java/dev/netcode/security/identity/Identity.java @@ -96,15 +96,19 @@ public boolean save(Path path) { /** * Unlocks a loaded identity which makes it possible to use it * @param password to unlock the identity with - * @return true if the unlocking process was successful + * @return true if the unlocking process was successful, false otherwise */ public boolean unlock(String password) { var result = AESEncrypter.decrypt(this.privateKey, password); if(result.wasSuccessful()) { - this.keyPair = new KeyPair( - RSAEncrypter.generatePublicKeyFromString(Base64.getDecoder().decode(this.publicKey)), - RSAEncrypter.generatePrivateKeyFromString(Base64.getDecoder().decode(result.get())) - ); + try { + this.keyPair = new KeyPair( + RSAEncrypter.generatePublicKeyFromString(Base64.getDecoder().decode(this.publicKey)), + RSAEncrypter.generatePrivateKeyFromString(Base64.getDecoder().decode(result.get())) + ); + } catch(Exception e) { + return false; + } return true; } return false; diff --git a/src/main/java/dev/netcode/security/identity/Signature.java b/src/main/java/dev/netcode/security/identity/Signature.java index 048877d..f491f8f 100644 --- a/src/main/java/dev/netcode/security/identity/Signature.java +++ b/src/main/java/dev/netcode/security/identity/Signature.java @@ -1,7 +1,10 @@ package dev.netcode.security.identity; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; +import java.security.SignatureException; import java.text.SimpleDateFormat; import java.util.Date; @@ -54,8 +57,11 @@ public boolean isValid(PublicKey publicKey, Identity identity) { /** * Signs this Signature which makes it valid. * @param privateKey used to sign the signature + * @throws SignatureException + * @throws NoSuchAlgorithmException + * @throws InvalidKeyException */ - public void sign(PrivateKey privateKey) { + public void sign(PrivateKey privateKey) throws InvalidKeyException, NoSuchAlgorithmException, SignatureException { signature = RSAEncrypter.sign(privateKey, getVerifiableDataString()); }