What you actually want is called a key-based key derivation function (KBKDF).
The most prominent KBKDF (and really the standard solution here) is HKDF.
This is a function that takes a secret key (e.g. a KEK or a root key or something) and outputs (a set of) derived keys enjoying some nice properties.
- You can customize the keys to get different keys for different purposes, e.g. you can add a purpose-string to them which ensure you won't accidently re-use some key material
- You can salt the key material. This way you can store a (non-secret) salt with the object to be encrypted and this will ensure all files enjoy distinct encryption keys (and the customization ensure each key-based operation on an object has a different key)
- Given a derived key it is impossible to find any other keys except for those derived from the leaked one.
- The derivation process isn't computationally expensive (especially compared to PBKDF2 and Curve25519)
Now for a short clarification:
- Curve25519 is an elliptic curve used to perform signature operations and derive keys between two distinct parties such that no passive attacker can obtain the negotiated key. This clearly doesn't apply to you as you already have the key material.
- PBKDF2 is an (old) password based key derivation function which is used to process passwords such that the operation takes more time and thus it is more computationally expensive for an attacker to brute-force a password out of a given key. This one does not apply to you because your key material has such high entropy that an attacker doesn't have a chance at brute-forcing anyways.