| // Copyright 2011 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package packet |
| |
| import ( |
| "bytes" |
| "encoding/hex" |
| "io" |
| "io/ioutil" |
| "testing" |
| ) |
| |
| func TestSymmetricKeyEncrypted(t *testing.T) { |
| buf := readerFromHex(symmetricallyEncryptedHex) |
| packet, err := Read(buf) |
| if err != nil { |
| t.Errorf("failed to read SymmetricKeyEncrypted: %s", err) |
| return |
| } |
| ske, ok := packet.(*SymmetricKeyEncrypted) |
| if !ok { |
| t.Error("didn't find SymmetricKeyEncrypted packet") |
| return |
| } |
| key, cipherFunc, err := ske.Decrypt([]byte("password")) |
| if err != nil { |
| t.Error(err) |
| return |
| } |
| |
| packet, err = Read(buf) |
| if err != nil { |
| t.Errorf("failed to read SymmetricallyEncrypted: %s", err) |
| return |
| } |
| se, ok := packet.(*SymmetricallyEncrypted) |
| if !ok { |
| t.Error("didn't find SymmetricallyEncrypted packet") |
| return |
| } |
| r, err := se.Decrypt(cipherFunc, key) |
| if err != nil { |
| t.Error(err) |
| return |
| } |
| |
| contents, err := ioutil.ReadAll(r) |
| if err != nil && err != io.EOF { |
| t.Error(err) |
| return |
| } |
| |
| expectedContents, _ := hex.DecodeString(symmetricallyEncryptedContentsHex) |
| if !bytes.Equal(expectedContents, contents) { |
| t.Errorf("bad contents got:%x want:%x", contents, expectedContents) |
| } |
| } |
| |
| const symmetricallyEncryptedHex = "8c0d04030302371a0b38d884f02060c91cf97c9973b8e58e028e9501708ccfe618fb92afef7fa2d80ddadd93cf" |
| const symmetricallyEncryptedContentsHex = "cb1062004d14c4df636f6e74656e74732e0a" |
| |
| func TestSerializeSymmetricKeyEncryptedCiphers(t *testing.T) { |
| tests := [...]struct { |
| cipherFunc CipherFunction |
| name string |
| }{ |
| {Cipher3DES, "Cipher3DES"}, |
| {CipherCAST5, "CipherCAST5"}, |
| {CipherAES128, "CipherAES128"}, |
| {CipherAES192, "CipherAES192"}, |
| {CipherAES256, "CipherAES256"}, |
| } |
| |
| for _, test := range tests { |
| var buf bytes.Buffer |
| passphrase := []byte("testing") |
| config := &Config{ |
| DefaultCipher: test.cipherFunc, |
| } |
| |
| key, err := SerializeSymmetricKeyEncrypted(&buf, passphrase, config) |
| if err != nil { |
| t.Errorf("cipher(%s) failed to serialize: %s", test.name, err) |
| continue |
| } |
| |
| p, err := Read(&buf) |
| if err != nil { |
| t.Errorf("cipher(%s) failed to reparse: %s", test.name, err) |
| continue |
| } |
| |
| ske, ok := p.(*SymmetricKeyEncrypted) |
| if !ok { |
| t.Errorf("cipher(%s) parsed a different packet type: %#v", test.name, p) |
| continue |
| } |
| |
| if ske.CipherFunc != config.DefaultCipher { |
| t.Errorf("cipher(%s) SKE cipher function is %d (expected %d)", test.name, ske.CipherFunc, config.DefaultCipher) |
| } |
| parsedKey, parsedCipherFunc, err := ske.Decrypt(passphrase) |
| if err != nil { |
| t.Errorf("cipher(%s) failed to decrypt reparsed SKE: %s", test.name, err) |
| continue |
| } |
| if !bytes.Equal(key, parsedKey) { |
| t.Errorf("cipher(%s) keys don't match after Decrypt: %x (original) vs %x (parsed)", test.name, key, parsedKey) |
| } |
| if parsedCipherFunc != test.cipherFunc { |
| t.Errorf("cipher(%s) cipher function doesn't match after Decrypt: %d (original) vs %d (parsed)", |
| test.name, test.cipherFunc, parsedCipherFunc) |
| } |
| } |
| } |