[axis2c][WS-Security]rampart/cの導入

12 月 9th, 2008 Axis2c, 未分類

axis2cで作ってるWEBサービスを暗号化したいんで導入した。

rampart/cのインストール

  1. http://ws.apache.org/rampart/c/からtarボールをダウンロード
  2. 適当なディレクトリに解凍し、インストールを実行
  3. # tar xvfz rampart-***.tar.gz
    # cd rampartc-bin-1.2.0-linux
    # ./install_rampart_bin_dist.sh
  4. この後axis2_http_serverを起動する。しかし、以下のエラーが出る可能性がある
  5. ../modules/rampart/libmod_rampart.so Failed. DLERROR IS libssl.so.0.9.8:
    cannot open shared object file: No such file or directory
  6. libsslなどを認識させるためにシンボリックリンクをはる
  7. # ln -s /lib/libssl.so.0.9.8b /lib/libssl.so.0.9.8
    # ln -s /lib/libcrypto.so.0.9.8b /lib/libssl.so.0.9.8
    # ldconfig
    
  8. サンプルをビルドするためににbuild.shを実行する
  9. # cd /usr/local/axis2c/bin/samples/
    # sh build.sh
  10. サンプルを起動してみる
  11. # cd /usr/local/axis2c/bin/samples/rampart/secpolicy
    # sh test_scen.sh scenarioX server-port
  12. verrsion OPENSSL_0.9.8 not defined in file libcrypto.so.0.9.8 with link time referenceエラーが出た場合、opensslのバージョンアップをする必要があります

opensslのバージョンアップ

  1. opensslのサイトから最新版のtarボールをダウンロード
  2. インストール
  3. # tar xvfz openssl-0.9.8i.tar.gz
    # cd openssl-0.9.8i
    # ./config shared
    # make
    # make install
  4. シンボリックリンクの貼りかえ
  5. # cd /usr/lib
    # ln -s /usr/local/ssl/lib/libcrypto.so.0.9.8 libcrypto.so.0.9.8
    # ln -s /usr/local/ssl/lib/libcrypto.so.0.9.8 libcrypto.so.6

[MinGW][Msys][Windows]libiconvのインストール

11 月 24th, 2008 MinGW

日本語のXMLドキュメントでもパースできるようにするために、libiconvをインストールすることに。

gnuのサイトからlibiconvの最新版であるlibiconv-1.12.tar.gzをダウンロードして

インストールしようとしたが、Msysのsedは仕様が違うらしくうまくmakeできなかった。

そこでMinGW用のlibiconvを用意してくているのでそれを利用してインストールすることに。

wgetのインストール

  1. http://sourceforge.net/projects/gnuwin32/へアクセスしwget-1.**.exeをダウンロード
  2. wget-1.**.exeを実行し適当なディレクトリにインストール(C:\gnuwinあたりに)
  3. 展開してできたbinディレクトリにパスを通す。(windowsの環境変数の設定のところで)
  4. windows再起動

libiconvのインストール

  1. デフォルトでは/usr/srcディレクトリがないので作成する。(libiconvはここにファイルを展開します)
  2. # mkdir /usr/src
  3. MinGW用のlibiconvをダウンロードし、以下のコマンドを実行
  4. # tar jxvf libiconv-1.10-ja-1-mingwPORT.tar.bz2
    # cd libiconv-1.10-ja/mingwPORT
    # ./mingwPORT.sh

[PortableSDK]コントロールポイントの開発-3(コントロール)[UPnP]

11 月 15th, 2008 Portable SDK

命令メッセージを送信し、レスポンスを取得します。

今回はメディアサーバのContentDirectoryサービスのSearchアクションを実行する命令を送信し、

取得したレスポンスを表示するプログラムを書きます。

実行結果

