about summary refs log tree commit diff
path: root/pkgs/profpatsch/gpg-private-offline-key/:
blob: 1264627f61ef7e3f7789191d936f17c4d1d6a83f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
{ pkgs, writeExecline, getBins }:

let
# split

  bins = getBins pkgs.coreutils [ "split" "mktemp" "rm" "rmdir" ]
      // getBins pkgs.lr [ "lr" ]
      // getBins pkgs.xe [ "xe" ]
      // getBins pkgs.qrencode [ "qrencode" ];

  qr-code-props = {
    # second highest redundancy level
    level = "Q";
    # max amount of bytes that level Q can encode
    bytes = "1700";
  };

  # Takes a private GPG key encoded with paperkey on stdin,
  # splits it into pieces into an empty directory that
  # has to be provided via PRIVKEY_TMPDIR,
  # and execs into the block provided as first argument
  # for each qr code image (via stdin).
  print-qr-codes = writeExecline "print-qr-codes" {} [
    "importas" "-ui" "privkey_dir" "PRIVKEY_TMPDIR"
    "cd" "$privkey_dir"
    "if" [
      bins.split
      "--bytes=${qr-code-props.bytes}"
      # paperkey-encoded key comes from stdin
      "-"
    ]
    "pipeline" [ bins.lr "-0" ]
    "forstdin" "-0" "piece"
    "importas" "-iu" "piece" "piece"
    "redirfd" "-r" "0" "$piece"
    "pipeline" [
      bins.qrencode
      "--level=${qr-code-props.level}"
      "--dpi=300"
      "-o-"
    ]
    "$@"
  ];

  print-qr-codes2 = pkgs.writers.writePython "print-qr-codes" {} ''
    import sys

    while True:
      str = sys.stdin.bytes.read(${qr-code-props.bytes})
      if str == "":
        break
      sys.execvl( bins.qrencode
    
  '';

  rm-files-in-directory = writeExecline "rm-files-in-directory" { readNArgs = 1; } [
    "if" [
      "pipeline" [ bins.lr "-0" "-t" "depth==1" "$1" ]
      bins.xe "-0" bins.rm
    ]
    bins.rmdir "$1"
  ];

  test = writeExecline "test12" {} [
    "backtick" "-ni" "PRIVKEY_TMPDIR" [ bins.mktemp "-d" ]
    "importas" "-i" "privdir" "PRIVKEY_TMPDIR"
    "foreground" [ print-qr-codes [ "feh" "-" ] ]
    rm-files-in-directory "$privdir"
  ];


# scanning:
# for i in (seq 0 9); nix-shell -p zbar --run 'scanimage --device=\'fujitsu:ScanSnap iX500:1527308\' --mode=gray --resolution=100 --format=png | zbarimg -Sdisable -Sqrcode.enable --raw - | head --bytes=-1'; end > out

in {
  inherit test;
}