@@ -22,6 +22,7 @@ import (
22
22
"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm"
23
23
"github.com/ProtonMail/go-crypto/openpgp/packet"
24
24
"github.com/ProtonMail/go-crypto/openpgp/s2k"
25
+ "github.com/ProtonMail/go-crypto/openpgp/symmetric"
25
26
)
26
27
27
28
var hashes = []crypto.Hash {
@@ -2011,3 +2012,222 @@ NciH07RTRuMS/aRhRg4OB8PQROmTnZ+iZS0=
2011
2012
t .Fatal (err )
2012
2013
}
2013
2014
}
2015
+
2016
+ func TestAddHMACSubkey (t * testing.T ) {
2017
+ c := & packet.Config {
2018
+ RSABits : 512 ,
2019
+ Algorithm : packet .ExperimentalPubKeyAlgoHMAC ,
2020
+ }
2021
+
2022
+ entity ,
err := NewEntity (
"Golang Gopher" ,
"Test Key" ,
"[email protected] " ,
& packet.
Config {
RSABits :
1024 })
2023
+ if err != nil {
2024
+ t .Fatal (err )
2025
+ }
2026
+
2027
+ err = entity .AddSigningSubkey (c )
2028
+ if err != nil {
2029
+ t .Fatal (err )
2030
+ }
2031
+
2032
+ buf := bytes .NewBuffer (nil )
2033
+ w , _ := armor .Encode (buf , "PGP PRIVATE KEY BLOCK" , nil )
2034
+ if err := entity .SerializePrivate (w , nil ); err != nil {
2035
+ t .Errorf ("failed to serialize entity: %s" , err )
2036
+ }
2037
+ w .Close ()
2038
+
2039
+ key , err := ReadArmoredKeyRing (buf )
2040
+ if err != nil {
2041
+ t .Error ("could not read keyring" , err )
2042
+ }
2043
+
2044
+ generatedPrivateKey := entity .Subkeys [1 ].PrivateKey .PrivateKey .(* symmetric.HMACPrivateKey )
2045
+ parsedPrivateKey := key [0 ].Subkeys [1 ].PrivateKey .PrivateKey .(* symmetric.HMACPrivateKey )
2046
+
2047
+ generatedPublicKey := entity .Subkeys [1 ].PublicKey .PublicKey .(* symmetric.HMACPublicKey )
2048
+ parsedPublicKey := key [0 ].Subkeys [1 ].PublicKey .PublicKey .(* symmetric.HMACPublicKey )
2049
+
2050
+ if ! bytes .Equal (parsedPrivateKey .Key , generatedPrivateKey .Key ) {
2051
+ t .Error ("parsed wrong key" )
2052
+ }
2053
+ if ! bytes .Equal (parsedPublicKey .Key , generatedPrivateKey .Key ) {
2054
+ t .Error ("parsed wrong key in public part" )
2055
+ }
2056
+ if ! bytes .Equal (generatedPublicKey .Key , generatedPrivateKey .Key ) {
2057
+ t .Error ("generated Public and Private Key differ" )
2058
+ }
2059
+
2060
+ if ! bytes .Equal (parsedPrivateKey .HashSeed [:], generatedPrivateKey .HashSeed [:]) {
2061
+ t .Error ("parsed wrong hash seed" )
2062
+ }
2063
+
2064
+ if parsedPrivateKey .PublicKey .Hash != generatedPrivateKey .PublicKey .Hash {
2065
+ t .Error ("parsed wrong cipher id" )
2066
+ }
2067
+ if ! bytes .Equal (parsedPrivateKey .PublicKey .BindingHash [:], generatedPrivateKey .PublicKey .BindingHash [:]) {
2068
+ t .Error ("parsed wrong binding hash" )
2069
+ }
2070
+ }
2071
+
2072
+ func TestSerializeSymmetricSubkeyError (t * testing.T ) {
2073
+ entity ,
err := NewEntity (
"Golang Gopher" ,
"Test Key" ,
"[email protected] " ,
& packet.
Config {
RSABits :
1024 })
2074
+ if err != nil {
2075
+ t .Fatal (err )
2076
+ }
2077
+
2078
+ buf := bytes .NewBuffer (nil )
2079
+ w , _ := armor .Encode (buf , "PGP PRIVATE KEY BLOCK" , nil )
2080
+
2081
+ entity .PrimaryKey .PubKeyAlgo = 100
2082
+ err = entity .Serialize (w )
2083
+ if err == nil {
2084
+ t .Fatal (err )
2085
+ }
2086
+
2087
+ entity .PrimaryKey .PubKeyAlgo = 101
2088
+ err = entity .Serialize (w )
2089
+ if err == nil {
2090
+ t .Fatal (err )
2091
+ }
2092
+ }
2093
+
2094
+ func TestAddAEADSubkey (t * testing.T ) {
2095
+ c := & packet.Config {
2096
+ RSABits : 512 ,
2097
+ Algorithm : packet .ExperimentalPubKeyAlgoAEAD ,
2098
+ }
2099
+ entity ,
err := NewEntity (
"Golang Gopher" ,
"Test Key" ,
"[email protected] " ,
& packet.
Config {
RSABits :
1024 })
2100
+ if err != nil {
2101
+ t .Fatal (err )
2102
+ }
2103
+
2104
+ err = entity .AddEncryptionSubkey (c )
2105
+ if err != nil {
2106
+ t .Fatal (err )
2107
+ }
2108
+
2109
+ generatedPrivateKey := entity .Subkeys [1 ].PrivateKey .PrivateKey .(* symmetric.AEADPrivateKey )
2110
+
2111
+ buf := bytes .NewBuffer (nil )
2112
+ w , _ := armor .Encode (buf , "PGP PRIVATE KEY BLOCK" , nil )
2113
+ if err := entity .SerializePrivate (w , nil ); err != nil {
2114
+ t .Errorf ("failed to serialize entity: %s" , err )
2115
+ }
2116
+ w .Close ()
2117
+
2118
+ key , err := ReadArmoredKeyRing (buf )
2119
+ if err != nil {
2120
+ t .Error ("could not read keyring" , err )
2121
+ }
2122
+
2123
+ parsedPrivateKey := key [0 ].Subkeys [1 ].PrivateKey .PrivateKey .(* symmetric.AEADPrivateKey )
2124
+
2125
+ generatedPublicKey := entity .Subkeys [1 ].PublicKey .PublicKey .(* symmetric.AEADPublicKey )
2126
+ parsedPublicKey := key [0 ].Subkeys [1 ].PublicKey .PublicKey .(* symmetric.AEADPublicKey )
2127
+
2128
+ if ! bytes .Equal (parsedPrivateKey .Key , generatedPrivateKey .Key ) {
2129
+ t .Error ("parsed wrong key" )
2130
+ }
2131
+ if ! bytes .Equal (parsedPublicKey .Key , generatedPrivateKey .Key ) {
2132
+ t .Error ("parsed wrong key in public part" )
2133
+ }
2134
+ if ! bytes .Equal (generatedPublicKey .Key , generatedPrivateKey .Key ) {
2135
+ t .Error ("generated Public and Private Key differ" )
2136
+ }
2137
+
2138
+ if ! bytes .Equal (parsedPrivateKey .HashSeed [:], generatedPrivateKey .HashSeed [:]) {
2139
+ t .Error ("parsed wrong hash seed" )
2140
+ }
2141
+
2142
+ if parsedPrivateKey .PublicKey .Cipher .Id () != generatedPrivateKey .PublicKey .Cipher .Id () {
2143
+ t .Error ("parsed wrong cipher id" )
2144
+ }
2145
+ if ! bytes .Equal (parsedPrivateKey .PublicKey .BindingHash [:], generatedPrivateKey .PublicKey .BindingHash [:]) {
2146
+ t .Error ("parsed wrong binding hash" )
2147
+ }
2148
+ }
2149
+
2150
+ func TestNoSymmetricKeySerialized (t * testing.T ) {
2151
+ aeadConfig := & packet.Config {
2152
+ RSABits : 512 ,
2153
+ DefaultHash : crypto .SHA512 ,
2154
+ Algorithm : packet .ExperimentalPubKeyAlgoAEAD ,
2155
+ DefaultCipher : packet .CipherAES256 ,
2156
+ }
2157
+ hmacConfig := & packet.Config {
2158
+ RSABits : 512 ,
2159
+ DefaultHash : crypto .SHA512 ,
2160
+ Algorithm : packet .ExperimentalPubKeyAlgoHMAC ,
2161
+ DefaultCipher : packet .CipherAES256 ,
2162
+ }
2163
+ entity ,
err := NewEntity (
"Golang Gopher" ,
"Test Key" ,
"[email protected] " ,
& packet.
Config {
RSABits :
1024 })
2164
+ if err != nil {
2165
+ t .Fatal (err )
2166
+ }
2167
+
2168
+ err = entity .AddEncryptionSubkey (aeadConfig )
2169
+ if err != nil {
2170
+ t .Fatal (err )
2171
+ }
2172
+ err = entity .AddSigningSubkey (hmacConfig )
2173
+ if err != nil {
2174
+ t .Fatal (err )
2175
+ }
2176
+
2177
+ w := bytes .NewBuffer (nil )
2178
+ entity .Serialize (w )
2179
+
2180
+ firstSymKey := entity .Subkeys [1 ].PrivateKey .PrivateKey .(* symmetric.AEADPrivateKey ).Key
2181
+ i := bytes .Index (w .Bytes (), firstSymKey )
2182
+
2183
+ secondSymKey := entity .Subkeys [2 ].PrivateKey .PrivateKey .(* symmetric.HMACPrivateKey ).Key
2184
+ k := bytes .Index (w .Bytes (), secondSymKey )
2185
+
2186
+ if (i > 0 ) || (k > 0 ) {
2187
+ t .Error ("Private key was serialized with public" )
2188
+ }
2189
+
2190
+ firstBindingHash := entity .Subkeys [1 ].PublicKey .PublicKey .(* symmetric.AEADPublicKey ).BindingHash
2191
+ i = bytes .Index (w .Bytes (), firstBindingHash [:])
2192
+
2193
+ secondBindingHash := entity .Subkeys [2 ].PublicKey .PublicKey .(* symmetric.HMACPublicKey ).BindingHash
2194
+ k = bytes .Index (w .Bytes (), secondBindingHash [:])
2195
+ if (i > 0 ) || (k > 0 ) {
2196
+ t .Errorf ("Symmetric public key metadata exported %d %d" , i , k )
2197
+ }
2198
+
2199
+ }
2200
+
2201
+ func TestSymmetricKeys (t * testing.T ) {
2202
+ data := `-----BEGIN PGP PRIVATE KEY BLOCK-----
2203
+
2204
+ xWoEYs7w5mUIcFvlmkuricX26x138uvHGlwIaxWIbRnx1+ggPcveTcwA4zSZ
2205
+ n6XcD0Q5aLe6dTEBwCyfUecZ/nA0W8Pl9xBHfjIjQuxcUBnIqxZ061RZPjef
2206
+ D/XIQga1ftLDelhylQwL7R3TzQ1TeW1tZXRyaWMgS2V5wmkEEGUIAB0FAmLO
2207
+ 8OYECwkHCAMVCAoEFgACAQIZAQIbAwIeAQAhCRCRTKq2ObiQKxYhBMHTTXXF
2208
+ ULQ2M2bYNJFMqrY5uJArIawgJ+5RSsN8VNuZTKJbG88TIedU05wwKjW3wqvT
2209
+ X6Z7yfbHagRizvDmZAluL/kJo6hZ1kFENpQkWD/Kfv1vAG3nbxhsVEzBQ6a1
2210
+ OAD24BaKJz6gWgj4lASUNK5OuXnLc3J79Bt1iRGkSbiPzRs/bplB4TwbILeC
2211
+ ZLeDy9kngZDosgsIk5sBgGEqS9y5HiHCVQQYZQgACQUCYs7w5gIbDAAhCRCR
2212
+ TKq2ObiQKxYhBMHTTXXFULQ2M2bYNJFMqrY5uJArENkgL0Bc+OI/1na0XWqB
2213
+ TxGVotQ4A/0u0VbOMEUfnrI8Fms=
2214
+ =RdCW
2215
+ -----END PGP PRIVATE KEY BLOCK-----
2216
+ `
2217
+ keys , err := ReadArmoredKeyRing (strings .NewReader (data ))
2218
+ if err != nil {
2219
+ t .Fatal (err )
2220
+ }
2221
+ if len (keys ) != 1 {
2222
+ t .Errorf ("Expected 1 symmetric key, got %d" , len (keys ))
2223
+ }
2224
+ if keys [0 ].PrivateKey .PubKeyAlgo != packet .ExperimentalPubKeyAlgoHMAC {
2225
+ t .Errorf ("Expected HMAC primary key" )
2226
+ }
2227
+ if len (keys [0 ].Subkeys ) != 1 {
2228
+ t .Errorf ("Expected 1 symmetric subkey, got %d" , len (keys [0 ].Subkeys ))
2229
+ }
2230
+ if keys [0 ].Subkeys [0 ].PrivateKey .PubKeyAlgo != packet .ExperimentalPubKeyAlgoAEAD {
2231
+ t .Errorf ("Expected AEAD subkey" )
2232
+ }
2233
+ }
0 commit comments