< u:SearchResponse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1">
< Result>< DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"
xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/">
< container id="Container:Video" parentID="0" restricted="1" searchable="1">
< dc:title>Video< /dc:title>
< upnp:class>object.container< /upnp:class>
< /container>
< container id="Container:Music" parentID="0" restricted="1" searchable="1">
< dc:title>Music< /dc:title>
< upnp:class>object.container< /upnp:class>
< /container>
< container id="Container:Pictures" parentID="0" restricted="1" searchable="1">
< dc:title>Photos< /dc:title>
< upnp:class>object.container< /upnp:class>
< /container>
~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~
< container id="Container:AllMusic" parentID="Container:Music" restricted="1" searchable="1">
< dc:title>All Music< /dc:title>
< upnp:class>object.container.album.musicAlbum< /upnp:class>
< /container>
< container id="Container:VideoAlbum" parentID="Container:Video" restricted="1" searchable="1">
< dc:title>Album< /dc:title>
< upnp:class>object.container< /upnp:class>
< /container>
<  /DIDL-Lite>
< /Result>
< NumberReturned>10< /NumberReturned>
< TotalMatches>30< /TotalMatches>
< UpdateID>1112< /UpdateID>
< /u:SearchResponse>

controlhw.c

#include "control.h"
#include "controlhw.h"
#include "DeviceType.h"

extern UpnpDevice_Handle g_handle;

/*
 * ContentDirectoryサービスのSearchアクションを呼び出すXMLを生成する
 */
int search(char* soap, char* ContainerID, char* SearchCriteria, char* Filter,char* StartingIndex, char* RequestedCount, char* SortCriteria)
{
	char message[2048]="";

	sprintf(message, "< u:Search xmlns:u=\"urn:schemas-upnp-org:service:ContentDirectory:1\">"
			"< containerid>%s< /containerid>"
			"< searchcriteria>%s< /searchcriteria>"
			"< filter>%s< /filter>"
			"< startingindex>%s< /startingindex>"
			"< requestedcount>%s< /requestedcount>"
			"< sortcriteria>%s< /sortcriteria>"
			"< /u:Search>", ContainerID, SearchCriteria, Filter, StartingIndex, RequestedCount, SortCriteria);

	strcpy(soap, message);
	return 0;
}

/*
 * ddからserviceTypeに指定したserviceData型のポインタを検索し、sdにそのポインタを与える
 */
int getServicePointer(struct serviceData** sd, const struct deviceData* dd, const char* serviceType){
	int i=0;
	struct serviceData* tmp_sd = dd->SD;

	for(i=0; i < dd->service_number; i++){
		if(strcmp(tmp_sd->serviceType, serviceType)==0){
			*sd = tmp_sd;
			return 0;
		}

		tmp_sd++;
	}

	return -1;
}

int setDeviceData(struct deviceData* DeviceData, IXML_Document* DescDoc, char* location){
〜〜前回と同じなので省略〜〜
}

