code: func (u *vault) Unseal() error {
  	for i := 0; ; i++ {
  		keyID := u.unsealKeyForID(i)
  
  		logrus.Debugf("retrieving key from kms service...")
  		k, err := u.keyStore.Get(keyID)
  
  		if err != nil {
  			return fmt.Errorf("unable to get key '%s': %s", keyID, err.Error())
  		}
  
  		logrus.Debugf("sending unseal request to vault...")
  		resp, err := u.cl.Sys().Unseal(string(k))
  
  		if err != nil {
  			return fmt.Errorf("fail to send unseal request to vault: %s", err.Error())
  		}
  
  		logrus.Debugf("got unseal response: %+v", *resp)
  
  		if !resp.Sealed {
  			return nil
  		}
  
  		// if progress is 0, we failed to unseal vault.
  		if resp.Progress == 0 {
  			return fmt.Errorf("failed to unseal vault. progress reset to 0")
  		}
  	}
  }
docs: // Unseal will attempt to unseal vault by retrieving keys from the kms service
  // and sending unseal requests to vault. It will return an error if retrieving
  // a key fails, or if the unseal progress is reset to 0 (indicating that a key)
  // was invalid.