1// Copyright (C) 2019 Storj Labs, Inc. 2// See LICENSE for copying information 3 4package testidentity 5 6import ( 7 "errors" 8 9 "storj.io/common/identity" 10 "storj.io/common/storj" 11) 12 13//go:generate go run gen_identities.go -version 0 -count 150 -out V0_identities_table.go 14//go:generate go run gen_identities.go -signed -version 0 -count 150 -out V0_signed_identities_table.go 15 16var ( 17 // IdentityVersions holds pregenerated identities for each/ identity version. 18 IdentityVersions = VersionedIdentitiesMap{ 19 storj.V0: pregeneratedV0Identities, 20 } 21 22 // SignedIdentityVersions holds pregenerated, signed identities for each 23 // identity version. 24 SignedIdentityVersions = VersionedIdentitiesMap{ 25 storj.V0: pregeneratedV0SignedIdentities, 26 } 27 28 // SignerVersions holds certificate authorities for each identity version. 29 SignerVersions = VersionedCertificateAuthorityMap{ 30 storj.V0: pregeneratedV0Signer, 31 } 32) 33 34// VersionedIdentitiesMap maps a `storj.IDVersionNumber` to a set of 35// pregenerated identities with the corresponding version. 36type VersionedIdentitiesMap map[storj.IDVersionNumber]*Identities 37 38// VersionedCertificateAuthorityMap maps a `storj.IDVersionNumber` to a set of 39// pregenerated certificate authorities used for signing the corresponding 40// version of signed identities. 41type VersionedCertificateAuthorityMap map[storj.IDVersionNumber]*identity.FullCertificateAuthority 42 43// Identities is a pregenerated full identity table. 44type Identities struct { 45 list []*identity.FullIdentity 46 next int 47} 48 49// NewIdentities creates a new table from provided identities. 50func NewIdentities(list ...*identity.FullIdentity) *Identities { 51 return &Identities{ 52 list: list, 53 next: 0, 54 } 55} 56 57// MustPregeneratedIdentity returns a pregenerated identity or panics. 58func MustPregeneratedIdentity(index int, version storj.IDVersion) *identity.FullIdentity { 59 identity, err := PregeneratedIdentity(index, version) 60 if err != nil { 61 panic(err) 62 } 63 return identity 64} 65 66// MustPregeneratedSignedIdentity returns a pregenerated identity or panics. 67func MustPregeneratedSignedIdentity(index int, version storj.IDVersion) *identity.FullIdentity { 68 identity, err := PregeneratedSignedIdentity(index, version) 69 if err != nil { 70 panic(err) 71 } 72 return identity 73} 74 75// PregeneratedIdentity returns a pregenerated identity from a list. 76func PregeneratedIdentity(index int, version storj.IDVersion) (*identity.FullIdentity, error) { 77 pregeneratedIdentities := IdentityVersions[version.Number] 78 79 if pregeneratedIdentities.next >= len(pregeneratedIdentities.list) { 80 return nil, errors.New("out of pregenerated identities") 81 } 82 return pregeneratedIdentities.list[index], nil 83} 84 85// PregeneratedSignedIdentity returns a signed pregenerated identity from a list. 86func PregeneratedSignedIdentity(index int, version storj.IDVersion) (*identity.FullIdentity, error) { 87 pregeneratedSignedIdentities := SignedIdentityVersions[version.Number] 88 89 if pregeneratedSignedIdentities.next >= len(pregeneratedSignedIdentities.list) { 90 return nil, errors.New("out of signed pregenerated identities") 91 } 92 return pregeneratedSignedIdentities.list[index], nil 93} 94 95// NewPregeneratedIdentities retruns a new table from provided identities. 96func NewPregeneratedIdentities(version storj.IDVersion) *Identities { 97 return IdentityVersions[version.Number].Clone() 98} 99 100// NewPregeneratedSignedIdentities retruns a new table from provided signed identities. 101func NewPregeneratedSignedIdentities(version storj.IDVersion) *Identities { 102 return SignedIdentityVersions[version.Number].Clone() 103} 104 105// NewPregeneratedSigner returns the signer for all pregenerated, signed identities. 106func NewPregeneratedSigner(version storj.IDVersion) *identity.FullCertificateAuthority { 107 return SignerVersions[version.Number] 108} 109 110// Clone creates a shallow clone of the table. 111func (identities *Identities) Clone() *Identities { 112 return NewIdentities(identities.list...) 113} 114 115// NewIdentity gets a new identity from the list. 116func (identities *Identities) NewIdentity() (*identity.FullIdentity, error) { 117 if identities.next >= len(identities.list) { 118 return nil, errors.New("out of pregenerated identities") 119 } 120 121 id := identities.list[identities.next] 122 identities.next++ 123 return id, nil 124} 125 126// mustParseIdentityPEM parses pem encoded identity chain and key strings. 127func mustParseIdentityPEM(chain, key string) *identity.FullIdentity { 128 // TODO: add whitelist handling somehow 129 fi, err := identity.FullIdentityFromPEM([]byte(chain), []byte(key)) 130 if err != nil { 131 panic(err) 132 } 133 return fi 134} 135 136// mustParseCertificateAuthorityPEM parses pem encoded certificate authority chain and key strings. 137func mustParseCertificateAuthorityPEM(chain, key string) *identity.FullCertificateAuthority { 138 // TODO: add whitelist handling somehow 139 fi, err := identity.FullCertificateAuthorityFromPEM([]byte(chain), []byte(key)) 140 if err != nil { 141 panic(err) 142 } 143 return fi 144} 145