1 /* 2 * Copyright 2002-2018 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <openssl/crypto.h> 11 #include <openssl/err.h> 12 #include "ec_local.h" 13 14 BIGNUM *EC_POINT_point2bn(const EC_GROUP *group, 15 const EC_POINT *point, 16 point_conversion_form_t form, 17 BIGNUM *ret, BN_CTX *ctx) 18 { 19 size_t buf_len = 0; 20 unsigned char *buf; 21 22 buf_len = EC_POINT_point2buf(group, point, form, &buf, ctx); 23 24 if (buf_len == 0) 25 return NULL; 26 27 ret = BN_bin2bn(buf, buf_len, ret); 28 29 OPENSSL_free(buf); 30 31 return ret; 32 } 33 34 EC_POINT *EC_POINT_bn2point(const EC_GROUP *group, 35 const BIGNUM *bn, EC_POINT *point, BN_CTX *ctx) 36 { 37 size_t buf_len = 0; 38 unsigned char *buf; 39 EC_POINT *ret; 40 41 if ((buf_len = BN_num_bytes(bn)) == 0) 42 buf_len = 1; 43 if ((buf = OPENSSL_malloc(buf_len)) == NULL) { 44 ECerr(EC_F_EC_POINT_BN2POINT, ERR_R_MALLOC_FAILURE); 45 return NULL; 46 } 47 48 if (!BN_bn2binpad(bn, buf, buf_len)) { 49 OPENSSL_free(buf); 50 return NULL; 51 } 52 53 if (point == NULL) { 54 if ((ret = EC_POINT_new(group)) == NULL) { 55 OPENSSL_free(buf); 56 return NULL; 57 } 58 } else 59 ret = point; 60 61 if (!EC_POINT_oct2point(group, ret, buf, buf_len, ctx)) { 62 if (ret != point) 63 EC_POINT_clear_free(ret); 64 OPENSSL_free(buf); 65 return NULL; 66 } 67 68 OPENSSL_free(buf); 69 return ret; 70 } 71 72 static const char *HEX_DIGITS = "0123456789ABCDEF"; 73 74 /* the return value must be freed (using OPENSSL_free()) */ 75 char *EC_POINT_point2hex(const EC_GROUP *group, 76 const EC_POINT *point, 77 point_conversion_form_t form, BN_CTX *ctx) 78 { 79 char *ret, *p; 80 size_t buf_len = 0, i; 81 unsigned char *buf = NULL, *pbuf; 82 83 buf_len = EC_POINT_point2buf(group, point, form, &buf, ctx); 84 85 if (buf_len == 0) 86 return NULL; 87 88 ret = OPENSSL_malloc(buf_len * 2 + 2); 89 if (ret == NULL) { 90 OPENSSL_free(buf); 91 return NULL; 92 } 93 p = ret; 94 pbuf = buf; 95 for (i = buf_len; i > 0; i--) { 96 int v = (int)*(pbuf++); 97 *(p++) = HEX_DIGITS[v >> 4]; 98 *(p++) = HEX_DIGITS[v & 0x0F]; 99 } 100 *p = '\0'; 101 102 OPENSSL_free(buf); 103 104 return ret; 105 } 106 107 EC_POINT *EC_POINT_hex2point(const EC_GROUP *group, 108 const char *buf, EC_POINT *point, BN_CTX *ctx) 109 { 110 EC_POINT *ret = NULL; 111 BIGNUM *tmp_bn = NULL; 112 113 if (!BN_hex2bn(&tmp_bn, buf)) 114 return NULL; 115 116 ret = EC_POINT_bn2point(group, tmp_bn, point, ctx); 117 118 BN_clear_free(tmp_bn); 119 120 return ret; 121 } 122