xref: /openssl/crypto/ec/ec_print.c (revision 7ed6de99)
1 /*
2  * Copyright 2002-2024 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (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 <string.h> /* strlen */
11 #include <openssl/crypto.h>
12 #include "internal/cryptlib.h"
13 #include "ec_local.h"
14 
15 /* the return value must be freed (using OPENSSL_free()) */
EC_POINT_point2hex(const EC_GROUP * group,const EC_POINT * point,point_conversion_form_t form,BN_CTX * ctx)16 char *EC_POINT_point2hex(const EC_GROUP *group,
17                          const EC_POINT *point,
18                          point_conversion_form_t form, BN_CTX *ctx)
19 {
20     char *ret, *p;
21     size_t buf_len, i;
22     unsigned char *buf = NULL;
23 
24     buf_len = EC_POINT_point2buf(group, point, form, &buf, ctx);
25 
26     if (buf_len == 0)
27         return NULL;
28 
29     ret = OPENSSL_malloc(buf_len * 2 + 2);
30     if (ret == NULL)
31         goto err;
32 
33     p = ret;
34     for (i = 0; i < buf_len; ++i)
35         p += ossl_to_hex(p, buf[i]);
36     *p = '\0';
37 
38  err:
39     OPENSSL_free(buf);
40     return ret;
41 }
42 
EC_POINT_hex2point(const EC_GROUP * group,const char * hex,EC_POINT * point,BN_CTX * ctx)43 EC_POINT *EC_POINT_hex2point(const EC_GROUP *group,
44                              const char *hex, EC_POINT *point, BN_CTX *ctx)
45 {
46     int ok = 0;
47     unsigned char *oct_buf = NULL;
48     size_t len, oct_buf_len = 0;
49     EC_POINT *pt = NULL;
50 
51     if (group == NULL || hex == NULL)
52         return NULL;
53 
54     if (point == NULL) {
55         pt = EC_POINT_new(group);
56         if (pt == NULL)
57             goto err;
58     } else {
59         pt = point;
60     }
61 
62     len = strlen(hex) / 2;
63     oct_buf = OPENSSL_malloc(len);
64     if (oct_buf == NULL)
65         goto err;
66 
67     if (!OPENSSL_hexstr2buf_ex(oct_buf, len, &oct_buf_len, hex, '\0')
68         || !EC_POINT_oct2point(group, pt, oct_buf, oct_buf_len, ctx))
69         goto err;
70     ok = 1;
71 err:
72     OPENSSL_clear_free(oct_buf, oct_buf_len);
73     if (!ok) {
74         if (pt != point)
75             EC_POINT_clear_free(pt);
76         pt = NULL;
77     }
78     return pt;
79 }
80