github.com/Lephar/snapd@v0.0.0-20210825215435-c7fba9cef4d2/asserts/assertstest/assertstest_test.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2016 Canonical Ltd 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 3 as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 * 18 */ 19 20 package assertstest_test 21 22 import ( 23 "encoding/hex" 24 "testing" 25 "time" 26 27 "golang.org/x/crypto/openpgp/packet" 28 . "gopkg.in/check.v1" 29 30 "github.com/snapcore/snapd/asserts" 31 "github.com/snapcore/snapd/asserts/assertstest" 32 ) 33 34 func TestAssertsTest(t *testing.T) { TestingT(t) } 35 36 type helperSuite struct{} 37 38 var _ = Suite(&helperSuite{}) 39 40 func (s *helperSuite) TestReadPrivKeyArmored(c *C) { 41 pk, rsaPrivKey := assertstest.ReadPrivKey(assertstest.DevKey) 42 c.Check(pk, NotNil) 43 c.Check(rsaPrivKey, NotNil) 44 c.Check(pk.PublicKey().ID(), Equals, assertstest.DevKeyID) 45 pkt := packet.NewRSAPrivateKey(time.Date(2016, time.January, 1, 0, 0, 0, 0, time.UTC), rsaPrivKey) 46 c.Check(hex.EncodeToString(pkt.Fingerprint[:]), Equals, assertstest.DevKeyPGPFingerprint) 47 } 48 49 const ( 50 base64PrivKey = ` 51 xcLYBFaU5cgBCAC/2wUYK7YzvL6f0ZxBfptFVfNmI7G9J9Eszdoq1NZZXaV+aYeC7eNU 52 1sKdO6wIRcw3lvybtq5W1n4D/jJAb2qXbB6BukuCGVXCLMEUdvheaVVcIZ/LwdbxmgMJsDFoHsDC 53 RzjkUVTU2b8sK6MwANIsSS5r8Lwm7FazD1qq50UdebsIx8dkjFR5VwrCYgOu1MO2Bqka7UU9as2q 54 4ZsFzpcS/so41kd4IPFEmNMlejhSjgCaixehpLeXypQVHLluV+oSPMV7GtE7Z6HO4V5cT2c9RdXg 55 l4jSKY91rHInkmSizF03laL3T/I6oj0FdZG9GB6QzqRCBTzK05cnVP1k7WFJABEBAAEAB/9spiIa 56 cBa88fSaGWB+Dq7r8yLmAuzTDEt/LgyRGPtSnJ/uGOEvGn0VPJH17ScdgDmIea8Ql8HfV5UBueDH 57 cNFSc15LZS8BvEs+rY2ig0VgYhJ/HGOcRmftZqS1xdwU9OWAoEjts8lwyOdkoknGE5Dyl3b8ldZX 58 zJvEx7s28cXITH4UwGEAMHEXrAMCjkcKPVbM7vW81uOWn0U1jMzmfmqrcLkSfvaCnep6+4QphKPy 59 B4DxJAI34EvJAru4iL5bWWvMeXkBZgmBy4g2SlYbk09cfTmhzw6di5GZtg+77yGACltPBA8MSbzF 60 v30apQ5iuI/hVin7U2/QtQHP4d0zUDbpBADusynnaFcDnPEUm4RdvNpujaBC/HfIpOstiS36RZy8 61 lZeVtffa/+DqzodZD9YF7zEVWeUiC5Os4THirYOZ04dM5yqR/GlKXMHGHaT+mnhD8g1hORx/LrMO 62 k5wUpD1NmloSjP/0pJRccuXq7O1QQfls1Hq1vOSh3cZ/aIvTONJ/YwQAzcK0/2SrnaUc3oCxMEuI 63 2FX0LsYDQiXzMK/x/lfZ/ywxt5J/q6CuaG3xXgSHlsk0M8Uo4acZqpCIFA9mwCPxKbrIOGnwJsI/ 64 +sZBkngtZMSS88Vl32gnzpVWLGpbW2F7hnWrj1YigTcFUdi6TFNa7zHPASzCKxKKiz9YxEWWymME 65 AIbURnQJJOSfYgFyloQuA2QWyAK5Zu7qPworBoRo+PZPVb5yQmSUQ21VqNfzqIJz1EgiDZ0NyGid 66 uXAjn58O9tAq7IN5pTeHoTacZ75cI82kQkUxEnfiKjBO/AU30Y3COsIXhtbIXbtcitHSicp4lnpU 67 NejDkxUnC2wIvJzHWo1FQ18= 68 ` 69 ) 70 71 func (s *helperSuite) TestReadPrivKeyUnarmored(c *C) { 72 pk, rsaPrivKey := assertstest.ReadPrivKey(base64PrivKey) 73 c.Check(pk, NotNil) 74 c.Check(rsaPrivKey, NotNil) 75 } 76 77 func (s *helperSuite) TestStoreStack(c *C) { 78 store := assertstest.NewStoreStack("super", nil) 79 80 c.Check(store.TrustedAccount.AccountID(), Equals, "super") 81 c.Check(store.TrustedAccount.Validation(), Equals, "verified") 82 83 c.Check(store.TrustedKey.AccountID(), Equals, "super") 84 c.Check(store.TrustedKey.Name(), Equals, "root") 85 86 c.Check(store.GenericAccount.AccountID(), Equals, "generic") 87 c.Check(store.GenericAccount.Validation(), Equals, "verified") 88 89 db, err := asserts.OpenDatabase(&asserts.DatabaseConfig{ 90 Backstore: asserts.NewMemoryBackstore(), 91 Trusted: store.Trusted, 92 OtherPredefined: store.Generic, 93 }) 94 c.Assert(err, IsNil) 95 96 storeAccKey := store.StoreAccountKey("") 97 c.Assert(storeAccKey, NotNil) 98 99 c.Check(storeAccKey.AccountID(), Equals, "super") 100 c.Check(storeAccKey.AccountID(), Equals, store.AuthorityID) 101 c.Check(storeAccKey.PublicKeyID(), Equals, store.KeyID) 102 c.Check(storeAccKey.Name(), Equals, "store") 103 104 c.Check(store.GenericKey.AccountID(), Equals, "generic") 105 c.Check(store.GenericKey.Name(), Equals, "serials") 106 107 c.Check(store.GenericModelsKey.AccountID(), Equals, "generic") 108 c.Check(store.GenericModelsKey.Name(), Equals, "models") 109 110 g, err := store.Find(asserts.AccountType, map[string]string{ 111 "account-id": "generic", 112 }) 113 c.Assert(err, IsNil) 114 c.Assert(g.Headers(), DeepEquals, store.GenericAccount.Headers()) 115 116 g, err = store.Find(asserts.AccountKeyType, map[string]string{ 117 "public-key-sha3-384": store.GenericKey.PublicKeyID(), 118 }) 119 c.Assert(err, IsNil) 120 c.Assert(g.Headers(), DeepEquals, store.GenericKey.Headers()) 121 122 g, err = store.Find(asserts.AccountKeyType, map[string]string{ 123 "public-key-sha3-384": store.GenericModelsKey.PublicKeyID(), 124 }) 125 c.Assert(err, IsNil) 126 c.Assert(g.Headers(), DeepEquals, store.GenericModelsKey.Headers()) 127 128 acct := assertstest.NewAccount(store, "devel1", nil, "") 129 c.Check(acct.Username(), Equals, "devel1") 130 c.Check(acct.AccountID(), HasLen, 32) 131 c.Check(acct.Validation(), Equals, "unproven") 132 133 err = db.Add(storeAccKey) 134 c.Assert(err, IsNil) 135 136 err = db.Add(acct) 137 c.Assert(err, IsNil) 138 139 devKey, _ := assertstest.GenerateKey(752) 140 141 acctKey := assertstest.NewAccountKey(store, acct, nil, devKey.PublicKey(), "") 142 143 err = db.Add(acctKey) 144 c.Assert(err, IsNil) 145 146 c.Check(acctKey.Name(), Equals, "default") 147 148 a, err := db.Find(asserts.AccountType, map[string]string{ 149 "account-id": "generic", 150 }) 151 c.Assert(err, IsNil) 152 c.Assert(a.Headers(), DeepEquals, store.GenericAccount.Headers()) 153 154 c.Check(store.GenericClassicModel.AuthorityID(), Equals, "generic") 155 c.Check(store.GenericClassicModel.BrandID(), Equals, "generic") 156 c.Check(store.GenericClassicModel.Model(), Equals, "generic-classic") 157 c.Check(store.GenericClassicModel.Classic(), Equals, true) 158 err = db.Check(store.GenericClassicModel) 159 c.Assert(err, IsNil) 160 161 err = db.Add(store.GenericKey) 162 c.Assert(err, IsNil) 163 } 164 165 func (s *helperSuite) TestSigningAccounts(c *C) { 166 brandKey, _ := assertstest.GenerateKey(752) 167 168 store := assertstest.NewStoreStack("super", nil) 169 170 sa := assertstest.NewSigningAccounts(store) 171 sa.Register("my-brand", brandKey, map[string]interface{}{ 172 "validation": "verified", 173 }) 174 175 acct := sa.Account("my-brand") 176 c.Check(acct.Username(), Equals, "my-brand") 177 c.Check(acct.Validation(), Equals, "verified") 178 179 c.Check(sa.AccountKey("my-brand").PublicKeyID(), Equals, brandKey.PublicKey().ID()) 180 181 c.Check(sa.PublicKey("my-brand").ID(), Equals, brandKey.PublicKey().ID()) 182 183 model := sa.Model("my-brand", "my-model", map[string]interface{}{ 184 "classic": "true", 185 }) 186 c.Check(model.BrandID(), Equals, "my-brand") 187 c.Check(model.Model(), Equals, "my-model") 188 c.Check(model.Classic(), Equals, true) 189 190 // can also sign models for store account-id 191 model = sa.Model("super", "pc", map[string]interface{}{ 192 "classic": "true", 193 }) 194 c.Check(model.BrandID(), Equals, "super") 195 c.Check(model.Model(), Equals, "pc") 196 } 197 198 func (s *helperSuite) TestSigningAccountsAccountsAndKeysPlusAddMany(c *C) { 199 brandKey, _ := assertstest.GenerateKey(752) 200 201 store := assertstest.NewStoreStack("super", nil) 202 203 sa := assertstest.NewSigningAccounts(store) 204 sa.Register("my-brand", brandKey, map[string]interface{}{ 205 "validation": "verified", 206 }) 207 208 db, err := asserts.OpenDatabase(&asserts.DatabaseConfig{ 209 Backstore: asserts.NewMemoryBackstore(), 210 Trusted: store.Trusted, 211 }) 212 c.Assert(err, IsNil) 213 err = db.Add(store.StoreAccountKey("")) 214 c.Assert(err, IsNil) 215 216 assertstest.AddMany(db, sa.AccountsAndKeys("my-brand")...) 217 as, err := db.FindMany(asserts.AccountKeyType, map[string]string{ 218 "account-id": "my-brand", 219 }) 220 c.Check(err, IsNil) 221 c.Check(as, HasLen, 1) 222 223 // idempotent 224 assertstest.AddMany(db, sa.AccountsAndKeys("my-brand")...) 225 }