int upnp_callback(Upnp_EventType eventtype, void *event, void *cookie)
{
    int num = 0;
    int ret = 0;

    printf("upnp_callback: start\n");

    switch(eventtype){
        case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE:
        case UPNP_DISCOVERY_SEARCH_RESULT:
        {
            struct Upnp_Discovery *disc = (struct Upnp_Discovery *)event;
            IXML_Document *Descdoc = NULL;
            struct deviceData DeviceInfo;
            int ret=0, i=0;

            //check ErrCode
            if(disc->ErrCode != UPNP_E_SUCCESS){
                printf("Error: %d\n", disc->ErrCode);
            }

            //Download Device Description Document
            if((ret = UpnpDownloadXmlDoc(disc->Location, &Descdoc)) != UPNP_E_SUCCESS){
                //fault
            }else{
            	  //getDeviceInformation
                setDeviceData(&DeviceInfo, Descdoc, disc->Location);

                if(strcmp(DeviceInfo.deviceType, DEVICETYPE_MEDIASERVER)==0){
                	struct serviceData *sd = NULL;
                	ret = getServicePointer(&sd,&DeviceInfo,SERVICETYPE_CONTENTDIRECTORY);

                	if(ret == 0){
                		IXML_Document *action = NULL;
                		IXML_Document *Response = NULL;
                		char soapmessage[2048]="";

				search(soapmessage, "0","*","*","0","10","");
				action = ixmlParseBuffer(soapmessage);
				ret = UpnpSendAction(g_handle,
                		sd->controlURL,
                		sd->serviceType,
				NULL,
				action,
				&Response);

				DOMString test = ixmlNodetoString(Response);

                		printf("ErrCode: %d\n", ret);
				if(ret==0)printf("%s\n",test);
                	}
                }

                if(DeviceInfo.SD)free(DeviceInfo.SD);
            }
            break;
        }

        case UPNP_DISCOVERY_SEARCH_TIMEOUT:
        {
            printf("upnp_callback: search timeout\n");
            break;
        }

        case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE:
        {
            struct Upnp_Discovery *disc = (struct Upnp_Discovery*)event;
            printf("Device byebye at location: %s\n", disc->Location);
            break;
        }

        case UPNP_CONTROL_ACTION_COMPLETE:
        {
            struct Upnp_Action_Complete *action = (struct Upnp_Action_Complete *)event;
            DOMString result;

            printf("Action Complete with return code: %d\n", action->ErrCode);
            result = ixmlDocumenttoString(action->ActionResult);
            printf("result: %s\n", result);
            break;
        }

        default:
            break;
    }

    printf("upnp_callback: end\n");
    return UPNP_E_SUCCESS;
}


DeviceType.h

#ifndef DEVICETYPE_H_
#define DEVICETYPE_H_

#define DEVICETYPE_MEDIASERVER "urn:schemas-upnp-org:device:MediaServer:1"
#define SERVICETYPE_CONTENTDIRECTORY "urn:schemas-upnp-org:service:ContentDirectory:1"

#endif /* DEVICETYPE_H_ */

注意しなければならないのはレスポンスが長くなりすぎるとPortableSDKはエラーを返してしまう点である。

search(soapmessage, "0","*","*","0","10","");

この部分でSearchアクションのxmlを生成しているが、10と書いてあるパラメータはRequestedCountと呼ばれるパラメータで、コンテンツリストを10個だけ返すように要求するという意味になる。

すなわちこのパラメータを大きくしすぎると、大量のデータがレスポンスに含まれてしまい、その結果PortableSDK側でエラーを出してしまう。

対処方法は現在調査中です。

[PCBSD][備忘録]PCBSDのインストールメモ

11 月 14th, 2008 PCBSD

VMでやったんですがね。そんときのメモ。

キーボードの設定

デフォルトが英字配列なので、日本語用にする。

# sudo vim /etc/rc.conf
keymap="jp.106"

Xの方も日本語配列にする。

# sudo vi /etc/X11/xorg.conf
Section "InputDevice"
    Identifier  "Keyboard0"
    Driver      "kbd"
    Option "XkbModel" "jp106"
    Option "XkbLayout" "jp"
EndSection

設定の反映はリブートで。

モニタの設定

このへんを見ながら設定した。

# sudo vi /etc/X11/xorg.conf
Section "Monitor"
  Identifer "Monitor0"
    HorizSync 63.5-64.5
    VertRefresh 59.5-60.5
    Modeline "1280x1024" 108.00 1280 1328 1576 1688 1024 1025 1028 1066 +hsync +vsync
    Option "dpms"
EndSection
・・・
Section "Screen"
    Identifier "Screen0"
    Device     "Card0"
    Monitor    "Monitor0"
    DefaultDepth 24
    Subsection "Display"
        Depth 24
        Modes "1280x1024"
    EndSubSection
EndSection

cvsupのインストール

デフォルトで入ってないんですよ。

