Encryption and HMAC key derivation I'm deriving keys from a user-supplied passphrase for symmetric encryption using AES-256 in CBC mode with a HMAC for authenticity/integrity.

My key derivation function currently looks like this:



Please note that scrypt could just as easily be subbed out for PBKDF2 or bcrypt, that remains to be seen. 

I have a couple questions:


Does input truncation using SHA-256 expose any potential weaknesses? 


My reasoning for doing it in the first place is because many algorithms like bcrypt only accept a limited password input size. (bcrypt seems to accept up to 55 or 72 characters, not sure on the source of this)
Would it be better to prefer a hash method with a longer output, ie SHA-512?

When generating the HMAC authentication and encryption keys, would I benefit at all from using SHA-512?


AES-256 IIRC needs 256-bit keys, so if I either used AES-192 or used SHA-512, how would I go about fixing the discrepancy in required size?
Does input truncation using SHA-256 expose any potential weaknesses?


No, hashing the passphrase with SHA-256 will be no stronger or weaker than feeding it in directly.  If you go with Scrypt (which I would recommend you do), there are no restrictions on the size of the passphrase... and Scrypt consumes it internally with one round of PBKDF2-HMAC-SHA256 anyway.


  When generating the HMAC authentication and encryption keys, would I benefit at all from using SHA-512?


No, you wouldn't. In fact, this step is unnecessary.  Just use the output of Scrypt directly... randomBytes = Scrypt(passphrase); encKey = randomBytes[0, 31];  authKey = randomBytes[32, 63]