blob: 6e06bc6426e1d042626f0ab5431a67c6b87b4d1a [file] [log] [blame]
/*
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
package org.webrtc;
/**
* CryptoOptions defines advanced cryptographic settings for native WebRTC.
* These settings must be passed into RTCConfiguration. WebRTC is secur by
* default and you should not need to set any of these options unless you are
* specifically looking for an additional crypto feature such as AES_GCM
* support. This class is the Java binding of native api/crypto/cryptooptions.h
*/
public final class CryptoOptions {
/**
* SRTP Related Peer Connection Options.
*/
public final class Srtp {
/**
* Enable GCM crypto suites from RFC 7714 for SRTP. GCM will only be used
* if both sides enable it
*/
private final boolean enableGcmCryptoSuites;
/**
* If set to true, the (potentially insecure) crypto cipher
* kSrtpAes128CmSha1_32 will be included in the list of supported ciphers
* during negotiation. It will only be used if both peers support it and no
* other ciphers get preferred.
*/
private final boolean enableAes128Sha1_32CryptoCipher;
/**
* If set to true, encrypted RTP header extensions as defined in RFC 6904
* will be negotiated. They will only be used if both peers support them.
*/
private final boolean enableEncryptedRtpHeaderExtensions;
private Srtp(boolean enableGcmCryptoSuites, boolean enableAes128Sha1_32CryptoCipher,
boolean enableEncryptedRtpHeaderExtensions) {
this.enableGcmCryptoSuites = enableGcmCryptoSuites;
this.enableAes128Sha1_32CryptoCipher = enableAes128Sha1_32CryptoCipher;
this.enableEncryptedRtpHeaderExtensions = enableEncryptedRtpHeaderExtensions;
}
@CalledByNative("Srtp")
public boolean getEnableGcmCryptoSuites() {
return enableGcmCryptoSuites;
}
@CalledByNative("Srtp")
public boolean getEnableAes128Sha1_32CryptoCipher() {
return enableAes128Sha1_32CryptoCipher;
}
@CalledByNative("Srtp")
public boolean getEnableEncryptedRtpHeaderExtensions() {
return enableEncryptedRtpHeaderExtensions;
}
}
/**
* Options to be used when the FrameEncryptor / FrameDecryptor APIs are used.
*/
public final class SFrame {
/**
* If set all RtpSenders must have an FrameEncryptor attached to them before
* they are allowed to send packets. All RtpReceivers must have a
* FrameDecryptor attached to them before they are able to receive packets.
*/
private final boolean requireFrameEncryption;
private SFrame(boolean requireFrameEncryption) {
this.requireFrameEncryption = requireFrameEncryption;
}
@CalledByNative("SFrame")
public boolean getRequireFrameEncryption() {
return requireFrameEncryption;
}
}
private final Srtp srtp;
private final SFrame sframe;
private CryptoOptions(boolean enableGcmCryptoSuites, boolean enableAes128Sha1_32CryptoCipher,
boolean enableEncryptedRtpHeaderExtensions, boolean requireFrameEncryption) {
this.srtp = new Srtp(
enableGcmCryptoSuites, enableAes128Sha1_32CryptoCipher, enableEncryptedRtpHeaderExtensions);
this.sframe = new SFrame(requireFrameEncryption);
}
public static Builder builder() {
return new Builder();
}
@CalledByNative
public Srtp getSrtp() {
return srtp;
}
@CalledByNative
public SFrame getSFrame() {
return sframe;
}
public static class Builder {
private boolean enableGcmCryptoSuites;
private boolean enableAes128Sha1_32CryptoCipher;
private boolean enableEncryptedRtpHeaderExtensions;
private boolean requireFrameEncryption;
private Builder() {}
public Builder setEnableGcmCryptoSuites(boolean enableGcmCryptoSuites) {
this.enableGcmCryptoSuites = enableGcmCryptoSuites;
return this;
}
public Builder setEnableAes128Sha1_32CryptoCipher(boolean enableAes128Sha1_32CryptoCipher) {
this.enableAes128Sha1_32CryptoCipher = enableAes128Sha1_32CryptoCipher;
return this;
}
public Builder setEnableEncryptedRtpHeaderExtensions(
boolean enableEncryptedRtpHeaderExtensions) {
this.enableEncryptedRtpHeaderExtensions = enableEncryptedRtpHeaderExtensions;
return this;
}
public Builder setRequireFrameEncryption(boolean requireFrameEncryption) {
this.requireFrameEncryption = requireFrameEncryption;
return this;
}
public CryptoOptions createCryptoOptions() {
return new CryptoOptions(enableGcmCryptoSuites, enableAes128Sha1_32CryptoCipher,
enableEncryptedRtpHeaderExtensions, requireFrameEncryption);
}
}
}