まずportsを使う際のコンパイルオプションを設定。

# sudo vim /etc/make.conf
CPUTYPE=i686
CFLAGS= -O -pipe
COPTFLAGS= -O -pipe
NO_PROFILE=true

cvsupのインストール

# cd /usr/ports/net/cvsup-without-gui
# sudo make install

ハッシュテーブルの再構築(PATHの再読み込み)

# rehash

どうでもいいがunhashコマンドを打つことで、毎回PATH変数を参照するようになるらしい。

cvsup設定ファイルのコピー(オリジナルを残しておくため)し、*default hostを書き換える。

値はサーバ一覧から選択

# cd /usr/share/examples/cvsup/
# cp /usr/share/examples/cvsup/ports-supfile /root/
# cd /root/
# vi /root/ports-supfile
*default host=cvsup.jp.FreeBSD.org

portsの同期

# cvsup -g -L2  /root/ports-supfile

portsdbの更新

# portsdb -uU

refuse設定

必要なportsのみを同期する設定を行う。 /var/db/sup/refuse([ports-supfileの*base]/sup/refuse)にファイルを作成する。
# vi /var/db/sup/refuse
ports/arabic
ports/chinese
ports/french
ports/german
ports/hebrew
ports/hungarian
ports/korean
ports/polish
ports/portuguese
ports/russian
ports/ukrainian
ports/vietnamese

vmware toolsのインストール

まずVMの画面でVMware Toolsのインストールの選択をしておく。

その後に以下のコマンドを実行。

# cd /usr/ports/emulator/vmare-guestd5
# make install

参考

portsを最新にする
rehash
Vmware Tools のインストール

[debug][c][axis2c]axis2cのデバッグ

11 月 13th, 2008 Axis2c

axis2cを利用して開発中、正規表現でのパターンマッチング部分でメモリエラーが出現。

エラーメッセージは以下の通り。

*** glibc detected *** ./axis2_http_server: free(): invalid next size (fast): 0x08d0e710
regfree・・・

これはmallocからallocateされていないものをfreeしたときに出る。

問題はregfree(&preg)を呼び出したときにエラーがでていること。

これではregfree関数のバグなのか、自分のプログラムのバグなのか判断できない。

axis2c_http_serverプロセスを起動中にエラーが発生するので、デバッグどうしたらいいのか悩んだ。

悩んだ結果強引にvalgrindでデバッグを行った。

$ valgring ./axis2c_http_server

んで出力結果。

~~~略~~~
# Invalid write of size 1
http_client:62
~~~略~~~

http_client.c: 62付近

61: data = malloc(strlen(packet->data));
62: memset(data, 0, strlen(packet->data)+1);

明らかにおかしい。memsetでdata変数のメモリを0で初期化しようとしているが、
1バイト明らかにメモリを余分に初期化しようとしている

修正

61: data = malloc(strlen(packet->data)+1);
62: memset(data, 0, strlen(packet->data)+1);

コンパイルして実行した結果バグなし。

valgrind様々。

参考


Mona OS Developer

[C言語]他の関数でメモリ確保する[備忘録]

10 月 28th, 2008 c言語

よくミスるからメモ。
ポインタのポインタで渡さないとうまくいかない。

int main(){
    int ret=0;
    char *s;
    char *y = "abcdefg";

    ret = setVal(&s, y);
    if(ret != 0)return 0;
    printf("end\n");
    free(s);
}

int setVal(char** s, const char *y){
    if(NULL == (*s = malloc(strlen(y) * sizeof(char))))
    {
        free(*s);
        return -1;
    }
    strcpy(*s, y);
    return 0;
}

[youtube]HTTPによる途中からのストリーミング(?)

10 月 26th, 2008 未分類

gigazine[1]のサイトにyoutubeはストリーム型ではなくダウンロード型であると書かれていた。

本当だろうか?バーを途中にもっていけば、途中からちゃんと再生される。

