OpenSSL  1.0.1c
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
ec_print.c
Go to the documentation of this file.
1 /* crypto/ec/ec_print.c */
2 /* ====================================================================
3  * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in
14  * the documentation and/or other materials provided with the
15  * distribution.
16  *
17  * 3. All advertising materials mentioning features or use of this
18  * software must display the following acknowledgment:
19  * "This product includes software developed by the OpenSSL Project
20  * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21  *
22  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23  * endorse or promote products derived from this software without
24  * prior written permission. For written permission, please contact
26  *
27  * 5. Products derived from this software may not be called "OpenSSL"
28  * nor may "OpenSSL" appear in their names without prior written
29  * permission of the OpenSSL Project.
30  *
31  * 6. Redistributions of any form whatsoever must retain the following
32  * acknowledgment:
33  * "This product includes software developed by the OpenSSL Project
34  * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35  *
36  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47  * OF THE POSSIBILITY OF SUCH DAMAGE.
48  * ====================================================================
49  *
50  * This product includes cryptographic software written by Eric Young
51  * ([email protected]). This product includes software written by Tim
52  * Hudson ([email protected]).
53  *
54  */
55 
56 #include <openssl/crypto.h>
57 #include "ec_lcl.h"
58 
60  const EC_POINT *point,
62  BIGNUM *ret,
63  BN_CTX *ctx)
64  {
65  size_t buf_len=0;
66  unsigned char *buf;
67 
68  buf_len = EC_POINT_point2oct(group, point, form,
69  NULL, 0, ctx);
70  if (buf_len == 0)
71  return NULL;
72 
73  if ((buf = OPENSSL_malloc(buf_len)) == NULL)
74  return NULL;
75 
76  if (!EC_POINT_point2oct(group, point, form, buf, buf_len, ctx))
77  {
78  OPENSSL_free(buf);
79  return NULL;
80  }
81 
82  ret = BN_bin2bn(buf, buf_len, ret);
83 
84  OPENSSL_free(buf);
85 
86  return ret;
87 }
88 
90  const BIGNUM *bn,
91  EC_POINT *point,
92  BN_CTX *ctx)
93  {
94  size_t buf_len=0;
95  unsigned char *buf;
96  EC_POINT *ret;
97 
98  if ((buf_len = BN_num_bytes(bn)) == 0) return NULL;
99  buf = OPENSSL_malloc(buf_len);
100  if (buf == NULL)
101  return NULL;
102 
103  if (!BN_bn2bin(bn, buf))
104  {
105  OPENSSL_free(buf);
106  return NULL;
107  }
108 
109  if (point == NULL)
110  {
111  if ((ret = EC_POINT_new(group)) == NULL)
112  {
113  OPENSSL_free(buf);
114  return NULL;
115  }
116  }
117  else
118  ret = point;
119 
120  if (!EC_POINT_oct2point(group, ret, buf, buf_len, ctx))
121  {
122  if (point == NULL)
123  EC_POINT_clear_free(ret);
124  OPENSSL_free(buf);
125  return NULL;
126  }
127 
128  OPENSSL_free(buf);
129  return ret;
130  }
131 
132 static const char *HEX_DIGITS = "0123456789ABCDEF";
133 
134 /* the return value must be freed (using OPENSSL_free()) */
135 char *EC_POINT_point2hex(const EC_GROUP *group,
136  const EC_POINT *point,
138  BN_CTX *ctx)
139  {
140  char *ret, *p;
141  size_t buf_len=0,i;
142  unsigned char *buf, *pbuf;
143 
144  buf_len = EC_POINT_point2oct(group, point, form,
145  NULL, 0, ctx);
146  if (buf_len == 0)
147  return NULL;
148 
149  if ((buf = OPENSSL_malloc(buf_len)) == NULL)
150  return NULL;
151 
152  if (!EC_POINT_point2oct(group, point, form, buf, buf_len, ctx))
153  {
154  OPENSSL_free(buf);
155  return NULL;
156  }
157 
158  ret = (char *)OPENSSL_malloc(buf_len*2+2);
159  if (ret == NULL)
160  {
161  OPENSSL_free(buf);
162  return NULL;
163  }
164  p = ret;
165  pbuf = buf;
166  for (i=buf_len; i > 0; i--)
167  {
168  int v = (int) *(pbuf++);
169  *(p++)=HEX_DIGITS[v>>4];
170  *(p++)=HEX_DIGITS[v&0x0F];
171  }
172  *p='\0';
173 
174  OPENSSL_free(buf);
175 
176  return ret;
177  }
178 
180  const char *buf,
181  EC_POINT *point,
182  BN_CTX *ctx)
183  {
184  EC_POINT *ret=NULL;
185  BIGNUM *tmp_bn=NULL;
186 
187  if (!BN_hex2bn(&tmp_bn, buf))
188  return NULL;
189 
190  ret = EC_POINT_bn2point(group, tmp_bn, point, ctx);
191 
192  BN_clear_free(tmp_bn);
193 
194  return ret;
195  }