github.com/zntrio/harp/v2@v2.0.9/pkg/container/identity/codec_test.go (about) 1 // Licensed to Elasticsearch B.V. under one or more contributor 2 // license agreements. See the NOTICE file distributed with 3 // this work for additional information regarding copyright 4 // ownership. Elasticsearch B.V. licenses this file to you under 5 // the Apache License, Version 2.0 (the "License"); you may 6 // not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, 12 // software distributed under the License is distributed on an 13 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 14 // KIND, either express or implied. See the License for the 15 // specific language governing permissions and limitations 16 // under the License. 17 package identity 18 19 import ( 20 "bytes" 21 "crypto/rand" 22 "testing" 23 24 "github.com/stretchr/testify/assert" 25 26 "github.com/zntrio/harp/v2/pkg/container/identity/key" 27 ) 28 29 var ( 30 v1SecurityIdentity = []byte(`{"@apiVersion":"harp.elastic.co/v1","@kind":"ContainerIdentity","@timestamp":"2021-12-01T22:15:11.144249Z","@description":"security","public":"v1.ipk.7u8B1VFrHyMeWyt8Jzj1Nj2BgVB7z-umD8R-OOnJahE","private":{"content":"ZXlKaGJHY2lPaUpRUWtWVE1pMUlVelV4TWl0Qk1qVTJTMWNpTENKbGJtTWlPaUpCTWpVMlIwTk5JaXdpY0RKaklqbzFNREF3TURFc0luQXljeUk2SW1obU1UVnpUVmRwTmtaMmNUSlVZM0p5TVhReVZtY2lmUS5ZOGtfVXR2dWtmcVRxTE5fQ2l5ajdTejU2dThOYV9uMG1FTG5jMHFCQ1d0MkVqX2VHRk80RmcuN0p2ekhGYkZrRXdXWGxOeC5ycVJLSno1ZWFGajRqSl9wOVAzUVBuUUs3dXhkWUhBOUNIZFUxTEswWkQ3Q2dickJzUDFRRFRTRU1lX3lqbTZVQ1dpNzFUVmxfX3JISVdSR3VDVVpWSE1KMXNtRnR5c2UzdHBURkdnZFRCaVQxTmw4dWlNZ2JiUEN1cHJ4Uy0wUjRGU2dobXFLU0s3TGhRcUxFWFVaNFF0SVliMDd6Y19vMnRZNlVnU3NMaFBlSUFPM1M2WlBwQXFYU3lfSjR3NzEzdFhEU1ZTX2ZuOFJ5MlF2NTJmOHg0cXBiN0Q3NGlTTndOb052Zy5rcHVzTTVoZ21RT3JhS1luNGxTVjZ3"},"signature":"Kq1OJlAOexIvt9TXETYeYGotqqCz8PiqFEYuSbHmJPVBqtYpI2Q_zNE0fO5hs-JdTqG3p6oLiITHK9cYyx2hBw"}`) 31 publicOnly = []byte(`{"@apiVersion":"harp.elastic.co/v1","@kind":"ContainerIdentity","@timestamp":"2021-12-01T20:56:30.832199Z","@description":"security","public":"v1.ipk.PRdbQ8qbrDsfTLA-aeQIdUF0VwnauvWqQF-CXNFp9oM"}`) 32 v2SecurityIdentity = []byte(`{"@apiVersion":"harp.elastic.co/v1","@kind":"ContainerIdentity","@timestamp":"2021-12-01T22:15:07.586373Z","@description":"security","public":"v2.ipk.AkLr_HHMO5Loy2bK42mvCADrJ7s2PSYCRTnqDWJV8PCK2EXmu-GTV8HmNJwmA8IJ8Q","private":{"content":"ZXlKaGJHY2lPaUpRUWtWVE1pMUlVelV4TWl0Qk1qVTJTMWNpTENKbGJtTWlPaUpCTWpVMlIwTk5JaXdpY0RKaklqbzFNREF3TURFc0luQXljeUk2SWpCMFozUk5OMm80TmxacFNrWXpjemhYWDBsb05VRWlmUS5QXzVVMTdSR3JSRVg4UHoyNGpRQkQzdGROWGU3ci1UMVh2bnBnT21aMkwweGZXQXNfT2dWcVEuYUpuekZCQTNBWllXSld2TC53SVAtZlRERjN5R0NaRGtldThOM3A1NUZPRF9ZX3QzSV9ubHN2MDVqcWNLdlJLczFfWjVfM2Zhc2Z0cU0tMlRoN25VdDZIaXZWLVB1ckVIQ2hBRENHaF9SZTBySVVwZkV4OHBCcUk4V3BIYTdSYktUTUN3RmNpSDMzeTQxZ1duT1lpN1R1TmJBamhNMjZMdDZZMFN0ekcyRi1FUm9jSWotWklwMDJwcGZjdUpKOU91S1BDOThKTl9ZV3EzcVA2TW55Ym1WTnFFZ1hwdWFVZm9GcTN3ZWlSX2paVkNsRzU5cTBGdWplVHN0UnRzU2xuZFlndTVBTl9LanFWRmluNDBXNGcxZWRMdWZDM1U0UGZhZVMzUlQxSS0wRkVnN0ZGMnE0QVdINy01aF9IQWg4WFR4eXBCTjR3THE1TTd6ZExRLlkzTTlBeDc1bGNYbmNNaGNxV3dOMXc"},"signature":"dpbnMGAPvFbHSjEXs1GMyO8Kmw9cZqTOKI5wAA1ApcO1RXtFGS_GyC1zAtuFDhhVmTWdFzS4HdVg0LEhxBivbqsr_cft_9CR-7uVUPpkb2Hz2d4BkL3yzDo9bkLfllaM"}`) 33 ) 34 35 func TestCodec_New(t *testing.T) { 36 t.Run("invalid description", func(t *testing.T) { 37 id, pub, err := New(rand.Reader, "é", key.Ed25519) 38 assert.Error(t, err) 39 assert.Nil(t, pub) 40 assert.Nil(t, id) 41 }) 42 43 t.Run("ed25519 - invalid random source", func(t *testing.T) { 44 id, pub, err := New(bytes.NewBuffer(nil), "test", key.Ed25519) 45 assert.Error(t, err) 46 assert.Nil(t, pub) 47 assert.Nil(t, id) 48 }) 49 50 t.Run("p384 - invalid random source", func(t *testing.T) { 51 id, pub, err := New(bytes.NewBuffer(nil), "test", key.P384) 52 assert.Error(t, err) 53 assert.Nil(t, pub) 54 assert.Nil(t, id) 55 }) 56 57 t.Run("legacy - invalid random source", func(t *testing.T) { 58 id, pub, err := New(bytes.NewBuffer(nil), "test", key.Legacy) 59 assert.Error(t, err) 60 assert.Nil(t, pub) 61 assert.Nil(t, id) 62 }) 63 64 t.Run("valid - ed25519", func(t *testing.T) { 65 id, pub, err := New(bytes.NewBuffer([]byte("deterministic-random-source-for-test-0001")), "security", key.Ed25519) 66 assert.NoError(t, err) 67 assert.NotNil(t, pub) 68 assert.NotNil(t, id) 69 assert.Equal(t, "harp.elastic.co/v1", id.APIVersion) 70 assert.Equal(t, "security", id.Description) 71 assert.Equal(t, "ContainerIdentity", id.Kind) 72 assert.Equal(t, "v1.ipk.2BdsL_FTiaLRwyYwlA2urcZ8TLDdisbzBSEp-LUuHos", id.Public) 73 assert.Nil(t, id.Private) 74 assert.False(t, id.HasPrivateKey()) 75 }) 76 77 t.Run("valid - p-384", func(t *testing.T) { 78 id, pub, err := New(bytes.NewBuffer([]byte("deterministic-random-source-for-test-0001-1ioQiLEbVCm1Y7NfWCf6oNWoV6p5E4spJgRXKQHdV44XcNvqywMnIYYcL8qZ4Wk")), "security", key.P384) 79 assert.NoError(t, err) 80 assert.NotNil(t, pub) 81 assert.NotNil(t, id) 82 assert.Equal(t, "harp.elastic.co/v1", id.APIVersion) 83 assert.Equal(t, "security", id.Description) 84 assert.Equal(t, "ContainerIdentity", id.Kind) 85 assert.Equal(t, "v2.ipk.A0X20rlE8Pqp-YoMG8SNOop918AyfoSF_R9Z7MF5vP5nUoc_ZSRWauQR6cL4DqgrRA", id.Public) 86 assert.Nil(t, id.Private) 87 assert.False(t, id.HasPrivateKey()) 88 }) 89 90 t.Run("valid - legacy", func(t *testing.T) { 91 id, pub, err := New(bytes.NewBuffer([]byte("deterministic-random-source-for-test-0001")), "security", key.Legacy) 92 assert.NoError(t, err) 93 assert.NotNil(t, pub) 94 assert.NotNil(t, id) 95 assert.Equal(t, "harp.elastic.co/v1", id.APIVersion) 96 assert.Equal(t, "security", id.Description) 97 assert.Equal(t, "ContainerIdentity", id.Kind) 98 assert.Equal(t, "ZxTKWxgrG341_FxatkkfAxedMtfz1zJzAm6FUmitxHM", id.Public) 99 assert.Nil(t, id.Private) 100 assert.False(t, id.HasPrivateKey()) 101 }) 102 } 103 104 func TestCodec_FromReader(t *testing.T) { 105 t.Run("nil", func(t *testing.T) { 106 id, err := FromReader(nil) 107 assert.Error(t, err) 108 assert.Nil(t, id) 109 }) 110 111 t.Run("empty", func(t *testing.T) { 112 id, err := FromReader(bytes.NewReader([]byte("{}"))) 113 assert.Error(t, err) 114 assert.Nil(t, id) 115 }) 116 117 t.Run("invalid json", func(t *testing.T) { 118 id, err := FromReader(bytes.NewReader([]byte("{"))) 119 assert.Error(t, err) 120 assert.Nil(t, id) 121 }) 122 123 t.Run("public key only", func(t *testing.T) { 124 id, err := FromReader(bytes.NewReader(publicOnly)) 125 assert.Error(t, err) 126 assert.Nil(t, id) 127 }) 128 129 t.Run("valid - v1", func(t *testing.T) { 130 id, err := FromReader(bytes.NewReader(v1SecurityIdentity)) 131 assert.NoError(t, err) 132 assert.NotNil(t, id) 133 }) 134 135 t.Run("valid - v2", func(t *testing.T) { 136 id, err := FromReader(bytes.NewReader(v2SecurityIdentity)) 137 assert.NoError(t, err) 138 assert.NotNil(t, id) 139 }) 140 }