ストリーム型」というのは正式には以下の意味らしい。

「インターネットにある音声や動画をパソコンに保存せずに再生する機能」

「ストリーミングは送信データをハードディスクにダウンロードすることなく視聴すること」

しかしIEなどのブラウザのキャッシュをみると「get_video?origin=・・・」というファイルでキャッシュとして保存されている。

つまりストリームではない。

これを踏まえて本題へ。

再生バーのポインタを途中のところまでもっていくと、youtubeではきちんとそこから再生してくれる。(ニコ動ではダメ)

これはどうしているのか、ちょっと気になったのでパケットを調べてみる。

一回目のリクエストでは先頭からのコテンンツを要求する。

GET /get_video?origin=nyc-v225.nyc.youtube.com&video_id=-SYd6vFpTeM&ip=xxx.xxx.xxx.xxx&signature=C302A9CEAED7DECA775BC5A442F2EBF0A6D47E59.C43745E6A41A226B1693FAED45D8380C4FE3CAC8&sver=2&expire=1225009866&key=yt4&ipbits=2 HTTP/1.1
Accept: */*
Accept-Language: ja-JP
Referer: http://s.ytimg.com/yt/swf/watch-vfl59966.swf
x-flash-version: 9,0,115,0
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; MEGAUPLOAD 2.0)
Host: v15.cache.googlevideo.com
Connection: Keep-Alive

HTTP/1.1 200 OK
Expires: Sun, 26 Oct 2008 06:31:06 GMT
Cache-Control: public,max-age=3600
Content-Type: video/flv
Accept-Ranges: bytes
ETag: “-347207108″
Content-Length: 36224516
Server: lighttpd/1.4.18
Last-Modified: Tue, 14 Oct 2008 05:18:39 GMT
Connection: close
Date: Sun, 26 Oct 2008 05:31:06 GMT

以下バイナリ

では次に再生バーのポインタを途中のところまでもっていく。

GET /get_video?origin=nyc-v225.nyc.youtube.com&video_id=-SYd6vFpTeM&ip=xxx.xxx.xxx.xxx&signature=2C09DADE1EC96E001C8024F1F0CFDF10804DE6E2.4D824A5CC70526A6867B0DA4D2022C22FDB0111E&sver=2&start=19632514&expire=1225009903&key=yt4&ipbits=2 HTTP/1.1
Accept: */*
Accept-Language: ja-JP
Referer: http://s.ytimg.com/yt/swf/watch-vfl59966.swf
x-flash-version: 9,0,115,0
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; MEGAUPLOAD 2.0)
Host: v15.cache.googlevideo.com
Connection: Keep-Alive

HTTP/1.1 200 OK
Expires: Sun, 26 Oct 2008 06:31:43 GMT
Cache-Control: public,max-age=3600
Content-Type: video/flv
Accept-Ranges: bytes
ETag: “-347207108″
Content-Length: 16592015
Server: lighttpd/1.4.18
Last-Modified: Tue, 14 Oct 2008 05:18:39 GMT
Connection: close
Date: Sun, 26 Oct 2008 05:31:43 GMT

以下バイナリ

まぁ予想通りの感じだ。

start変数に再生開始位置バイト数が記述されていると思われ。

これはContent-Lengthヘッダから予測できる。

1回目リクエスト:36224516

2回目リクエスト:16592015

start変数:19632514

つまり、1回目リクエスト≒2回目リクエスト+start変数と解釈するのが自然。

ちょっと差があるのはヘッダのバイト数が異なるため。

まぁ今さら書くことでもないことだったわ。

以下雑談。

そういやダウンロードが違法になることはほぼ決定したらしいが、このままじゃyoutubeユーザ全員逮捕だな。

youtubeをストリーミング型にする手法もあるのですが、サーバ側にとってもお金がかかるらしい。(GIGAZINEの下のほうに載ってた)

