func (a *archive50) getKeys(b *readBuf) (keys [][]byte, err error) {
	if len(*b) < 17 {
		return nil, errCorruptEncrypt
	}
	// read kdf count and salt
	kdfCount := int(b.byte())
	if kdfCount > maxKdfCount {
		return nil, errCorruptEncrypt
	}
	kdfCount = 1 << uint(kdfCount)
	salt := b.bytes(16)

	// check cache of keys for match
	for _, v := range a.keyCache {
		if kdfCount == v.kdfCount && bytes.Equal(salt, v.salt) {
			return v.keys, nil
		}
	}
	// not found, calculate keys
	keys = calcKeys50(a.pass, salt, kdfCount)

	// store in cache
	copy(a.keyCache[1:], a.keyCache[:])
	a.keyCache[0].kdfCount = kdfCount
	a.keyCache[0].salt = append([]byte(nil), salt...)
	a.keyCache[0].keys = keys

	return keys, nil
}
func (a *archive50) getKeys(b *readBuf) (keys [][]byte, err error) {
	if len(*b) < 17 {
		return nil, errCorruptEncrypt
	}
	
	kdfCount := int(b.byte())
	if kdfCount > maxKdfCount {
		return nil, errCorruptEncrypt
	}
	kdfCount = 1 << uint(kdfCount)
	salt := b.bytes(16)

	
	for _, v := range a.keyCache {
		if kdfCount == v.kdfCount && bytes.Equal(salt, v.salt) {
			return v.keys, nil
		}
	}
	
	keys = calcKeys50(a.pass, salt, kdfCount)

	
	copy(a.keyCache[1:], a.keyCache[:])
	a.keyCache[0].kdfCount = kdfCount
	a.keyCache[0].salt = append([]byte(nil), salt...)
	a.keyCache[0].keys = keys

	return keys, nil
}
func ( a * archive50 ) getKeys ( b * readBuf ) ( keys [ ] [ ] byte , err error ) { if len ( * b ) < 17 { return nil , errCorruptEncrypt } // read kdf count and salt kdfCount := int ( b . byte ( ) ) if kdfCount > maxKdfCount { return nil , errCorruptEncrypt } kdfCount = 1 << uint ( kdfCount ) salt := b . bytes ( 16 ) // check cache of keys for match for _ , v := range a . keyCache { if kdfCount == v . kdfCount && bytes . Equal ( salt , v . salt ) { return v . keys , nil } } // not found, calculate keys keys = calcKeys50 ( a . pass , salt , kdfCount ) // store in cache copy ( a . keyCache [ 1 : ] , a . keyCache [ : ] ) a . keyCache [ 0 ] . kdfCount = kdfCount a . keyCache [ 0 ] . salt = append ( [ ] byte ( nil ) , salt ... ) a . keyCache [ 0 ] . keys = keys return keys , nil }
// getKeys reads kdfcount and salt from b and returns the corresponding encryption keys.
getKeys reads kdfcount and salt from b and returns the corresponding encryption keys .