SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|07|

2004-08-29(Sun) シリアルポート切り替え機+α「EX232CP」製作開始

  さて、今日は昨日の「シリアルポート差し替え面倒クサい問題」に対する、対処方法を考えてみた。

  まず、最低限必要と思われる機能は、スイッチによるシリアルポート切り替え機能である。PCの背面に作成予定の自作アイテム「EX232CP」をシリアルケーブルで接続、その右側に秋月のライタ、左側にテスト基板を接続、スイッチひとつで「プログラム書き込み」と「テスト基板動作確認」ができるようにするのである。

  ただ、それだけでは面白くないので、電源供給機能もつけてしまおう。現在、私の愛用のPCであるメビウスノートは純正のACアダプタが壊れ、富士通のLOOXのアダプタをプラグだけ変換して、そのままつなげている(0.8Vほど足りないのだが動作に問題はない)。このアダプタは16V出力なので、これを秋月のライタにも供給してやり、コンセントの数を稼いでしまうのである。カタチ的には、アダプタのプラグを「EX232CP」に接続、そこから「メビウスノート」と「秋月のライタ」に電力を供給するのである。

  さらに、シリアルポートの信号チェックLEDもつけてしまおう。TxD、RxDに通信が発生するたびに、LEDを光らせるのである。おまけにCTSへ電気がきているかどうかのチェックLEDもつけよう。

  最後に、テスト基板へのCTS経由の電力供給を、PCのシリアルポートからだけでなく、アダプタから直接供給できるようにもしてしまおう。PCのシリアルポートからの電力はあまりハデに使うことができない(規格によると500mAとあるが、実際はLEDを数個がギリギリである)ので、これによりテスト基板の電源も不要にしてしまうのである。これは、本来のCTSと直接供給との切り替えができるようにする必要があると思われるが、開発対象によって開発中に頻繁に切り替えるものではないので、ピンヘッダによる切り替えとしよう。なお、16Vを直接ぶっこむのはマズい(昨日書いたように仕様では上限が15V)ような気もするので、そのうち3端子レギュレータで減圧できるようにするため基板にスペースを空けておけばいいだろう。

  概ね仕様が決まったら、部品集め&ケース加工である。

  画像の説明

  ざっと、手持ちの部品を物色して、上記の写真の部品を集めた。回路設計はまだしてないので、電子部品はまだである。上左から、9PINのガワ、LOOXメビウス変換プラグ(利用中)、加工済みケース、ケースの残り、秋月のライタ用のアダプタプラグ、切り替えスイッチ、加工済みのユニバーサル基板、ネジ一式、9PINのメス、オス、ガワ付きのオス(再利用)、である。

  ケースは100円ショップで4個100円のものである。秋月の基板を削らないと入らないのがアレだが、サイズがちょうどよく、半透明なのでLEDを外部に出す必要もなく、柔らかい材質で加工しやすく、なんといっても1個25円と安い。おまけに、開けやすさバツグン、しっかり保存、汚れを落としやすい角丸型で、電子レンジ加熱、冷凍保存OK(と書いてある)のニクいヤツである。

  次は回路設計。例によってBSchという回路図ソフトをハゲしく勘違いした使い方をして、実体配線図を設計する。ちょっとLEDあたりがキツかったが、まぁ、なんとか納まった。シリアルポートの信号線は、通常Highなので、信号が発生するLowの時に光るように、NPNの2SC1815でなく、PNPの2SA1085を初めて使ってみた。減圧用の3端子レギュレータは中央下付近に配置できるかな。

  画像の説明

  つーわけで、今日は作業終了。明日製作に入る予定である。

  夕方から、カミさんとカミさんのお兄さんのいる松戸に食事に行く。もちろんSVXで向かったのだが、例によってエアコンがヒートアップ。行きはエアコン切って行ったが、帰りはエアコンつけて、ダウンボタン押しっぱなし。SVX乗りなら誰もが経験するという「ダウンボタン押しっぱなし運転」を実践してしまう。つーか、左手がパンパンになるって。トホホ、早く治さなきゃ。


