1// Copyright 2015 Keybase, Inc. All rights reserved. Use of
2// this source code is governed by the included BSD license.
3
4package engine
5
6import (
7	"bytes"
8	"io/ioutil"
9	"testing"
10
11	"github.com/keybase/client/go/libkb"
12	keybase1 "github.com/keybase/client/go/protocol/keybase1"
13)
14
15type signTest struct {
16	name  string
17	input string
18}
19
20var signTests = []signTest{
21	{name: "john hancock", input: "When in the Course of human events, it becomes necessary for one people to dissolve the political bands"},
22	{name: "empty", input: ""},
23}
24
25// Test pgp sign attached.
26func TestPGPSign(t *testing.T) {
27	tc := SetupEngineTest(t, "pgp_sign")
28	defer tc.Cleanup()
29	fu := createFakeUserWithPGPSibkeyPushed(tc)
30
31	if err := fu.LoadUser(tc); err != nil {
32		t.Fatal(err)
33	}
34
35	if fu.User == nil {
36		t.Fatal("got a nil User")
37	}
38
39	m := libkb.NewMetaContextForTest(tc)
40
41	skb, err := fu.User.GetSyncedSecretKey(m)
42	if err != nil {
43		t.Fatal(err)
44	}
45
46	if skb == nil {
47		t.Fatalf("skb is nil")
48	}
49
50	key, err := skb.GetPubKey()
51	if err != nil {
52		t.Fatal(err)
53	}
54
55	for _, test := range signTests {
56		var sink bytes.Buffer
57
58		earg := PGPSignArg{
59			Sink:   libkb.NopWriteCloser{W: &sink},
60			Source: ioutil.NopCloser(bytes.NewBufferString(test.input)),
61			Opts: keybase1.PGPSignOptions{
62				Mode: keybase1.SignMode_ATTACHED,
63			},
64		}
65
66		eng := NewPGPSignEngine(tc.G, &earg)
67		uis := libkb.UIs{
68			PgpUI:    &TestPgpUI{},
69			SecretUI: fu.NewSecretUI(),
70		}
71
72		m := NewMetaContextForTest(tc).WithUIs(uis)
73		err = RunEngine2(m, eng)
74		if err != nil {
75			t.Errorf("%s: run error: %s", test.name, err)
76			continue
77		}
78
79		sig := sink.String()
80
81		_, err = key.VerifyString(tc.G.Log, sig, []byte(test.input))
82		if err != nil {
83			t.Errorf("%s: verify error: %s", test.name, err)
84			continue
85		}
86	}
87}
88