ラベル standard の投稿を表示しています。 すべての投稿を表示
ラベル standard の投稿を表示しています。 すべての投稿を表示

2012年3月4日日曜日

GPG で表示される "2048R" や "usage: SC", "usage: E" の意味

GnuPGで '--edit-key' オプションを使うと鍵の管理作業のためのメニューが出てくる。

$ gpg --edit-key 549B5813
gpg (GnuPG) 2.0.14; Copyright (C) 2009 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There in NO WARRANTY, to the extent permitted by law.

Secret key is available.

pub 2048R/549B5813  created: 2012-01-22  expires: never     usage: SC
                    trust: ultimate      validity: ultimate
sub 2048R/6878DE41  created: 2012-01-22  expires: never     usage: E
sub 2048g/60ACA1A9  created: 2012-01-22  expires: never     usage: E
sub 2048D/29641C08  created: 2012-01-22  expires: never     usage: S
(略)

ここで表示される "2048R" とか "usage: SC" の意味を理解しないでいるとまずそうだから調べてみた、という話。


2048R

これは "The GNU Privacy Handbook" に書いてあった。

The public key is displayed along with an indication of whether or not the private key is available. Information about each component of the public key is then listed. The first column indicates the type of the key. The keyword pub identifies the public master signing key, and the keyword sub identifies a public subordinate key. The second column indicates the key's bit length, type, and ID. The type is D for a DSA key, g for an encryption-only ElGamal key, and G for an ElGamal key that may be used for both encryption and signing. The creation date and expiration date are given in columns three and four. The user IDs are listed following the keys.

要するに数字の部分が鍵のビット長、残りのアルファベット1文字が鍵の種類を表す。R なら RSA、D なら DSA、g なら 暗号化専用の ElGamal、G なら 暗号化と署名両方に使える ElGamal(このハンドブックは1999年の古いものなのでRSAについて言及していないが)。

"2048g"


usage: SC とか

なんとなく "S" は Sign で "E" は Encrypt だろうと予想が付いているものの、調べてみると同じ疑問をもった人がいた。

How are the GPG usage flags defined in the key details listing? - Unix and Linux - Stack Exchange

回答によれば "S" が "for signing", "E" が "for encrypting", "C" が "Creating a certificate"(たとえば Revocation certificate: 失効証明書とか?), "A" が "authentication"とのこと(SSHやTLSにおける認証で使えるらしい)。


2012年1月15日日曜日

ハードディスクエラーとSMARTのPending sector, reallocated sector

SMARTで"Current Pending Sector Count"が検出されたときに、どう対応すればよいかという話。


Pending sector と reallocated sector、remap の概要

"Pending Sector"は、一言で言うと「不安定なセクタ」。次にアクセスしたときに正常に読み込める可能性もあるので"Remap"は行われないが、Remapされずにずっと不安定なままOSから参照されると dmesg等のログに "1 Currently unreadable (pending) sectors" といったエラーが出力され続けることがある。

エラーを解消するには、セクタをPending状態からremapされた状態、つまり"Reallocated sector"に変化させる必要がある。そのためには、セクタに対して一度書き込みを行えばよい。書き込みを行うことにより"Pending"の状態から"Reallocated"の状態に変化し、remapが行われるようになってエラーが解消する。同時に、SMARTの"Current Pending Sectors Count" が減り、"Reallocated Sectors Count"が増える。

ただし、エラーが解消する代わりにRemap処理はディスクアクセスの性能を落とす可能性がある(論理的に連続している情報が物理的には離れたトラックに配置され、磁気ヘッドのシーク時間が増えるため)。


対応方法

参考ページに書いてある。"hdparm --write-sector /dev/x" を使う方法と "dd if=/dev/zero of=/dev/x bs=4096 count=1 seek=y" を使う方法の二通りがあるが、前者のほうがLBAを直接指定すればよいので簡単かな、と。


2011年9月3日土曜日

Linux の /proc/crypto

/proc/crypto を見ると、Linuxカーネルがどのような暗号化アルゴリズム(cryptographic cipher)を使用しているかがわかる、という話


/proc/crypto の例

CentOS-6.0 で /proc/crypto を見てみた。

# cat /proc/crypto
name         : xts(aes)
driver       : xts(aes-asm)
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
type         : givcipher
async        : no
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : eseqiv
(略)

name だけ grep してみた。

