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