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