...

Source file src/github.com/ProtonMail/go-crypto/openpgp/keys_v5_test.go

Documentation: github.com/ProtonMail/go-crypto/openpgp

     1  package openpgp
     2  
     3  import (
     4  	"bytes"
     5  	"io/ioutil"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/ProtonMail/go-crypto/openpgp/armor"
    10  	"github.com/ProtonMail/go-crypto/openpgp/packet"
    11  )
    12  
    13  var foreignKeys = []string{
    14  	v5PrivKey,
    15  }
    16  
    17  func TestReadPrivateForeignV5Key(t *testing.T) {
    18  	for _, str := range foreignKeys {
    19  		kring, err := ReadArmoredKeyRing(strings.NewReader(str))
    20  		if err != nil {
    21  			t.Fatal(err)
    22  		}
    23  		checkV5Key(t, kring[0])
    24  	}
    25  }
    26  
    27  // TODO: Replace message with a correctly generated one.
    28  func testV5ForeignSignedMessage(t *testing.T) {
    29  	kring, err := ReadArmoredKeyRing(strings.NewReader(v5PrivKey))
    30  	if err != nil {
    31  		t.Fatal(err)
    32  	}
    33  	msg := strings.NewReader(v5PrivKeyMsg)
    34  	// Unarmor
    35  	block, err := armor.Decode(msg)
    36  	if err != nil {
    37  		return
    38  	}
    39  	md, err := ReadMessage(block.Body, kring, nil, nil)
    40  	if md.SignedBy == nil {
    41  		t.Fatal("incorrect signer")
    42  	}
    43  	if err != nil {
    44  		t.Fatal(err)
    45  	}
    46  	// Consume UnverifiedBody
    47  	body, err := ioutil.ReadAll(md.UnverifiedBody)
    48  	if err != nil {
    49  		t.Fatal(err)
    50  	}
    51  	if !bytes.Equal(body, []byte("test")) {
    52  		t.Fatal("bad body")
    53  	}
    54  	if md.SignatureError != nil {
    55  		t.Fatal(md.SignatureError)
    56  	}
    57  	if err != nil {
    58  		t.Fatal(err)
    59  	}
    60  }
    61  
    62  func TestReadPrivateEncryptedV5Key(t *testing.T) {
    63  	c := &packet.Config{V5Keys: true}
    64  	e, err := NewEntity("V5 Key Owner", "V5 Key", "v5@pm.me", c)
    65  	if err != nil {
    66  		t.Fatal(err)
    67  	}
    68  	password := []byte("test v5 key # password")
    69  	// Encrypt private key
    70  	if err = e.PrivateKey.Encrypt(password); err != nil {
    71  		t.Fatal(err)
    72  	}
    73  	// Encrypt subkeys
    74  	for _, sub := range e.Subkeys {
    75  		if err = sub.PrivateKey.Encrypt(password); err != nil {
    76  			t.Fatal(err)
    77  		}
    78  	}
    79  	// Serialize, Read
    80  	serializedEntity := bytes.NewBuffer(nil)
    81  	err = e.SerializePrivateWithoutSigning(serializedEntity, nil)
    82  	if err != nil {
    83  		t.Fatal(err)
    84  	}
    85  	el, err := ReadKeyRing(serializedEntity)
    86  	if err != nil {
    87  		t.Fatal(err)
    88  	}
    89  
    90  	// Decrypt
    91  	if el[0].PrivateKey == nil {
    92  		t.Fatal("No private key found")
    93  	}
    94  	if err = el[0].PrivateKey.Decrypt(password); err != nil {
    95  		t.Error(err)
    96  	}
    97  
    98  	// Decrypt subkeys
    99  	for _, sub := range e.Subkeys {
   100  		if err = sub.PrivateKey.Decrypt(password); err != nil {
   101  			t.Error(err)
   102  		}
   103  	}
   104  
   105  	checkV5Key(t, el[0])
   106  }
   107  
   108  func TestReadPrivateSerializeForeignV5Key(t *testing.T) {
   109  	for _, str := range foreignKeys {
   110  		el, err := ReadArmoredKeyRing(strings.NewReader(str))
   111  		if err != nil {
   112  			t.Fatal(err)
   113  		}
   114  		checkSerializeRead(t, el[0])
   115  	}
   116  }
   117  
   118  func TestNewEntitySerializeV5Key(t *testing.T) {
   119  	c := &packet.Config{V5Keys: true}
   120  	e, err := NewEntity("V5 Key Owner", "V5 Key", "v5@pm.me", c)
   121  	if err != nil {
   122  		t.Fatal(err)
   123  	}
   124  	checkSerializeRead(t, e)
   125  }
   126  
   127  func TestNewEntityV5Key(t *testing.T) {
   128  	c := &packet.Config{
   129  		V5Keys: true,
   130  	}
   131  	e, err := NewEntity("V5 Key Owner", "V5 Key", "v5@pm.me", c)
   132  	if err != nil {
   133  		t.Fatal(err)
   134  	}
   135  	checkV5Key(t, e)
   136  }
   137  
   138  func checkV5Key(t *testing.T, ent *Entity) {
   139  	key := ent.PrimaryKey
   140  	if key.Version != 5 {
   141  		t.Errorf("wrong key version %d", key.Version)
   142  	}
   143  	if len(key.Fingerprint) != 32 {
   144  		t.Errorf("Wrong fingerprint length: %d", len(key.Fingerprint))
   145  	}
   146  	signatures := ent.Revocations
   147  	for _, id := range ent.Identities {
   148  		signatures = append(signatures, id.SelfSignature)
   149  		signatures = append(signatures, id.Signatures...)
   150  	}
   151  	for _, sig := range signatures {
   152  		if sig == nil {
   153  			continue
   154  		}
   155  		if sig.Version != 5 {
   156  			t.Errorf("wrong signature version %d", sig.Version)
   157  		}
   158  		fgptLen := len(sig.IssuerFingerprint)
   159  		if fgptLen != 32 {
   160  			t.Errorf("Wrong fingerprint length in signature: %d", fgptLen)
   161  		}
   162  	}
   163  }
   164  
   165  func checkSerializeRead(t *testing.T, e *Entity) {
   166  	// Entity serialize
   167  	serializedEntity := bytes.NewBuffer(nil)
   168  	err := e.Serialize(serializedEntity)
   169  	if err != nil {
   170  		t.Fatal(err)
   171  	}
   172  	el, err := ReadKeyRing(serializedEntity)
   173  	if err != nil {
   174  		t.Fatal(err)
   175  	}
   176  	checkV5Key(t, el[0])
   177  
   178  	// Without signing
   179  	serializedEntity = bytes.NewBuffer(nil)
   180  	err = e.SerializePrivateWithoutSigning(serializedEntity, nil)
   181  	if err != nil {
   182  		t.Fatal(err)
   183  	}
   184  	el, err = ReadKeyRing(serializedEntity)
   185  	if err != nil {
   186  		t.Fatal(err)
   187  	}
   188  	checkV5Key(t, el[0])
   189  
   190  	// Private
   191  	serializedEntity = bytes.NewBuffer(nil)
   192  	err = e.SerializePrivate(serializedEntity, nil)
   193  	if err != nil {
   194  		t.Fatal(err)
   195  	}
   196  	el, err = ReadKeyRing(serializedEntity)
   197  	if err != nil {
   198  		t.Fatal(err)
   199  	}
   200  	checkV5Key(t, el[0])
   201  }
   202  

View as plain text