# grep '^name' /proc/crypto
name         : xts(aes)
name         : xts(aes)
name         : sha256
name         : sha224
name         : cbc(aes)
name         : cbc(aes)
name         : aes
name         : aes
name         : stdrng
name         : crc32c
name         : sha1
name         : md5

暗号化モジュールをロードしてみる

カーネルが使用できる暗号を追加したい場合は、該当するモジュールをロードしてやればいい(modprobe 等のコマンドを使う)。

例:blowfish暗号を追加

# modprobe blowfish

lsmod, modinfoで、ロードされたモジュールを確認。

# lsmod |grep blowfish
blowfish                7850  0 

# modinfo blowfish
filename:       /lib/modules/2.6.32-71.29.1.el6.x86_64/kernel/crypto/blowfish.ko
description:    Blowfish Cipher Algorithm
license:        GPL
srcversion:     3D0BFB5C93D66CBA1C92FA2
depends:        
vermagic:       2.6.32-71.29.1.el6.x86_64 SMP mod_unload modversions 

/proc/crypto も確認。

cat /proc/crypto
name         : blowfish
driver       : blowfish-generic
module       : blowfish
priority     : 0
refcnt       : 1
selftest     : passed
type         : cipher
blocksize    : 8
min keysize  : 4
max keysize  : 56
(略)

dm-crypt での例

dm-crypt は、ディスク暗号化のための仕組み(a device-mapper crypto target)。dm-crypt を使用すると、/proc/crypto の内容が変化する。つまり、 dm-crypt が Linuxカーネルの暗号化モジュールを利用している、ということが分かる。

テキトーにdm-cryptを使って暗号化してみる

/dev/sdc1 を blowfish の CTRモード で暗号化して mapping01 にマップ。

# cryptsetup create -y -c blowfish-ctr-plain mapping01 /dev/sdc1

/proc/crypto を見てみる。

# cat /proc/crypto
name         : ctr(blowfish)
driver       : ctr(blowfish-generic)
module       : kernel
priority     : 0
refcnt       : 2
selftest     : passed
type         : givcipher
async        : yes
blocksize    : 1
min keysize  : 4
max keysize  : 56
ivsize       : 8
geniv        : chainiv

name         : ctr(blowfish)
driver       : ctr(blowfish-generic)
module       : ctr
priority     : 0
refcnt       : 2
selftest     : passed
type         : blkcipher
blocksize    : 1
min keysize  : 4
max keysize  : 56
ivsize       : 8
geniv        : chainiv

name         : blowfish
driver       : blowfish-generic
module       : blowfish
priority     : 0
refcnt       : 2
selftest     : passed
type         : cipher
blocksize    : 8
min keysize  : 4
max keysize  : 56
(略)

…というように、CTR とか blowfish のモジュールがロードされたのが分かる。

なお、 dm-crypt に関しては、なるべくデフォルトの暗号化アルゴリズムとモードを使ったほうがよいようだ。というのは、2011-06-28頃のメーリングリストでそのように主張されていたから(AES + CBCモード + ESSIV を使いましょう、とのこと)。


2011年4月27日水曜日

RangeオブジェクトとSelectionオブジェクト

JavaScriptにおけるRangeオブジェクトとSelectionオブジェクトの使いかたとして、次の2つのケースを書いておく。

  1. 選択範囲のテキストを取得する
  2. 指定したノードを選択状態にする

1. 選択範囲のテキストを取得する

マウスで選択したテキストがアラートで表示される、という簡単な例題。

IE以外の場合

まずSelectionオブジェクトを取得して、そこからさらにRangeオブジェクトを取得する(それぞれ、getSelectionメソッドとgetRangeAtメソッドを使う)。RangeオブジェクトのtoStringメソッドで求めるテキストが得られる。

    <p id="p">foo bar baz</p>

    <script type="text/javascript">
      document.getElementById('p').onmouseup = function(){
        var range = window.getSelection().getRangeAt(0);
        alert(range.toString());
      }
    </script>
    

Windows7のFirefox, Chrome, Safariで期待通りに動作した。

IEの場合

考え方は同じだが、使用するメソッドが異なる。

  • Selectionオブジェクト … documentオブジェクトのselectionプロパティ
  • Rangeオブジェクト(IEの場合はTextRangeオブジェクトと言う) … SelectionオブジェクトのcreateRangeメソッド
  • テキスト … TextRangeオブジェクトのtextプロパティ
    <p id="p">foo bar baz</p>

    <script type="text/javascript">
      document.getElementById('p').onmouseup = function(){
        var range = document.selection.createRange();
        alert(range.text);
      };
    </script>
    

