mirror of https://github.com/docker/docs.git
				
				
				
			Add a test to test adding multiple keys to a yubikey.
If there are existing keys on the Yubikey, the YubiKeyStore should add a key to the next available slot. Signed-off-by: Ying Li <ying.li@docker.com> Signed-off-by: David Lawrence <david.lawrence@docker.com> Signed-off-by: Ying Li <ying.li@docker.com> (github: endophage)
This commit is contained in:
		
							parent
							
								
									9a01cf091d
								
							
						
					
					
						commit
						53114aabdc
					
				|  | @ -182,3 +182,11 @@ func PromptRetrieverWithInOut(in io.Reader, out io.Writer, aliasMap map[string]s | |||
| 		return retPass, false, nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // ConstantRetriever returns a new Retriever which will return a constant string
 | ||||
| // as a passphrase.
 | ||||
| func ConstantRetriever(constantPassphrase string) Retriever { | ||||
| 	return func(k, a string, c bool, n int) (string, bool, error) { | ||||
| 		return constantPassphrase, false, nil | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -627,7 +627,11 @@ func (s *YubiKeyStore) RemoveKey(keyID string) error { | |||
| 	if !ok { | ||||
| 		return errors.New("Key not present in yubikey") | ||||
| 	} | ||||
| 	return yubiRemoveKey(ctx, session, key.slotID, s.passRetriever, keyID) | ||||
| 	err = yubiRemoveKey(ctx, session, key.slotID, s.passRetriever, keyID) | ||||
| 	if err == nil { | ||||
| 		delete(s.keys, keyID) | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func (s *YubiKeyStore) ExportKey(keyID string) ([]byte, error) { | ||||
|  |  | |||
|  | @ -0,0 +1,65 @@ | |||
| // +build pkcs11
 | ||||
| 
 | ||||
| package trustmanager | ||||
| 
 | ||||
| import ( | ||||
| 	"crypto/rand" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/docker/notary/passphrase" | ||||
| 	"github.com/docker/notary/tuf/data" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
| 
 | ||||
| func clearAllKeys(t *testing.T) { | ||||
| 	// TODO(cyli): this is creating a new yubikey store because for some reason,
 | ||||
| 	// removing and then adding with the same YubiKeyStore causes
 | ||||
| 	// non-deterministic failures at least on Mac OS
 | ||||
| 	ret := passphrase.ConstantRetriever("passphrase") | ||||
| 	store, err := NewYubiKeyStore(NewKeyMemoryStore(ret), ret) | ||||
| 	assert.NoError(t, err) | ||||
| 
 | ||||
| 	for k := range store.ListKeys() { | ||||
| 		err := store.RemoveKey(k) | ||||
| 		assert.NoError(t, err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestAddKeyToNextEmptyYubikeySlot(t *testing.T) { | ||||
| 	if !YubikeyAccessible() { | ||||
| 		t.Skip("Must have Yubikey access.") | ||||
| 	} | ||||
| 	clearAllKeys(t) | ||||
| 
 | ||||
| 	ret := passphrase.ConstantRetriever("passphrase") | ||||
| 	store, err := NewYubiKeyStore(NewKeyMemoryStore(ret), ret) | ||||
| 	assert.NoError(t, err) | ||||
| 	SetYubikeyKeyMode(KeymodeNone) | ||||
| 	defer func() { | ||||
| 		SetYubikeyKeyMode(KeymodeTouch | KeymodePinOnce) | ||||
| 	}() | ||||
| 
 | ||||
| 	keys := make([]string, 0, numSlots) | ||||
| 
 | ||||
| 	// create the maximum number of keys
 | ||||
| 	for i := 0; i < numSlots; i++ { | ||||
| 		privKey, err := GenerateECDSAKey(rand.Reader) | ||||
| 		assert.NoError(t, err) | ||||
| 
 | ||||
| 		err = store.AddKey(privKey.ID(), data.CanonicalRootRole, privKey) | ||||
| 		assert.NoError(t, err) | ||||
| 
 | ||||
| 		keys = append(keys, privKey.ID()) | ||||
| 	} | ||||
| 
 | ||||
| 	listedKeys := store.ListKeys() | ||||
| 	assert.Len(t, listedKeys, numSlots) | ||||
| 	for _, k := range keys { | ||||
| 		r, ok := listedKeys[k] | ||||
| 		assert.True(t, ok) | ||||
| 		assert.Equal(t, data.CanonicalRootRole, r) | ||||
| 	} | ||||
| 
 | ||||
| 	// numSlots is not actually the max - some keys might have more, so do not
 | ||||
| 	// test that adding more keys will fail.
 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue