Business-OnlinePayment-BitPay-KeyUtils
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
key_utils.c view on Meta::CPAN
createDataWithHexString(step3, &outBytesOfStep3);
digestOfBytes(outBytesOfStep3, &step4a, "sha256", RIPEMD_AND_PADDING);
step4a[64] = '\0';
createDataWithHexString(step4a, &outBytesOfStep4a);
digestOfBytes(outBytesOfStep4a, &step4b, "sha256", SHA256_DIGEST_LENGTH);
step4b[64] = '\0';
memcpy(step5, step4b, CHECKSUM);
sprintf(step6, "%s%s", step3, step5);
step6[RIPEMD_AND_PADDING_HEX + CHECKSUM] = '\0';
base58encode(step6, base58OfStep6);
base58OfStep6[SIN] = '\0';
memcpy(*sin, base58OfStep6, SIN_STRING);
free(pub);
free(step1);
free(step2);
free(step3);
free(step4a);
free(step4b);
free(step5);
free(step6);
free(base58OfStep6);
free(outBytesPub);
free(outBytesOfStep1);
free(outBytesOfStep3);
free(outBytesOfStep4a);
return NOERROR;
}
int getPublicKeyFromPem(char *pemstring, char **pubkey) {
EC_KEY *eckey = NULL;
EC_KEY *key = NULL;
EC_POINT *pub_key = NULL;
BIO *in = NULL;
const EC_GROUP *group = NULL;
char *hexPoint = NULL;
char xval[65] = "";
char yval[65] = "";
char *oddNumbers = "13579BDF";
BIGNUM start;
const BIGNUM *res;
BN_CTX *ctx;
BN_init(&start);
ctx = BN_CTX_new();
res = &start;
const char *cPem = pemstring;
in = BIO_new(BIO_s_mem());
BIO_puts(in, cPem);
key = PEM_read_bio_ECPrivateKey(in, NULL, NULL, NULL);
res = EC_KEY_get0_private_key(key);
eckey = EC_KEY_new_by_curve_name(NID_secp256k1);
group = EC_KEY_get0_group(eckey);
pub_key = EC_POINT_new(group);
EC_KEY_set_private_key(eckey, res);
if (!EC_POINT_mul(group, pub_key, res, NULL, NULL, ctx)) {
return ERROR;
}
EC_KEY_set_public_key(eckey, pub_key);
hexPoint = EC_POINT_point2hex(group, pub_key, 4, ctx);
char *hexPointxInit = hexPoint + 2;
memcpy(xval, hexPointxInit, 64);
char *hexPointyInit = hexPoint + 66;
memcpy(yval, hexPointyInit, 64);
char *lastY = hexPoint + 129;
hexPoint[130] = '\0';
char *buildCompPub = calloc(67, sizeof(char));
if (strstr(oddNumbers, lastY) != NULL) {
sprintf(buildCompPub, "03%s", xval);
buildCompPub[66] = '\0';
memcpy(*pubkey, buildCompPub, 67);
} else {
sprintf(buildCompPub, "02%s", xval);
buildCompPub[66] = '\0';
memcpy(*pubkey, buildCompPub, 67);
}
free(buildCompPub);
BN_CTX_free(ctx);
EC_KEY_free(eckey);
EC_KEY_free(key);
EC_POINT_free(pub_key);
BIO_free(in);
return NOERROR;
};
static int createDataWithHexString(char *inputString, uint8_t **result) {
int i, o = 0;
uint8_t outByte = 0;
int inLength = strlen(inputString);
uint8_t *outBytes = malloc(sizeof(uint8_t) * ((inLength / 2) + 1));
for (i = 0; i < inLength; i++) {
uint8_t c = inputString[i];
int8_t value = -1;
if (c >= '0' && c <= '9') value = (c - '0');
else if (c >= 'A' && c <= 'F') value = 10 + (c - 'A');
else if (c >= 'a' && c <= 'f') value = 10 + (c - 'a');
if (value >= 0) {
if (i % 2 == 1) {
outBytes[o++] = (outByte << 4) | value;
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.389 second using v1.00-cache-2.02-grep-82fe00e-cpan-2cc899e4a130 )