高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先


テクニカルQ&A

NW56 - ARA/PPP パスワードへのアクセス
(1999 年 2 月 1 日更新)


Q: 現在開発中のコードでは、ARA/PPP によって使用されるパスワードを設定する必要があるのですが、どのドキュメンテーションを見ても、このパスワードがどのように動作するのか詳しく説明されていません。パスワードリソースの作成方法を教えてください。

A: 設定された OpenTransport の ARA/PPP パスワードは“リモートアクセス”初期設定フォルダ内にある "リモートアクセス接続ファイル" の 'pass' リソースに格納されています。ARA バージョン 2.0 以降、'pass' リソースのサイズは 256 バイトに拡張されました。

実際のパスワードデータは ECB (Electronic Code Book) モードの DES (Data Encryption Standard) アルゴリズムを使ってエンコードされています。暗号化に対するキースケジュールは ARA/PPP の設定ユーザ名の先頭 56 ビット (7 バイト) から導出されます。

現在のところ、ARA パスワードをエンコードする OpenTransport API は存在しません。ただし、パスワードは DES の ECB モードを使ってエンコードされているため、以前の "Apple Remote Access API" の PassWordMunger 関数を使って、モダンな ARA/PPP パスワードをエンコードすることが可能です。

パスワードを適切にエンコードするには、まずパスワードデータを 256 バイトバッファにゼロパッドする必要があります。この後は、ユーザ名文字列をキーとして使用してクリアテキストのパスワードを 1 度に 8 バイトずつエンコードし、256バイトすべてが処理されるまでエンコードの結果を 'pass' リソースに追加します。この処理が完了したところで、'pass' リソースの先頭バイトをゼロアウトします。

次のサンプルコードはこのプロセスを具体的に示しています。


#include <RemoteAccessInterface.h>

// ---------------------------------------------------------------------------
OSErr EncodeARApassword ( UInt8 *userName, UInt8 *password, UInt8 *outbuf )
// ---------------------------------------------------------------------------
//
// このルーチンはパスワードをリモートアクセス接続の 'pass' リソースに
// 格納するのに適したフォーマットにエンコードする
// このルーチンでは、以前の ARA PassWordMunger API をインクリメンタルに呼び出して、
// パスワードを 256 バイトのブロックに変換する
//

{
    TRemoteAccessPasswordMunger pb;
    UInt8   buffer[9];
    UInt8   inBuffer[256];
    OSErr   err;
    short   i;
    short   offset = 1;

    // 変換バッファをゼロアウトする
    for (i = 0; i < sizeof inBuffer ; i++) inBuffer[i] = 0;

    // パスワードを中にコピーする
    BlockMoveData(password, inBuffer, password[0] + 1);

    // パラメータブロックをリモートアクセス API 呼び出しに対応してセットアップする
    pb.csCode           = RAM_EXTENDED_CALL;
    pb.resultStrPtr     = nil;
    pb.extendedType     = (char*) REMOTEACCESSNAME;
    pb.extendedCode     = CmdRemoteAccess_PassWordMunger;
    pb.userNamePtr      = userName;
    pb.passWordPtr      = buffer;
    pb.reserved         = 0;

    // 1 度に 8 バイトずつ処理する
    for (i = 0; i < 32 ; i++)
    {
        BlockMoveData(inBuffer+offset, &buffer[1], 8);
        buffer[0]=8;

        pb.passWordPtr      = buffer;
        err = PBRemoteAccess((TPRemoteAccessParamBlock) &pb, false);
        if (err == noErr)
                err = pb.ioResult;
        if(err != noErr) break;

        BlockMoveData(&buffer[1], outbuf + offset, 8);
        offset+=8;
    }

    outbuf[0]=0;        // 先頭バイトは常にゼロ
    return err;
}

使用例 1 ユーザ名をキーとして使用するパスワードの暗号化

エンコードされたパスワードを処理した後は、いくつかの方法で実際の 'pass' リソースを設定することができます。

  1.  最も望ましいのは、MacOS 8.5 に組み込まれている Open Transport 2.0 のコンポーネントである Network Setup API を使用する方法です。実際、Network Setup SDK は設定データベースにアクセスするために将来も有効な長期的ソリューションです。この API の使用例は DTS サンプルコードの More NetworkSetup で参照することができます。

  2. もう 1 つの方法として、AppleEvent をネットワーク設定スクリプトに送信し、与えられた構成に対応したパスワードを設定することができます。この方法の具体例を以下に示します。注意: ネットワーク設定スクリプトのバージョン 1.0 はパスワードを適切にエンコードしません。バージョン 1.0.2 またはそれ以上を使用してください。

--setpassword("Configuration", "password")

 on setpassword(configName, thePassword)
        tell application "Network Setup Scripting"
                open database
                begin transaction
                set password of Remote Access configuration
configName to thePassword
                end transaction
                close database
        end tell
end setpassword


  1. 最後の手段として、"リモートアクセス接続" ファイルをオープンして、その中に直接パスワードを書き込むという方法もあります。ただし、この方法はリスクが大きいため、できるかぎり使用しないことをお勧めします。ARA は必要に応じていつでもこのファイルをオープンするため、この方法ではファイルのリソースマップを壊すというリスクを犯すことになります。また、初期設定ファイルのフォーマットが将来にわたって変更されないという保証もありません。
今後、Open Transport Network Setup API がパスワードをエンコードするためのインタフェースを提供することが期待されますが、それまでは、上述の使用例で満足するしかありません。

参考資料 Inside Macintosh: Open Transport
サンプルコード: MoreNetworkSetup


-- Vinnie Moscaritolo
Worldwide Developer Technical Support