No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

147 líneas
4.3 KiB

  1. // Copyright 2011 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package packet
  5. import (
  6. "bytes"
  7. "crypto/rsa"
  8. "encoding/hex"
  9. "fmt"
  10. "math/big"
  11. "testing"
  12. )
  13. func bigFromBase10(s string) *big.Int {
  14. b, ok := new(big.Int).SetString(s, 10)
  15. if !ok {
  16. panic("bigFromBase10 failed")
  17. }
  18. return b
  19. }
  20. var encryptedKeyPub = rsa.PublicKey{
  21. E: 65537,
  22. N: bigFromBase10("115804063926007623305902631768113868327816898845124614648849934718568541074358183759250136204762053879858102352159854352727097033322663029387610959884180306668628526686121021235757016368038585212410610742029286439607686208110250133174279811431933746643015923132833417396844716207301518956640020862630546868823"),
  23. }
  24. var encryptedKeyRSAPriv = &rsa.PrivateKey{
  25. PublicKey: encryptedKeyPub,
  26. D: bigFromBase10("32355588668219869544751561565313228297765464314098552250409557267371233892496951383426602439009993875125222579159850054973310859166139474359774543943714622292329487391199285040721944491839695981199720170366763547754915493640685849961780092241140181198779299712578774460837139360803883139311171713302987058393"),
  27. }
  28. var encryptedKeyPriv = &PrivateKey{
  29. PublicKey: PublicKey{
  30. PubKeyAlgo: PubKeyAlgoRSA,
  31. },
  32. PrivateKey: encryptedKeyRSAPriv,
  33. }
  34. func TestDecryptingEncryptedKey(t *testing.T) {
  35. const encryptedKeyHex = "c18c032a67d68660df41c70104005789d0de26b6a50c985a02a13131ca829c413a35d0e6fa8d6842599252162808ac7439c72151c8c6183e76923fe3299301414d0c25a2f06a2257db3839e7df0ec964773f6e4c4ac7ff3b48c444237166dd46ba8ff443a5410dc670cb486672fdbe7c9dfafb75b4fea83af3a204fe2a7dfa86bd20122b4f3d2646cbeecb8f7be8"
  36. const expectedKeyHex = "d930363f7e0308c333b9618617ea728963d8df993665ae7be1092d4926fd864b"
  37. p, err := Read(readerFromHex(encryptedKeyHex))
  38. if err != nil {
  39. t.Errorf("error from Read: %s", err)
  40. return
  41. }
  42. ek, ok := p.(*EncryptedKey)
  43. if !ok {
  44. t.Errorf("didn't parse an EncryptedKey, got %#v", p)
  45. return
  46. }
  47. if ek.KeyId != 0x2a67d68660df41c7 || ek.Algo != PubKeyAlgoRSA {
  48. t.Errorf("unexpected EncryptedKey contents: %#v", ek)
  49. return
  50. }
  51. err = ek.Decrypt(encryptedKeyPriv, nil)
  52. if err != nil {
  53. t.Errorf("error from Decrypt: %s", err)
  54. return
  55. }
  56. if ek.CipherFunc != CipherAES256 {
  57. t.Errorf("unexpected EncryptedKey contents: %#v", ek)
  58. return
  59. }
  60. keyHex := fmt.Sprintf("%x", ek.Key)
  61. if keyHex != expectedKeyHex {
  62. t.Errorf("bad key, got %s want %x", keyHex, expectedKeyHex)
  63. }
  64. }
  65. func TestEncryptingEncryptedKey(t *testing.T) {
  66. key := []byte{1, 2, 3, 4}
  67. const expectedKeyHex = "01020304"
  68. const keyId = 42
  69. pub := &PublicKey{
  70. PublicKey: &encryptedKeyPub,
  71. KeyId: keyId,
  72. PubKeyAlgo: PubKeyAlgoRSAEncryptOnly,
  73. }
  74. buf := new(bytes.Buffer)
  75. err := SerializeEncryptedKey(buf, pub, CipherAES128, key, nil)
  76. if err != nil {
  77. t.Errorf("error writing encrypted key packet: %s", err)
  78. }
  79. p, err := Read(buf)
  80. if err != nil {
  81. t.Errorf("error from Read: %s", err)
  82. return
  83. }
  84. ek, ok := p.(*EncryptedKey)
  85. if !ok {
  86. t.Errorf("didn't parse an EncryptedKey, got %#v", p)
  87. return
  88. }
  89. if ek.KeyId != keyId || ek.Algo != PubKeyAlgoRSAEncryptOnly {
  90. t.Errorf("unexpected EncryptedKey contents: %#v", ek)
  91. return
  92. }
  93. err = ek.Decrypt(encryptedKeyPriv, nil)
  94. if err != nil {
  95. t.Errorf("error from Decrypt: %s", err)
  96. return
  97. }
  98. if ek.CipherFunc != CipherAES128 {
  99. t.Errorf("unexpected EncryptedKey contents: %#v", ek)
  100. return
  101. }
  102. keyHex := fmt.Sprintf("%x", ek.Key)
  103. if keyHex != expectedKeyHex {
  104. t.Errorf("bad key, got %s want %x", keyHex, expectedKeyHex)
  105. }
  106. }
  107. func TestSerializingEncryptedKey(t *testing.T) {
  108. const encryptedKeyHex = "c18c032a67d68660df41c70104005789d0de26b6a50c985a02a13131ca829c413a35d0e6fa8d6842599252162808ac7439c72151c8c6183e76923fe3299301414d0c25a2f06a2257db3839e7df0ec964773f6e4c4ac7ff3b48c444237166dd46ba8ff443a5410dc670cb486672fdbe7c9dfafb75b4fea83af3a204fe2a7dfa86bd20122b4f3d2646cbeecb8f7be8"
  109. p, err := Read(readerFromHex(encryptedKeyHex))
  110. if err != nil {
  111. t.Fatalf("error from Read: %s", err)
  112. }
  113. ek, ok := p.(*EncryptedKey)
  114. if !ok {
  115. t.Fatalf("didn't parse an EncryptedKey, got %#v", p)
  116. }
  117. var buf bytes.Buffer
  118. ek.Serialize(&buf)
  119. if bufHex := hex.EncodeToString(buf.Bytes()); bufHex != encryptedKeyHex {
  120. t.Fatalf("serialization of encrypted key differed from original. Original was %s, but reserialized as %s", encryptedKeyHex, bufHex)
  121. }
  122. }