2014-08-29(Fri) さよなら艦娘たち

  今日は艦これのアップデートだったのだが、ゲームが起動しなくなってしまった。まったく話題になっていないあたり、Linux環境固有の問題っぽい?

  まぁ、なんていうの? こんなこともあるよね……もはや、うちにはマトモなWindowsマシンはないので、突然ではあるがこれにて終了ということに……まぁ、そうなるな。


2015-08-29(Sat) 鈴鹿で恒例のSUPER GT観戦

  今年も恒例のようににSUPER GTの予選日に観戦に行った。昨年と今年の最大の差は、ウチのガキがRAYBRIGのラジコンでタミヤグランプリに参戦した都合で、明らかにひいきのチームが存在しているということだ。

  早朝6時に出発。かなりの雨だったが、予報通り、現地に着いた頃にはやんでいて、曇っているのでまったく暑さを感じない。これは楽だ。例によって、ガキのお気に入りポイントである、S字の上に極小のテントを張る。

  練習走行が始まり、RAYBRIGが走るのを見ていると、どうにもラジコンカーにしか見えず、コースもラジコンコースに見えてきて、プロポを持っていない両手がワシワシしてしまう。

  画像の説明

  レース中、小学生向けに「コチラレーシング×NSXサーキットインスペクション」という、NSXに乗ってコースを一周という無料イベントがあったので、競争率高いだろうなぁ、と思いつつ申し込みブースに行ったのだが、アッサリと整理券が取れてしまった。乗るのはガキのみだが、これはラッキー。

  その後はショッピングブースで買い物。といっても、ガキがチョロQを買うのに付き合いつつ、ガキにRAYBRIGのキャップを買ってやったくらい。キャップは妙に高いので躊躇したが、ガキの着用頻度は高いし、タミヤグランプリ参加にもピッタリだし、まぁ、いいか。

  画像の説明

  遊園地で少し遊んで「NSXサーキットインスペクション」の参加のため、GPスクエアに戻るが、どういうイベントか判然としないまま、連れられてグランドスタンド下へ。ほどなく、十数台のNSXがやってきた。普通にナンバが付いていて、運転しているのは、普通のおじさん……に見える。いったい誰? 有志のNSX乗りの方々なのだろうか。

  画像の説明

  ラップタイム4分超えというノンビリペースで戻ってきた。特に説明もなく終了。ガキに聞いても「○○さん」という情報のみ。うーむ、細かいことは言わないが、イマイチ判然としないイベントであった。

  さて、昼飯を買って、観戦ポイントに戻って予選。GP500クラスは、開始後しばらくコースインせず、ようやくコースに出てきたと思ったら……

  画像の説明

  タミヤ的にライバル車であるENEOS SUSTINA RC FがS字を直進! レッドフラッグ!

  面白いのはその後だ。残り5分での再開なので、全車がイキナリ全開アタックなのだ。S字からして、限界の突っ込みのテンションが伝わってくるほどだ。残念ながらRAYBRIGはノックアウト組だったが、この5分だけで十分に元は取った感じであった。

  今年は86のレースやCRZのレースがないので残念だったが、代わりのF4の決勝もそれなりの波乱で楽しめた。最後、雨がそれなりに激しく降り始めたので撤収。温泉に入って帰宅。

  この調子なら本戦も楽しめそうだが、チケットの値段や混雑度を考えると、もうしばらく予選だけでいいかな。


2021-08-29(Sun) 秋月の彼岸花、咲いた

  夜に咲ける。去年よりだいぶ早い。

  画像の説明


