/* * 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); } } }