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