っつーかyoutubeってApacheじゃなくてlighttpdだったのか。

とっても軽いらしい。

参考文献

  1. GIGAZINE

[DLNA]外部ネットワークからのメディアコンテンツ利用

10 月 14th, 2008 DLNA/UPnP

結構DLNAも普及してきており、外出先などからDLNAコンテンツなどを利用したいという人もいるだろう。

一部の企業や組織では外出先からメディアコンテンツの利用を可能とするサービスや研究も登場している。

ちょっと研究よりのお話です。以下メモ。

ポケットU(NTT Docomo)

  • 目的はコンテンツの共有でなく、遠隔地(自宅等)に存在するプライベートのコンテンツを携帯から利用すること
  • 自宅PCに専用のソフトをインストールする
    • 機能1: iモード用のWEBサーバ
    • 機能2: コンテンツ変換機能
      • 動画・音楽データはiモーション(Mobile MP4)方式に変換
      • ドキュメントはPDFに変換
    • 対応フォーマット
      • 動画: AVI/MPEG-1/MPEG-2/3GP/WMV
      • 音楽: MPEG4-AAC(HE-AAC含む)/3GP/WAV
      • 静止画: JPEG/GIF/BMP
      • mp3, wmaには対応していない
    • 暗号化仕様
      • 端末とFOMAカードの製品番号を紐付け
      • どちらか異なれば再生または表示できない
  • PCとドコモのネットワークはVPN接続されている状態となる
  • 携帯→ドコモゲートウェイ→自宅PCのルートで接続
  • 問題点
    • 再生に先立って事前にコンテンツの変換を行う必要がある
      • 30分のテレビ番組(実質27分程度)の変換にAthlon64 X2 3800+(2GHz)搭載PCで2時間以上かかる
      • リアルタイム変換機能は備わっていない
    • iアプリによる提供が望まれる(現在されていない)
      • 端末のiモーション容量制限で分割された動画をユーザーの手間を余計にかけることなく連続再生
      • 音楽をフォルダ単位、つまりアルバムとして連続再生するような機能を設ける

MH2H(NTT Docomo)

  • Mobile Home to Homeの略系
  • 目的は訪問先のテレビなどで自宅のDLNAサーバにあるコンテンツを視聴すること
  • 自宅のPCと携帯端末に専用ソフトウェアをインストールする必要性がある
  • 携帯端末に無線LANのインタフェースが必要(デュアル端末)
  • 訪問先ネットワークで携帯端末がDLNAサーバのフリをすることで、クライアントからはDLNAサーバが同じネットワークにあるかのように見える
  • [DLNAサーバ(専用ソフトウェア入り)]<==>[ルータ]<==>[ルータ]<==>[デュアル端末(専用ソフトウェア入り)]仮想DLNAサーバ<==>[DLNAクライアント]
  • コンテンツの転送は、DLNAサーバから直接クライアントへ転送される。携帯端末が中継したりはしない。
  • ただしDTCP-IPで暗号化されたコンテンツ再生は現在困難である
    • サーバ・クライアント間においてRTT<7ms, パケットのTTL3以内で通信できなければならないなどの制限があるためと考えられる
    • DLNA側もDTCP-IPの仕様については常に注視しており、今後制度の緩和が進めばDLNAガイドラインもそれに沿った形でアップデートする意向はある
  • DLNAガイドライン1.5準拠しているDLNAサーバは、携帯端末からのデバイス操作を受け取れる
    1. コンテンツが保存されているDLNAサーバからコンテンツを選択
    2. コンテンツを再生するDLNAデバイスを選択
    3. 周囲にいる人にコンテンツリストを見せたくない場合に有効(携帯端末にしか自宅のコンテンツリストが表示されないため)
  • まだ商用化されていないため具体的な実装がわからない。
  • 以下俺の想像
    • コンテンツリストのIPアドレスは自宅ネットワークのグローバルIPアドレスとなる。
    • メディアコンテンツの伝送はIGDを利用したポートマッピングあたりを利用しホームサーバ(ポケットUをインストールしたPC)を経由して転送されていると考えられる。
    • 直接DLNAサーバに接続しているとは考えにくい理由
      • DLNAサーバの中にはグローバルIPアドレスからのリクエストを遮断するものがある
        • 俺が実験した限りではDixim製品は少なくともそうである
      • よってホームサーバがストリームデータを中継してやることで伝送を可能にしていると考えられる。
      • [DLNAクライアント] ==> [訪問先ルータ] ==> [自宅ルータ] ==> [ホームサーバ] ==> [DLNAサーバ]
      • DLNAサーバからはローカルのクライアントからの要求のように見える。
      • しかしストリーム転送時の認証とかはどーするんだ??グローバルIPでの認証ぐらいしかできそうにないが・・・。

