LoginSignup
1

More than 5 years have passed since last update.

slappasswd の動作をソース読んでかじる

Posted at

slappasswd -c "$1$%.8s" を実行した際の動作を、ソースを読んでかじった。OpenLDAPのバージョンは2.4.40。

動作の概要

ざっくり言って以下の処理をする。

  1. $1$%.8s%.8s を、ランダムな8文字のソルトに置き換える
  2. パスワードと1.で生成したソルトを、crypt(*key, *salt)に渡す
  3. cryptの返り値の先頭に、{CRYPT}をつける

もうちょっと詳しく

slappasswd.c

OpenLDAP Source Repository - openldap.git/blob - servers/slapd/slappasswd.c

まず、 [openldap.git] / servers / slapd / slappasswd.c の int slappasswd() が呼ばれる。

l.128 で -cオプションをパースする。l.130のlutil_salt_formatで、static変数に、オプションで渡した文字列が保存される。

slappasswd.c
 128                 case 'c':       /* crypt salt format */
 129                         scheme = "{CRYPT}";
 130                         lutil_salt_format( optarg );
 131                         break;

l.259でlutil_passwd_hashを呼び出す。&passwdの構造体に、求める暗号化されたパスワードが入る。

slappasswd.c
 259         lutil_passwd_hash( &passwd, scheme, &hash, &text );

passwd.c

OpenLDAP Source Repository - openldap.git/blob - libraries/liblutil/passwd.c

lutil_passwd_hashは[openldap.git] / libraries / liblutil / passwd.c で宣言されている。

passwd.c
 376 int lutil_passwd_hash(
 ...
 382         const struct pw_scheme *sc = get_scheme( method );
 ...
 399         return (sc->hash_fn)( &sc->name, passwd, hash, text );

l.382で、{CRYPT}に対応したパスワード暗号化の構造体を取ってきて、l.399でパスワード暗号化関数を呼び出す。

passwd.c
171         { BER_BVC("{CRYPT}"),           chk_crypt, hash_crypt },

get_scheme から、l.171で宣言されている構造体を受け取るので、hash_cryptが呼ばれる。

passwd.c
1184 static int hash_crypt(
...
1205         if( lutil_entropy( salt, sizeof( salt ) ) < 0 ) {
1206                 return LUTIL_PASSWD_ERR; 
1207         }
1208
1209         for( i=0; i< ( sizeof(salt) - 1 ); i++ ) {
1210                 salt[i] = crypt64[ salt[i] % (sizeof(crypt64)-1) ];
1211         }
1212         salt[sizeof( salt ) - 1 ] = '\0';
...
1222         rc = lutil_cryptptr( passwd->bv_val, (char *) salt, &hash->bv_val );

l.1205-l.1212でソルトを生成する。l.1205で乱数をつくり、1.1209-1210でBase64で解釈できる文字列に変換する。lutil_entropyはpassword.cと同一ディレクトリ内のentropy.cで宣言されている。

l.1222でcryptにパスワードとソルトを引き渡す関数を呼ぶ。

passwd.c
  98 lutil_cryptfunc *lutil_cryptptr = lutil_crypt;
...
 899 static int lutil_crypt(
...
 904         char *cr = crypt( key, salt );

lutil_crypt_ptr の実体は lutil_cryptで、その内部でcryptを呼ぶ。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1