-
-
Notifications
You must be signed in to change notification settings - Fork 179
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Introduce the ability to run key-signing in an fully async fashion. (#…
…650) * Introduce the ability to run key-signing in an fully async fashion. Motivation: Sometimes we may want to run tasks in a fully async fashion. For example if we need to do a network operation to full fill the task. This commit only makes use of the real async support for key-signing but we could also do the same for other tasks. Modifications: - Add AsyncTask that allows to run a task in an async fashion and notify the callback once done. - Add AsyncSSLPrivateKeyMethod that makes use of the AsyncTask and so allow for a fully async implementation for key signing. Result: More flexible Co-authored-by: Trustin Lee <[email protected]>
- Loading branch information
1 parent
a1b0c7b
commit 349eb1c
Showing
13 changed files
with
314 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
54 changes: 54 additions & 0 deletions
54
openssl-dynamic/src/main/java/io/netty/internal/tcnative/AsyncSSLPrivateKeyMethod.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
/* | ||
* Copyright 2021 The Netty Project | ||
* | ||
* The Netty Project licenses this file to you under the Apache License, | ||
* version 2.0 (the "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at: | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
* License for the specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
package io.netty.internal.tcnative; | ||
|
||
/** | ||
* Allows to customize private key signing / decrypt (when using RSA). | ||
*/ | ||
public interface AsyncSSLPrivateKeyMethod { | ||
int SSL_SIGN_RSA_PKCS1_SHA1 = NativeStaticallyReferencedJniMethods.sslSignRsaPkcsSha1(); | ||
int SSL_SIGN_RSA_PKCS1_SHA256 = NativeStaticallyReferencedJniMethods.sslSignRsaPkcsSha256(); | ||
int SSL_SIGN_RSA_PKCS1_SHA384 = NativeStaticallyReferencedJniMethods.sslSignRsaPkcsSha384(); | ||
int SSL_SIGN_RSA_PKCS1_SHA512 = NativeStaticallyReferencedJniMethods.sslSignRsaPkcsSha512(); | ||
int SSL_SIGN_ECDSA_SHA1 = NativeStaticallyReferencedJniMethods.sslSignEcdsaPkcsSha1(); | ||
int SSL_SIGN_ECDSA_SECP256R1_SHA256 = NativeStaticallyReferencedJniMethods.sslSignEcdsaSecp256r1Sha256(); | ||
int SSL_SIGN_ECDSA_SECP384R1_SHA384 = NativeStaticallyReferencedJniMethods.sslSignEcdsaSecp384r1Sha384(); | ||
int SSL_SIGN_ECDSA_SECP521R1_SHA512 = NativeStaticallyReferencedJniMethods.sslSignEcdsaSecp521r1Sha512(); | ||
int SSL_SIGN_RSA_PSS_RSAE_SHA256 = NativeStaticallyReferencedJniMethods.sslSignRsaPssRsaeSha256(); | ||
int SSL_SIGN_RSA_PSS_RSAE_SHA384 = NativeStaticallyReferencedJniMethods.sslSignRsaPssRsaeSha384(); | ||
int SSL_SIGN_RSA_PSS_RSAE_SHA512 = NativeStaticallyReferencedJniMethods.sslSignRsaPssRsaeSha512(); | ||
int SSL_SIGN_ED25519 = NativeStaticallyReferencedJniMethods.sslSignEd25519(); | ||
int SSL_SIGN_RSA_PKCS1_MD5_SHA1 = NativeStaticallyReferencedJniMethods.sslSignRsaPkcs1Md5Sha1(); | ||
|
||
/** | ||
* Sign the input with given EC key and notify {@link ResultCallback} with the signed bytes. | ||
* | ||
* @param ssl the SSL instance | ||
* @param signatureAlgorithm the algorithm to use for signing | ||
* @param input the input itself | ||
* @param resultCallback the callback that will be notified once the operation completes | ||
*/ | ||
void sign(long ssl, int signatureAlgorithm, byte[] input, ResultCallback<byte[]> resultCallback); | ||
|
||
/** | ||
* Decrypts the input with the given RSA key and notify {@link ResultCallback} with the decrypted bytes. | ||
* | ||
* @param ssl the SSL instance | ||
* @param input the input which should be decrypted | ||
* @param resultCallback the callback that will be notified once the operation completes | ||
*/ | ||
void decrypt(long ssl, byte[] input, ResultCallback<byte[]> resultCallback); | ||
} |
51 changes: 51 additions & 0 deletions
51
...ssl-dynamic/src/main/java/io/netty/internal/tcnative/AsyncSSLPrivateKeyMethodAdapter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
/* | ||
* Copyright 2021 The Netty Project | ||
* | ||
* The Netty Project licenses this file to you under the Apache License, | ||
* version 2.0 (the "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at: | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
* License for the specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
package io.netty.internal.tcnative; | ||
|
||
final class AsyncSSLPrivateKeyMethodAdapter implements AsyncSSLPrivateKeyMethod { | ||
private final SSLPrivateKeyMethod method; | ||
|
||
AsyncSSLPrivateKeyMethodAdapter(SSLPrivateKeyMethod method) { | ||
if (method == null) { | ||
throw new NullPointerException("method"); | ||
} | ||
this.method = method; | ||
} | ||
|
||
@Override | ||
public void sign(long ssl, int signatureAlgorithm, byte[] input, ResultCallback<byte[]> resultCallback) { | ||
final byte[] result; | ||
try { | ||
result = method.sign(ssl, signatureAlgorithm, input); | ||
} catch (Throwable cause) { | ||
resultCallback.onError(ssl, cause); | ||
return; | ||
} | ||
resultCallback.onSuccess(ssl, result); | ||
} | ||
|
||
@Override | ||
public void decrypt(long ssl, byte[] input, ResultCallback<byte[]> resultCallback) { | ||
final byte[] result; | ||
try { | ||
result = method.decrypt(ssl, input); | ||
} catch (Throwable cause) { | ||
resultCallback.onError(ssl, cause); | ||
return; | ||
} | ||
resultCallback.onSuccess(ssl, result); | ||
} | ||
} |
27 changes: 27 additions & 0 deletions
27
openssl-dynamic/src/main/java/io/netty/internal/tcnative/AsyncTask.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
/* | ||
* Copyright 2021 The Netty Project | ||
* | ||
* The Netty Project licenses this file to you under the Apache License, | ||
* version 2.0 (the "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at: | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
* License for the specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
package io.netty.internal.tcnative; | ||
|
||
public interface AsyncTask extends Runnable { | ||
|
||
/** | ||
* Run this {@link AsyncTask} in an async fashion. Which means it will be run and completed at some point. | ||
* Once it is done the {@link Runnable} is called | ||
* | ||
* @param completeCallback The {@link Runnable} that is run once the task was run and completed. | ||
*/ | ||
void runAsync(Runnable completeCallback); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
39 changes: 39 additions & 0 deletions
39
openssl-dynamic/src/main/java/io/netty/internal/tcnative/ResultCallback.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
/* | ||
* Copyright 2021 The Netty Project | ||
* | ||
* The Netty Project licenses this file to you under the Apache License, | ||
* version 2.0 (the "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at: | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
* License for the specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
package io.netty.internal.tcnative; | ||
|
||
/** | ||
* Callback that is called once an operation completed. | ||
* | ||
* @param <T> The result type. | ||
*/ | ||
public interface ResultCallback<T> { | ||
/** | ||
* Called when the operation completes with the given result. | ||
* | ||
* @param ssl the SSL instance (SSL *) | ||
* @param result the result. | ||
*/ | ||
void onSuccess(long ssl, T result); | ||
|
||
/** | ||
* Called when the operation completes with an error. | ||
* | ||
* @param ssl the SSL instance (SSL *) | ||
* @param cause the error. | ||
*/ | ||
void onError(long ssl, Throwable cause); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.