2023-08-29(Tue) Maveでデジタル署名付きメールを送信する

  自作のメーラであるMaveに電子署名(S/MIME)機能を実装したい、というわけで、先の試行を経て、実装をするのである。

  一応、MVCスタイル(Model/View/Controller)で記述してあるので、それに沿って実装する。といっても、署名とは、つまり添付ファイルの一種なわけで、ファイルを添付する処理を実行後に、さらに署名を添付する処理を実行する形になる。

  MaveControllerの送信直前のファイルの添付処理の直後に、署名の添付処理を追加。MaveAccountモデルに、証明書ハンドリング処理を追加。MaveFolderモデルに、下書きメールを署名付きメールに上書きする処理を追加。MavePseudoMailモデルに、下書きメールから署名付きメールを生成する処理を追加。

diff --git a/mave.config.sample b/mave.config.sample
@@ -27,6 +27,9 @@ account[:POP_KEEP_TIME]       = 24 * 60 * 60                      #  サーバに残す時間(秒)
 
 account[:SMTP_SERVER]      = 'smtp.example.com'                # メール送信(SMTP)サーバ
 
+account[:PKCS12]           = 't-yamada.p12'
+account[:PKCS12_PASSPHRASE]    = 'yamada_p12_passphrase'
+
                                                                # インポート設定
 #account[:IMPORT_COMMAND]  = %Q!/usr/bin/find /home/old_user/mave.mails -name '*.eml' | grep -E '/Inbox/' | sed 's/\\/.*\\//& /'| sort -k 2 | sed 's/ //'!
 
diff --git a/mave_controller.rb b/mave_controller.rb
@@ -310,7 +310,8 @@ class MaveController
                            }
                            @models[:STATUS].log(['rcpt to=%s', rcpt_to.inspect]) if(debug = false) # 送信先のデバッグ
 
                            outbox_folder.enclose_attachments(mail)         # 必要なら、メールに添付ファイルを入れ込む
