forked from java-native-access/jna
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add zero rtt support for client (java-native-access#362)
Motivation: Support 0-RTT feature on client side Modifications: - Export QUIC session using boringSSL api SSL_CTX_sess_set_new_cb and class BoringSSLSessionCallback - Restore QUIC session using quiche api quiche_conn_set_session - Add EarlyDataSendCallback to send 0-RTT data after send Initial packet - Add QuicClientSessionCache to store session on client side - Add 0-RTT example Result: Now it's possible to send 0-RTT packet on client side Co-authored-by: Norman Maurer <[email protected]>
- Loading branch information
1 parent
7f597c2
commit 07d872f
Showing
17 changed files
with
847 additions
and
32 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
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
83 changes: 83 additions & 0 deletions
83
codec-classes-quic/src/main/java/io/netty/incubator/codec/quic/BoringSSLSessionCallback.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,83 @@ | ||
/* | ||
* 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: | ||
* | ||
* https://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.incubator.codec.quic; | ||
|
||
import io.netty.util.internal.EmptyArrays; | ||
import io.netty.util.internal.logging.InternalLogger; | ||
import io.netty.util.internal.logging.InternalLoggerFactory; | ||
|
||
import java.io.ByteArrayOutputStream; | ||
import java.io.DataOutputStream; | ||
import java.io.IOException; | ||
import java.util.Arrays; | ||
import java.util.concurrent.TimeUnit; | ||
|
||
final class BoringSSLSessionCallback { | ||
private static final InternalLogger logger = InternalLoggerFactory.getInstance(BoringSSLSessionCallback.class); | ||
private final QuicClientSessionCache sessionCache; | ||
private final QuicheQuicSslEngineMap engineMap; | ||
|
||
BoringSSLSessionCallback(QuicheQuicSslEngineMap engineMap, QuicClientSessionCache sessionCache) { | ||
this.engineMap = engineMap; | ||
this.sessionCache = sessionCache; | ||
} | ||
|
||
@SuppressWarnings("unused") | ||
void newSession(long ssl, long creationTime, long timeout, byte[] session, boolean isSingleUse, byte[] peerParams) { | ||
if (sessionCache == null) { | ||
return; | ||
} | ||
|
||
QuicheQuicSslEngine engine = engineMap.get(ssl); | ||
if (engine == null) { | ||
logger.warn("engine is null ssl: {}", ssl); | ||
return; | ||
} | ||
|
||
if (peerParams == null) { | ||
peerParams = EmptyArrays.EMPTY_BYTES; | ||
} | ||
if (logger.isDebugEnabled()) { | ||
logger.debug("ssl: {}, session: {}, peerParams: {}", ssl, Arrays.toString(session), | ||
Arrays.toString(peerParams)); | ||
} | ||
byte[] quicSession = toQuicheQuicSession(session, peerParams); | ||
if (quicSession != null) { | ||
logger.debug("save session host={}, port={}", | ||
engine.getSession().getPeerHost(), engine.getSession().getPeerPort()); | ||
sessionCache.saveSession(engine.getSession().getPeerHost(), engine.getSession().getPeerPort(), | ||
TimeUnit.SECONDS.toMillis(creationTime), TimeUnit.SECONDS.toMillis(timeout), | ||
quicSession, isSingleUse); | ||
} | ||
} | ||
|
||
// Mimic the encoding of quiche: https://github.com/cloudflare/quiche/blob/0.10.0/src/lib.rs#L1668 | ||
private static byte[] toQuicheQuicSession(byte[] sslSession, byte[] peerParams) { | ||
if (sslSession != null && peerParams != null) { | ||
try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); | ||
DataOutputStream dos = new DataOutputStream(bos)) { | ||
dos.writeLong(sslSession.length); | ||
dos.write(sslSession); | ||
dos.writeLong(peerParams.length); | ||
dos.write(peerParams); | ||
return bos.toByteArray(); | ||
} catch (IOException e) { | ||
return null; | ||
} | ||
} | ||
return null; | ||
} | ||
} |
30 changes: 30 additions & 0 deletions
30
codec-classes-quic/src/main/java/io/netty/incubator/codec/quic/EarlyDataSendCallback.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,30 @@ | ||
/* | ||
* 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: | ||
* | ||
* https://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.incubator.codec.quic; | ||
|
||
/** | ||
* Implementations of this interface can be used to send early data for a {@link QuicChannel}. | ||
*/ | ||
@FunctionalInterface | ||
public interface EarlyDataSendCallback { | ||
/** | ||
* Allow to send early-data if possible. Please be aware that early data may be replayable and so may have other | ||
* security concerns then other data. | ||
* | ||
* @param quicChannel the {@link QuicChannel} which will be used to send data on (if any). | ||
*/ | ||
void send(QuicChannel quicChannel); | ||
} |
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.