ADD_KEY

Section: Linux Key Management Calls (2)
Updated: 2020-06-09
Index Return to Main Contents
 

名前

add_key - カーネルの鍵管理機能に鍵を追加する  

書式

#include <sys/types.h>
#include <keyutils.h>

key_serial_t add_key(const char *type, const char *description,
                     const void *payload, size_t plen,
                     key_serial_t keyring);

このシステムコールの glibc ラッパーは提供されていない。 「注意」のセクションを参照すること。  

説明

add_key() は、指定した type と description を持つ鍵の作成、更新を行い、長さ plen の payload で鍵を生成し、指定された keyring にその鍵を追加し、鍵リングのシリアル番号を返す。

指定したデータのフォーマットが違っていたり、その他にも無効なものがあると、 鍵が拒否される場合もある。

対象の keyring に指定された type と description に合致する鍵がすでに含まれる場合、 鍵タイプがサポートしていれば、新しい鍵が作成されるのではなく、 その鍵が更新される。 鍵タイプがサポートしていない場合、(異なる ID の) 新しい鍵が作成され、鍵リングの現在の鍵のリンクはこの鍵で置き換えられる。

対象の keyring のシリアル番号は、呼び出し元が 書き込み 許可を持つ有効な鍵リングのシリアル番号でなければならない。 そうでない場合は、以下のうち 1 つの特別な鍵リング ID を指定する。

KEY_SPEC_THREAD_KEYRING
この値は呼び出し元スレッド固有の鍵リングを指定する (thread-keyring(7))。
KEY_SPEC_PROCESS_KEYRING
この値は呼び出し元プロセス固有の鍵リングを指定する (process-keyring(7))。
KEY_SPEC_SESSION_KEYRING
この値は呼び出し元セッション固有の鍵リングを指定する (session-keyring(7))。
KEY_SPEC_USER_KEYRING
この値は呼び出し元の UID 固有の鍵リングを指定する (user-keyring(7))。
KEY_SPEC_USER_SESSION_KEYRING
この値は呼び出し元の UID のセッションの鍵リングを指定する (user-session-keyring(7))。
 

鍵タイプ

鍵の type は、鍵のタイプを指定する文字列である。 内部では、カーネルがコアの鍵管理コードには様々な鍵タイプを定義している。 ユーザー空間で利用可能な鍵タイプと、 add_key() の type 引き数で指定可能な鍵タイプは以下の通り:
keyring
鍵リングは、任意のタイプの他の鍵の列へのリンクを保持できる 特別な鍵タイプである。 このインターフェースを使って鍵リングを作成する場合、 payload は NULL で plen は 0 でなければならない。
"user"
これは様々な目的の鍵タイプであり、payload はユーザー空間のアプリケーションに 読み込まれて更新される。 鍵全体がカーネルメモリに保持される。 このタイプの鍵の payload には、 32,767 バイトまでの任意のデータの blob を入れることができる。
"logon" (since Linux 3.3)
この鍵のタイプは基本的には user と同じであるが、キーの読み込みが出来ない。 これはユーザー空間から読み込ませたくない ペイロードを格納するのに適している。

この鍵タイプは、 description の他の文字の前に ':' が含まれていることを保証するためにチェックし、 description に "service" プレフィックスが付けられていることを保証するために入念に調べる。

"big_key" (Linux 3.13 以降) この鍵タイプは user と同様であるが、1 MiB までのペイロードを保持できる。 鍵のペイロードがとても大きい場合、 カーネルメモリではなく、(スワップアウトされて) tmpfs に暗号化して格納される。

これらのキーのより詳細な情報は、 keyrings(7) を参照すること。  

返り値

成功すると add_key() は、作成または更新した鍵のシリアル番号を返す。 エラーの場合、値 -1 が返され errno にエラーの原因を示す値が設定される。  

エラー

EACCES
そのユーザーは指定された鍵リングを変更できない。
EDQUOT
この鍵を作成するか、鍵を鍵リングに追加すると、このユーザーの 鍵リングのクォータを超過してしまう。
EFAULT
type, description, payload の 1 つ以上が、プロセスのアクセス可能なアドレス空間の外を指した。
EINVAL
type または description で指定された文字列のサイズ (終端の null バイトを含む) が制限を越えた (制限はそれぞれ 32 バイトと 4096 バイトである)。
EINVAL
ペイロードデータが無効である。
EINVAL
type が logon であるが、 description に service: という形式のプレフィックス文字列が付けられていない。
EKEYEXPIRED
鍵リングが期限切れである。
EKEYREVOKED
鍵リングが廃止されている。
ENOKEY
鍵リングが存在しない。
ENOMEM
鍵を作成するのに十分なメモリーがない。
EPERM
type がピリオド ('.') から始まっている。 ピリオドから始まる鍵タイプは、実装用に予約されている。
EPERM
type が keyring であり、 description がピリオド ('.') から始まっている。 ピリオドで始まる description (名前) 付きの鍵リングは、 実装用に予約されている。
 

バージョン

このシステムコールは Linux 2.6.10 で初めて登場した。  

準拠

このシステムコールは、標準ではなく Linux 拡張である。  

注意

このシステムコールのラッパーは、glibc では提供されていない。 ラッパーは libkeyutils パッケージで提供されている。 このライブラリのラッパーを使う場合、 -lkeyutils でリンクすること。  

例

下記のプログラムはコマンドラインで指定された type, description, payload の付いた鍵を作成し、 その鍵をセッションの鍵リングにリンクする。 下記のシェルセッションは、プログラムの使い方を表している:

$ ./a.out user mykey "Some payload" Key ID is 64a4dca $ grep '64a4dca' /proc/keys 064a4dca I--Q--- 1 perm 3f010000 1000 1000 user mykey: 12  

プログラムソース

#include <sys/types.h> #include <keyutils.h> #include <stdio.h> #include <stdlib.h> #include <string.h>

int main(int argc, char *argv[]) {
    key_serial_t key;


    if (argc != 4) {
        fprintf(stderr, "Usage: %s type description payload\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }


    key = add_key(argv[1], argv[2], argv[3], strlen(argv[3]),
                KEY_SPEC_SESSION_KEYRING);
    if (key == -1) {
        perror("add_key");
        exit(EXIT_FAILURE);
    }


    printf("Key ID is %lx\n", (long) key);


    exit(EXIT_SUCCESS); }  

関連項目

keyctl(1), keyctl(2), request_key(2), keyctl(3), keyrings(7), keyutils(7), persistent-keyring(7), process-keyring(7), session-keyring(7), thread-keyring(7), user-keyring(7), user-session-keyring(7)

カーネルソースファイル Documentation/security/keys/core.rst と Documentation/keys/request-key.rst (Linux 4.13 以前ではファイル Documentation/security/keys.txt と Documentation/security/keys-request-key.txt)。  

この文書について

この man ページは Linux man-pages プロジェクトのリリース 5.07 の一部である。 プロジェクトの説明、バグ報告に関する情報、このページの最新版は、 http://www.kernel.org/doc/man-pages/ に書かれている。


 

Index

名前
書式
説明
鍵タイプ
返り値
エラー
バージョン
準拠
注意
例
プログラムソース
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 03:49:00 GMT, December 30, 2020