
SRTP(Secure Realtime Transport Protocol)用ライブラリ
このパッケージは、Secure Real-time Transport Protocol(SRTP)、Universal Security Transform(UST)、およびそれを支える暗号カーネルの実装を提供します。SRTP APIはinclude/srtp.hに文書化されており、ライブラリは(コンパイル後に)libsrtp2.aに格納されます。
この文書は、Cisco Systems, Inc.によるオープンソースのSecure RTPライブラリであるlibSRTPについて説明します。RTP(Real-time Transport Protocol)は、RFC 3550 で定義されている、電話、音声、ビデオなどのリアルタイムデータの転送のためのIETF標準です。Secure RTP(SRTP)は、RTPデータに機密性を提供し、RTPヘッダーとペイロードに認証を提供するRTPプロファイルです。SRTPはRFC 3711で定義されたIETF標準であり、IETF Audio/Video Transport(AVT)ワーキンググループで開発されました。このライブラリはSRTPの必須機能をすべてサポートしていますが、オプション機能のすべてをサポートしているわけではありません。詳細については、対応機能のセクションを参照してください。
この文書は、/doc/フォルダ内のドキュメントファイルを生成するためにも使用され、libSRTP APIおよび関連関数のより詳細なリファレンスを作成できます(doxygenのインストールが必要です)。リファレンス資料は、いくつかのCヘッダーファイルに埋め込まれたコメントから自動的に作成されます。ドキュメントは、わかりやすさを向上させるためにモジュールに編成されています。これらのモジュールはファイルに直接対応するものではありません。基盤となる暗号カーネルはlibSRTPの基本機能の多くを提供しますが、舞台裏で動作するため、ほとんど文書化されていません。
[email protected] ニュース、アナウンス、ディスカッションのための一般メーリングリスト。これはオープンリストです。登録については、 https://lists.packetizer.com/mailman/listinfo/libsrtp を参照してください。
[email protected] libsrtpメンテナンスチームにセキュリティ問題を開示するためのリスト。クローズドリストですが、誰でも送信できます。
libSRTPは以下のライセンスの下で配布されており、このライセンスはソースコード配布に含まれています。別のソースからライブラリを入手した場合に備えて、このマニュアルにも再掲されています。
Copyright (c) 2001-2017 Cisco Systems, Inc. All rights reserved.
ソースコード形式およびバイナリ形式での再頒布および使用は、変更の有無にかかわらず、 以下の条件が満たされる場合に許可されます。 条件は次のとおりです:
- ソースコードを再頒布する場合は、上記の著作権表示、この条件リスト、 および以下の免責事項を保持しなければなりません。
- バイナリ形式で再頒布する場合は、上記の著作権表示、この条件リスト、 および以下の免責事項を、配布物とともに提供される文書および/またはその他の資料に 含めなければなりません。
- Cisco Systems, Inc.の名称およびその貢献者の名称は、 書面による事前の許可なしに、本ソフトウェアから派生した製品を 推奨または宣伝するために使用してはなりません。
本ソフトウェアは、著作権所有者および貢献者によって 「現状のまま」提供され、明示または黙示のいかなる保証も、 商品性および特定目的への適合性に関する黙示の保証を含みますが、 これに限定されず、否認されます。いかなる場合においても、 著作権所有者または貢献者は、直接的、間接的、偶発的、 特別、懲戒的、または結果的な損害(代替商品またはサービスの調達、 使用、データ、または利益の喪失、または事業の中断を含みますが、 これに限定されません)について、契約、厳格責任、 または不法行為(過失またはその他を含む)のいずれの理論に基づいても、 たとえそのような損害の可能性について助言されていたとしても、 本ソフトウェアの使用から生じるいかなる方法によっても 責任を負いません。
libSRTPは、RTPとRTCPを保護するための関数を提供します。RTPパケットは、srtp_protect()関数を使用して暗号化および認証でき、SRTPパケットに変換されます。同様に、SRTPパケットは、srtp_unprotect()関数を使用して復号化され、認証が検証され、RTPパケットに変換されます。同様の関数がRTCPパケットにセキュリティを適用します。
typedef srtp_stream_tは、SRTPストリームに関連するすべての状態を保持する構造体を指します。これには、暗号化およびメッセージ認証関数の鍵とパラメータ、およびリプレイ防止データが含まれます。特定のsrtp_stream_tは、特定のRTPストリームとRTCPストリームを保護するために必要な情報を保持します。このデータ型は、libSRTP APIをその実装からより適切に分離するために、意図的に不透明になっています。
SRTPセッション内には、それぞれ特定の送信元から発信される複数のストリームが存在できます。各送信元は、発信するRTPストリームとRTCPストリームを保護するために、個別のストリームコンテキストを使用します。typedef srtp_tは、SRTPセッションに関連するすべての状態を保持する構造体を指します。単一のsrtp_tには複数のストリームコンテキストを関連付けることができます。ストリームコンテキストはsrtp_tから独立して存在することはできませんが、もちろん単一のストリームコンテキストのみを含むsrtp_tを作成することはできます。SRTPセッションに参加するデバイスは、各送信元から受信したデータを処理できるように、そのセッション内の各送信元のストリームコンテキストを持っている必要があります。
libSRTPでは、セッションはsrtp_create()関数を使用して作成されます。セッションで実装されるポリシーは、不透明なsrtp_policy_tハンドルとしてこの関数に渡されます。単一のポリシーハンドルは、1つのストリームポリシーを記述します。複数のストリームを構成するには、セッションを作成し、srtp_stream_add()を使用して追加のポリシーを追加します。
ポリシーハンドルは、srtp_policy_set_*関数を使用して構成されます。最低限、これにはSSRCの選択、プロファイルの選択、鍵/ソルトの材料が含まれます。プロファイルはRTP/RTCP暗号ポリシー設定を構成し、SSRCセレクタはそのポリシーが適用される方法と場所を識別します。
このセクションでは、SRTPを概説し、libSRTPで使用されるいくつかの用語を紹介します。RTPセッションは、宛先トランスポートアドレスのペア、つまりネットワークアドレスとRTPおよびRTCP用のUDPポートのペアによって定義されます。RTCPは、RTP制御プロトコルであり、RTPセッションの参加者間の調整に使用されます。例えば、受信者から送信者へのフィードバックを提供します。SRTPセッションも同様に定義されます。これは、SRTPプロファイルが使用されているRTPセッションにすぎません。SRTPセッションは、SRTPまたはSRTCPの宛先トランスポートアドレスに送信されるトラフィックで構成されます。セッション内の各参加者は、同期ソース(SSRC)識別子によって識別されます。一部の参加者はSRTPトラフィックを送信しない場合があります。受信者レポートなどのSRTCPトラフィックを送信するにもかかわらず、これらの参加者は受信者と呼ばれます。
RTPでは、同じセッション中に複数の送信元がRTPトラフィックとRTCPトラフィックを送信できます。同期ソース識別子(SSRC)は、これらの送信元を区別するために使用されます。libSRTPでは、特定の送信元からのSRTPトラフィックとSRTCPトラフィックをストリームと呼びます。各ストリームには、独自のSSRC、シーケンス番号、ロールオーバーカウンタ、およびその他のデータがあります。オプション、暗号メカニズム、鍵の特定の組み合わせは、ポリシーと呼ばれます。セッション内の各ストリームには、個別のポリシーを適用できます。
単一のポリシーを特定のセッション内のすべてのストリームに使用できますが、単一の鍵を複数のストリーム間で共有する場合は注意が必要です。鍵の共有を使用する場合、ストリームを識別するSSRC値は一意でなければなりません。この要件は、各SRTP鍵およびSRTCP鍵が単一の送信者による暗号化にのみ使用されるという規則を使用して強制できます。言い換えると、鍵は特定のデバイスから発信されるストリーム間でのみ共有されます(もちろん、他のSRTP参加者は復号化のために鍵を使用する必要があります)。libSRTPは、インバウンドデータとアウトバウンドデータの両方に鍵が使用されているケースを検出することで、この強制をサポートします。
このライブラリは、SRTPの必須実装機能をすべてサポートしています(RFC 3711で定義)。これらの機能の一部は、srtp_policy_tハンドルを使用して適切なポリシーを設定することにより、実行時に選択(または選択解除)できます。プロトコルのその他の一部の動作は、例外的なイベント用の適切なイベントハンドラを定義することで適応できます。生成されたドキュメントのSRTPeventsセクションを参照してください。
SRTP仕様に記述されている一部のオプションはサポートされていません。これには以下が含まれます。
ユーザーは、このライブラリを誤用する可能性があり、その結果、提供されるセキュリティレベルが不十分になる可能性があることに注意する必要があります。このライブラリを使用して機能を実装する場合は、RFC 3711のSecurity Considerationsセクションを読むことをお勧めします。さらに、ライセンスと免責事項のセクションで概説されている条件を読み、理解することが重要です。
このライブラリは、RFC 7714で説明されているAES-GCM認証付き暗号化方式もサポートしています。
libSRTPをビルドする際に使用するサードパーティ(openssl/nssなど)の暗号バックエンドを構成できます。 サードパーティのバックエンドが設定されていない場合、libSRTPはAESとSha1の内部実装を提供します。 内部実装はAES-128とAES-256のみをサポートするため、AES-192またはAES-GCMグループの暗号を 使用するには、サードパーティの暗号バックエンドを構成する必要があります。この理由と パフォーマンス上の理由から、サードパーティの暗号バックエンドを使用することを 強くお勧めします。
srtp_protect()関数は、RTPパケットを保持するバッファに、認証タグを
そのパケットの末尾に書き込めるだけの十分なストレージが割り当てられていることを前提としています。
この前提が有効でない場合、
メモリ破損が発生します。