+                           outbox_folder.attach_sign(mail, account)        # 必要なら、メールに署名する
                            result = smtp.ready(account.mail_from, rcpt_to) {|fw|
                                mail.header_each(nobcc = true) {|line|
                                    fw.write(line + "\r\n")
diff --git a/mave_models.rb b/mave_models.rb
@@ -189,6 +189,7 @@ class MaveAccount < MaveBaseModel
    attr_reader :smtp_server
    attr_reader :import_command
    attr_reader :hash_id
+   attr_reader :pkcs12
 
    def initialize(params)
        super
@@ -220,6 +221,8 @@ class MaveAccount < MaveBaseModel
        @smtp_tls_verify= @account[:SMTP_TLS_VERIFY]
        @smtp_tls_certs = @account[:SMTP_TLS_CERTS]
 
+       (it = @account[:PKCS12]) and @pkcs12 = OpenSSL::PKCS12.new(open(it).read, @account[:PKCS12_PASSPHRASE])
+
        @import_command = @account[:IMPORT_COMMAND]
 
        @hash_id        = Digest::MD5.hexdigest(@account[:USER_ADDRESS])[0, 8]
@@ -1134,6 +1137,23 @@ class MaveFolder < MaveDirectory
        @dirty += 1 ####
    end
 
+   #------------------------------------------- MaveFolder ----
+   #
+   #   メールに署名する
+   #
+   def attach_sign(source_mail, account)
+       return unless(account.pkcs12)
+       halfname = create_mailfile {|fh|                        # 一時ファイルに書き出す
+           MavePseudoMail.new({:CONFIGS => @configs, :MODE => :SIGN, :MAIL => source_mail, :ACCOUNT => account}).pseudo_each {|line|
+               fh.write(line + "\n")
+           }
+       }
+       mail = MavePseudoMail.new({:CONFIGS => @configs, :FILE => (xmail = File.new(path + '/' + halfname))})
+       overwrite_mail(xmail, source_mail)
+       delete(halfname) unless(RUBY_PLATFORM =~ /i.86-mswin32/)    ####
+       @dirty += 1 ####
+   end
+
    #------------------------------------------- MaveFolder ----
    #
    #   任意の内容のメールを内部生成する
@@ -1723,6 +1743,7 @@ class MavePseudoMail < MaveMail
            :VIEW           => method(:view_message_each),
            :VIEW_RAW       => method(:view_raw_message_each),
            :ENCLOSE        => method(:enclose_attachments_each),
+           :SIGN           => method(:attach_sign_each),
        }
        @each_func      = @formtype[params[:MODE]] || nil
        @through_date   = params[:THROUGH_DATE]
@@ -2135,6 +2156,46 @@ class MavePseudoMail < MaveMail
 
        yield("--#{boundary}--")
    end
+
+   #--------------------------------------- MavePseudoMail ----
+   #
+   #   署名付きメールの作成
+   #
+   def attach_sign_each
+       data = ''
+       @mail.header_each {|line|
+           data << (line + "\n") if(line =~ /^Content-Type:/)
+           data << (line + "\n") if(line =~ /^Content-Transfer-Encoding:/)
+       } if(@mail)
+       data << "\n"
+       @mail.raw_body_each {|line|
+           line =~ /^This is a multi-part/ and next
+           data << (line + "\n")
+       } if(@mail)
+       pkcs12 = @account.pkcs12
+       pkcs7 = OpenSSL::PKCS7.sign(pkcs12.certificate, pkcs12.key, data, [], OpenSSL::PKCS7::DETACHED)
+       smime = OpenSSL::PKCS7.write_smime(pkcs7)               # 署名付きメール(crlf, lf が混じっている)
+
+       @mail.header_each {|line|
+           if(line =~ /^(\S+?):/)
+               header = $1.downcase
+               if(header == 'mime-version')
+                   # smime 中にあるので捨てる
+               elsif(header == 'content-type')
+                   # smime 中にあるので捨てる
+               elsif(header == 'content-transfer-encoding')
+                   # マルチパートになるので捨てる
+               else
+                   yield(line); header = false
+               end
+           else
+               yield(line) unless(header)
+           end
+       } if(@mail)
+       smime.split(/\r?\n/).each {|line|
+           yield(line)
+       }
+   end
 end
 
 #===============================================================================

  自分で言うのも何だが、エラく美しく追加できた。既存のコードの修正は一切なく、最初から用意されていた実装すべき場所に、必要なコードを加えただけ、という感じ。実に気分がいいなぁ。これも、たぶん使わないんだけど。

  実装が終わったところでテスト。テストは、ちゃんとS/MIMEが実装されているメーラを使って行う。手元のFedoraに標準添付のThunderbirdだ。Maveから送信して、Thunderbirdで受信させる。

  画像の説明

  署名付きのメールを受信すると、封筒マークに赤い×が付いたアイコンが現れ、それをクリックすると「デジタル署名が正しくありません」「メッセージは暗号化されていません」と出る。だが、どちらも期待通りだ。前者は、オレオレ認証局による署名だから、信頼されていないという意味だし、後者は、そもそも暗号化を実装していないし、実装するつもりもないから。

  画像の説明

  署名の実装自体が正しいことの確認に、本文を改ざんしてみた。すると「メッセージ内容に対して署名が一致しません」と出る。これも期待通り。逆に言えば、改ざん前の状態では正しく署名されていた、ということになるから。

  画像の説明

  オレオレ認証局の証明書をThunderbirdに追加するとこうなる。封筒マークから赤い×が消え「メッセージは署名されています」となる。これが正しい状態だ。認める認証局が署名した相手からのメールで、本文も改ざんされていないことが保証された状態。

  実際には、この署名の確認は相手側によって行われるものなので、オレオレ証明書を使っている限りはバツということになるが、実装としてはちゃんとS/MIMEが実現できているといえる。試しに会社から発行されているちゃんとした証明書を使ってテストしても、正しい結果が得られている。

  つうわけで、リポジトリにコミットして完了である。