ロケーションフリー(SONY)

  • SONYが専用のDDNSサーバを用意
    • これによりユーザは何の設定もしなくてもいい(ケーブルを接続するのみでよい)
  • DLNAには対応していない?
  • ちょっと後から書く。

以下、研究。

W-DLNA(KDDI)

  • 目的は2つのLAN間によるメディアコンテンツの共有(視聴)
  • ゲートウェイにW-DLNA機能を実装(例えばブロードバンドルータに組み込むなどが考えられる
  • [DLNAサーバ] == [W-DLNA搭載ルータ] == [インターネット] == [W-DLNA搭載ルータ] == [DLNAクライアント]
  • W-DLNA機能
    • ルータが遠隔地にあるDLNAサーバのフリをすることで、自ネットワークのDLNAクライアントからは同じネットワークにあるかのようにみえる
    • ルータがDLNAサーバ、DLNAクライアントが送信するUPnPメッセージを中継する
    • W-DLNA搭載ルータ同士はSIPによるメッセージ交換を行う
      • UPnPメッセージは全てSIPによるカプセル化を行う
      • コンテンツリストに含まれるIPアドレスは、W-DLNAが書き換えを行う
  • コンテンツ伝送はポートマッピングを行い、DLNAサーバからDLNAクライアントへ直接転送される

Personal Mobile A/V Control Point for Home-to-Home Media Streaming

  • IEEE Transactions on Consumer Electronics, Vol. 54, No. 1, FEBURUARY 2008
  • Taien Hwang, Jojin Park, and Jinwook Chung
  • 目的は2つのLAN間によるメディアコンテンツの共有(視聴)
  • PMCPサーバを自宅ネットワークに配置(ホームゲートウェイとして)
  • PMCPクライアントを携帯端末などに導入
  • P2Pネットワークを利用し、PMCPクライアント(携帯端末など)からPMCPサーバに接続
  • PMCPクライアントとPMCPサーバ間ではメディアコンテンツ以外の情報がやりとりされる
    • M-SEARCHメッセージやBrowse命令などはPMCPサーバを経由してやりとり
    • [DLNAサーバ] <==>[PMCPサーバ]<==>[ルータ]<==>[P2Pネットワーク]<==>[ルータ]<==>[PMCPクライアント]
  • PMCP間の認証手順
    • PMCPサーバ、PMCPクライアントはそれぞれ公開鍵と秘密鍵を生成
    • 宅内ネットワークでPMCPサーバ、PMCPクライアントは互いに公開鍵を交換
    • PMCPクライアントはリモートネットワークから、PMCPクライアントの秘密鍵で暗号化したデータを転送
    • PMCPサーバはPMCPクライアントの公開鍵で複合。成功したなら、レスポンスとしてPMCPクライアントの公開鍵で暗号化したデータを転送
  • メディアコンテンツ伝送は直接DLNAサーバから転送してもらう
    • IGDによるポートマッピングを利用
    • [DLNAサーバ] <== [Portmapping済みルータ] <== [MediaRenderer]
    • ポートマッピング命令はPMCPクライアントからの命令で実行する
      • PMCPクライアント→PMCPサーバ→IGDの順で
  • セキュリティ
    • DMCPサーバは利用を許可するDMCPクライアントリストを保持
    • IGDのポートマッピング情報を監視
    • 不必要なポートは閉じる作業も行う

以下雑記

しかし、DLNAガイドライン1.5の仕様がダウンロードできねぇ。

DLNAに加盟している企業にしか公開してないから。まぁしかたない。

参考文献

  1. ポケットU bu NTT Docomo
  2. IT Media + D Mobile MH2H
  3. IT Media + D Mobile ロケフリ
  4. Sony ロケフリ
  5. W-DLNA

[お笑い]NETAJINの感想[陣内]

10 月 12th, 2008 お笑い

サブプライム問題といい、夢も希望も持てないこの時代。

笑うネタがないのだ。

ということでNETAJINというDVD借りてきた。

ネタジン

陣内智則のコント集である。

裏面見て、テレビで見たことのあるコントの題名ばかりだったが、アレンジが加えられていて面白くなっていた。

以下がリスト。

  • 「飛行機」 まぁまぁ
  • 「オウム」 オススメ!!これはいい
  • 「羊が一匹・・・」
  • 「おもひで」 後半からじわじわ来る
  • 「水晶玉」 ちょっとおもろい。水晶のなる音と間が絶妙w
  • 「ゲームセンター」 オススメ!
  • 「物売り屋さん」 テレビのネタと全く一緒やった。
  • 「彼女の部屋」 オススメ!笑い死ぬwww
  • 「悩み相談」 これもテレビとほとんど一緒だったような。
  • 「視力検査」
  • 「卒業式」 ボビンケースに(ry

どれもハズレなしですね。

今週末はNETAJIN2を借りにいく。

[DTCP-IP]DTCP-IPについて[DLNA]

10 月 6th, 2008 DLNA/UPnP

DTCP-IPについてまとめ。

DTCP(Digital Transmission Content Protection)

  • DTLA(Digital Transmission Licensing Administrator)がライセンスする著作権保護技術
  • IEE1394, USBなどのインタフェース上の規定
  • デジタル放送の保護 → CAS(Conditional Access System)
  • DVDコンテンツ → CSS(Content Scramble System), CPRM(Content Protectikon for Recordable Media)
  • ネットワーク経由のメディアコンテンツ → DRM(Digital Rights Management)

AKE

  • クライアントとサーバが暗号鍵を交換するしくみ
  • 通信相手が正規のライセンスのものかも同時に判定する
  • 各機器はDTLAが発行する証明書を持っている
    • DTLAの署名
    • 機器の公開鍵

DTCP-IP

  • 通常の家庭内での使用を越えて利用されるの可能性がある
    • 対策1:TTLを3以下にしてパケットを送信
    • 対策2:RTTは7ms以内でなければならない
    • 以上の2つの条件を満たしたときのみ鍵の共有を行う
  • 通信手順
    • CP(Control Point) が MS(Media Server)からコンテンツリストを取得
    • CPが選択したコンテンツがDTCP-IPで暗号化されたコンテンツであればAKEとTTL, RTTの確認を実行する
    • 条件を満たしている場合、コンテンツを要求する。
    • MSはDTCP-IPで暗号化し、コンテンツを伝送。
    • CPはAKEで取得した鍵を用いて複合する

DLNAリンクプロテクションガイドライン(2006年10月)

  • DTCP-IPを必須条件の著作権管理技術として採用
  • Windows Media DRM for Network Devices(WMDRM-ND)をオプションとして採用

参考文献

2006 DLNA著作権保護ガイドラインを発表

嶋 久登: “DTCP-IP”, 映像情報メディア学会誌, 60, 5, pp.746-747 (2006) .