code: func (s *storage) processEncryptedMetaBlob(br blob.Ref, dat []byte) error {
  	plain, err := s.decryptBlob(nil, dat)
  	if err != nil {
  		return err
  	}
  	p := bytes.NewBuffer(plain)
  
  	header, err := p.ReadString('\n')
  	if err != nil {
  		return errors.New("No first line")
  	}
  	if header != "#camlistore/encmeta=2\n" {
  		if len(header) > 80 {
  			header = header[:80]
  		}
  		return fmt.Errorf("unsupported first line %q", header)
  	}
  	var plains []blob.Ref
  	for {
  		line, err := p.ReadString('\n')
  		if err != nil && len(line) != 0 {
  			return io.ErrUnexpectedEOF
  		} else if err != nil {
  			break
  		}
  		parts := strings.Split(strings.TrimRight(line, "\n"), "/")
  		if len(parts) != 3 {
  			if len(line) > 80 {
  				line = line[:80]
  			}
  			return fmt.Errorf("malformed line %q", line)
  		}
  		// We do very limited checking here, as we signed the blob and we check
  		// the value anyway on s.index.Get.
  		plainBR, ok := blob.ParseKnown(parts[0])
  		if !ok {
  			if len(line) > 80 {
  				line = line[:80]
  			}
  			return fmt.Errorf("malformed line %q", line)
  		}
  		plains = append(plains, plainBR)
  		if err := s.index.Set(parts[0], parts[1]+"/"+parts[2]); err != nil {
  			return err
  		}
  	}
  	s.recordMeta(&metaBlob{br: br, plains: plains})
  	return nil
  }
docs: // processEncryptedMetaBlob decrypts dat (the data for the br meta blob) and parses
  // its meta lines, updating the index.
  //
  // processEncryptedMetaBlob is not thread-safe.