2. 指定したノードを選択状態にする

HTMLの中の任意の要素を選択状態(明暗が反転した状態)にする、という簡単な例題。

IE以外の場合

SelectionオブジェクトのselectAllChildrenメソッドを使う。引数として渡した要素が、子要素を含めて選択状態になる。

    <p id="p">foo bar baz</p>

    <script type="text/javascript">
      window.getSelection().selectAllChildren(document.getElementById('p'));
    </script>
    

これもWindows7のFirefox, Chrome, Safariで期待通りに動作した。

IEの場合

IEの場合は、Selectionを使わない。

まずはTextRangeオブジェクトを生成し、それが指定の要素を含むようにmoveToElementTextメソッドを実行する。さらにselectメソッドを実行して、要素を選択状態にする。

    <p id="p">foo bar baz</p>

    <script type="text/javascript">
      var range = document.body.createTextRange();
      range.moveToElementText(document.getElementById('p'));
      range.select();
    </script>
    

とりあえず以上。テキストの追加、削除、比較などについてはリファレンスを参考に。

2011年4月7日木曜日

CSRの鍵長を確かめるコマンドなど

SSLサーバー証明書の更新時期になったので、CSRを作りなおした。2011年からは「RSA暗号の鍵長が2048ビット以上でないといけない」とのことなので、opensslのコマンドに -newkey rsa:2048 というオプションが必要になる。

openssl req -new -nodes -newkey rsa:2048 -keyout myserver.key -out myserver.csr

さらに、念のため2048ビットのCSRができているか確認したいなら、次のコマンドを打てばいいだろう。といってもただ単にCSRの内容をテキストで出力して、先頭を切り出しているだけだが。

openssl req -text -in ./myserver.csr | head

コマンドの結果、次のようなテキストが出力される。

Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, ST=Tokyo, L=Setagaya-ku, O=foo Inc., CN=foo.example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):

「RSA Public Key: (2048 bit)」と記されているので、RSA暗号の鍵長は2048ビットになっているに違いない。

参考

2011年1月27日木曜日

DOMのhashプロパティ×2

URLを構成する文字列のうち、"#…"の部分はフォーマルには "fragment identifier" と呼ばれるが、「フラグメント・アイデンティファイア」と発音しても他人に通じることは稀。"#"は一般的に「ハッシュマーク」や「シャープ」と呼ばれるから、日常会話では「ハッシュ以下」とか「シャープなんとか」などと言えば通じる。

JavaScriptでこの fragment identifier を参照する方法を整理しておく。

window.location.hash

ブラウザで現在表示しているURLの fragment identifier を知りたい場合、JavaScriptでは window.location.hash と書けばよいことが知られている(ちなみに、Mozillaのドキュメント window.location - MDC Doc Center には "DOM Level 0. Not part of any standard." と書いてあるので、W3Cで標準化されたものではない)。

HTMLAnchorElement.hash

location以外に fragment identifier が関係してくる場面としては、a要素のhref属性値を処理する場面がある。実はつい最近までhref属性値を文字列処理して"#…"の部分を取り出す、なんてことをしていたのだがその必要はない。アンカーオブジェクトにもhashプロパティが存在しているので、getElementしてhashプロパティを参照するだけで済む。次の例はアンカーのhref属性値"http://dminor11th.blogspot.com/index.html#foo"のうちの"#foo"をアラートで表示する。

<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <p><a id="a1" href="http://dminor11th.blogspot.com/index.html#foo">anchor1</a></p>
    <script type="text/javascript">
      alert(document.getElementById('a1').hash);
    </script>
  </body>
</html>

ちなみに、このhashプロパティ、つまりHTMLAnchorElementのhashプロパティも、W3Cで標準化されたものではないようだ(DOM Level 2 HTML Spec.等に記載されていない)。Mozillaの HTMLAnchorElement - MDC Doc Center によるとHTML5には記載されるらしい。

2011年1月15日土曜日

document.anchors と document.links

今まで気にかけていなかった、DOMの"document.anchors"と"document.links"の違いを整理。

  • name属性を持つa要素はアンカーとみなされるので、document.anchors に属する。
  • href属性を持つa要素はリンクとみなされるので、document.links に属する。
  • name属性とhref属性を両方とも持っているa要素は、document.links, document.anchors の両方に属する。
  • id属性の有無はアンカー/リンクの判別には無関係(IEでは仕様が異なり、id属性を持つ場合はアンカーとみなされる)

