IVをキーから生成するにはどうすればTT

IVとは。

ブロック暗号が CBC モードで使用されるときには、暗号化が行われる前に、初期ベクトルと最初の平文ブロックとで排他的 OR 処理が行われる。

だそうだ。
で、このIVを鍵から生成するにはどうすれば言いかを考えてみた。
その考えが以下のソース。これでよいのかは本当に不安。問題点がありましたらびしびしコメントくださいますとうれしいですm(_ _)m


DKC_INLINE int WINAPI dkcCalculateInitializeVector(
void *dest,size_t destsize_and_generate_iv_size,
const void *key,size_t keysize)
{
uint8 *a = dest;
int r;
size_t count,rest,i,j;
DKC_SHA512 *p;
uint8 key512[SHA512_BIN_BUFFER_SIZE];
r = dkcSecureHashCalculateBinaryDigest(
edkcSH_SHA512,key512,sizeof(key512),key,keysize);
if(DKUTIL_FAILED(r)) return edk_FAILED;

p = dkcAllocSHA512();
if(NULL==p) return edk_OutOfMemory;

//初期ペンティアムは勘弁TT
count = destsize_and_generate_iv_size / SHA512_BIN_BUFFER_SIZE;
rest = destsize_and_generate_iv_size % SHA512_BIN_BUFFER_SIZE;
for(i=0;i<count;i++){
dkcSHA512Init(p);
dkcSHA512Load(p,key,keysize);
dkcSHA512Load(p,key512,sizeof(key512));
dkcSHA512FinalDigest(p,key512,sizeof(key512));
for(j=0;j<SHA512_BIN_BUFFER_SIZE;j++){
a[i] = key[i]
}
a+=SHA512_BIN_BUFFER_SIZE;
}
if(rest){
dkcSHA512Init(p);
dkcSHA512Load(p,key,keysize);
dkcSHA512Load(p,key512,sizeof(key512));
dkcSHA512FinalDigest(p,key512,sizeof(key512));
for(j=0;j<rest;j++){
a[i] = key[i]
}
}
dkcFreeSHA512(&p);
return edk_SUCCEEDED;
}