/*
 * KeyUtils.h
 *
 *  Created on: Apr 17, 2018
 *      Author: armin
 */

#ifndef UTIL_KEYUTILS_H_
#define UTIL_KEYUTILS_H_

#include <bytestr.h>
#include <openssl/sha.h>
#include <ripemd160_256.h>
#include <cstring>

using namespace std;

namespace util {

class KeyUtils {
 public:
  inline static bytestr chash160(const bytestr& key) {
    SHA256_CTX ctx;

    byte cpub[33];
    byte hash[SHA256_DIGEST_LENGTH];

    /* compress uncompressed public key */
    cpub[0] = 0x02 | (key[64] & 0x01);        // determine curve flag for y
    memcpy(cpub + 1, key.byteArr() + 1, 32);  // copy x coordinate

    SHA256_Init(&ctx);
    SHA256_Update(&ctx, cpub, 33);
    SHA256_Final(hash, &ctx);

    byte hash160[20];
    ripemd160_256(hash, hash160);

    return (bytestr(hash160, 20));
  }
};

}  // namespace util

#endif /* UTIL_KEYUTILS_H_ */