確認のための例

アラートでa要素のテキストノードを表示。a1とa3が document.anchors、a2とa3が document.links として表示される。

<html>
<head>
  <title>test</title>
</head>
<body>

<ul>
  <li><a name="a1">a1</a></li> <!-- anchor -->
  <li><a href="foo">a2</a></li> <!-- link -->
  <li><a name="a3" href="bar">a3</a></li> <!-- anchor, link -->
</ul>

<script type="text/javascript">
  function collectText(a){
    var stack = new Array();
    for(var i=0, n=a.length; i<n; i++){
      stack.push(a[i].childNodes[0].nodeValue);
    }
    return stack.join(', ');
  }
  alert('document.anchors[' + collectText(document.anchors) + ']');
  alert('document.links[' + collectText(document.links) + ']');
</script>

</body>
</html>

※IE-6, IE-7, IE-8, Firefox-3.6.13, Chrome-8.0.552.224, Safari-5.0.2で期待通りに動いた(Windows7)。

2010年11月29日月曜日

Lisp の every と some 風の関数を JavaScript で

Common Lisp や Emacs Lisp 等では every や some という高階関数が提供されており、複数の値に対するテストを簡潔に記述することができる(述語関数/predicateの、リストへの適用)。

Lispの例

  (every #'evenp '(1 2 3)) => nil        ; 偶数でない要素があるため偽(nil)
  (some #'evenp '(1 2 3)) => t           ; 偶数の要素が少なくとも1個あるため真(t)

ここで、evenp は引数が偶数の場合に t を返す組み込み関数

JavaScriptの例

JavaScriptで同様のことを実現したいという場合は、次のような形になるはず。

// 関数定義
function every(p, arr){
  for (i = 0, n=arr.length; i < n; i++) {
    if(!p(arr[i])) return false;
  }
  return true;
}
function some(p, arr){
  for (i = 0, n=arr.length; i < n; i++) {
    if(p(arr[i])) return true;
  }
  return false;
}
function evenp(x){
  return (x%2==0) ? true : false;
}
// 実行
every(evenp, [1, 2, 3]);   // => false
some(evenp, [1, 2, 3]);    // => true

こんな感じ。

実は every, some が組み込まれているブラウザもある

念のため調べたところ、Firefox(Gecko 1.8b2 以降)にはこれらの関数が配列のメソッドとして実装されているとのこと。

everyの利用例(Mozilla Developer Center より転載)

function isBigEnough(element, index, array) {
  return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed は false

mozilla.orgのページにある「互換性」のコードを利用すれば、Firefox以外のブラウザでもeveryが利用できるようになる。

2010年11月5日金曜日

htmlでルビを振る

漢字の読み仮名等を表示したいときに使うruby要素。

ruby, rb, rp, rtという4つもの要素を組み合わせて記述するのがスタンダードらしい(それぞれ、ruby, ruby base, ruby parenthesis, ruby text を表す)。

例:青空文庫の「夢十夜」(夏目漱石)

腕組をして枕元に<ruby><rb>坐</rb><rp>(</rp><rt>すわ</rt><rp>)</rp></ruby>っていると、<ruby><rb>仰向</rb><rp>(</rp><rt>あおむき</rt><rp>)</rp></ruby>に寝た女が、静かな声でもう死にますと云う。

確認したところ、Firefox3.6はルビ表示をサポートしておらず、rbの内容の直後にrp, rtの内容がそのまま表示される。IE6-IE8, Chrome7.0, Safari5.0はOK。

HTML5では、rb(ruby base)を記述しなくてもよいようだ。

2010年7月14日水曜日

日時の形式

インターネットで日常的に見かけるのはたったの3種類。暗記してしまいたい。

1. ISO8601 - 日付と時刻の表記に関する国際規格 -
1-1. UTCの場合 - Zを付ける
例: 2010-07-14T15:27:46Z
1-1. UTC以外の場合
例: 2010-07-14T15:27:46+01:00
2. RFC822
電子メールに関するRFC(よって日時以外のデータに関する決まりも含む)。
現在はRFC2822が発行されたためRFC822は破棄されたが、日付の形式は現在でも使われている。
例: Wed, 14 Jul 2010 09:53:48 +0900