2 * Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved.
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
11 #include "internal/cryptlib.h"
12 #include <openssl/asn1t.h>
13 #include <openssl/bn.h>
16 * Custom primitive type for BIGNUM handling. This reads in an ASN1_INTEGER
17 * as a BIGNUM directly. Currently it ignores the sign which isn't a problem
18 * since all BIGNUMs used are non negative and anything that looks negative
19 * is normally due to an encoding error.
22 #define BN_SENSITIVE 1
24 static int bn_new(ASN1_VALUE
**pval
, const ASN1_ITEM
*it
);
25 static int bn_secure_new(ASN1_VALUE
**pval
, const ASN1_ITEM
*it
);
26 static void bn_free(ASN1_VALUE
**pval
, const ASN1_ITEM
*it
);
28 static int bn_i2c(const ASN1_VALUE
**pval
, unsigned char *cont
, int *putype
,
30 static int bn_c2i(ASN1_VALUE
**pval
, const unsigned char *cont
, int len
,
31 int utype
, char *free_cont
, const ASN1_ITEM
*it
);
32 static int bn_secure_c2i(ASN1_VALUE
**pval
, const unsigned char *cont
, int len
,
33 int utype
, char *free_cont
, const ASN1_ITEM
*it
);
34 static int bn_print(BIO
*out
, const ASN1_VALUE
**pval
, const ASN1_ITEM
*it
,
35 int indent
, const ASN1_PCTX
*pctx
);
37 static ASN1_PRIMITIVE_FUNCS bignum_pf
= {
47 static ASN1_PRIMITIVE_FUNCS cbignum_pf
= {
57 ASN1_ITEM_start(BIGNUM
)
58 ASN1_ITYPE_PRIMITIVE
, V_ASN1_INTEGER
, NULL
, 0, &bignum_pf
, 0, "BIGNUM"
61 ASN1_ITEM_start(CBIGNUM
)
62 ASN1_ITYPE_PRIMITIVE
, V_ASN1_INTEGER
, NULL
, 0, &cbignum_pf
, BN_SENSITIVE
, "CBIGNUM"
63 ASN1_ITEM_end(CBIGNUM
)
65 static int bn_new(ASN1_VALUE
**pval
, const ASN1_ITEM
*it
)
67 *pval
= (ASN1_VALUE
*)BN_new();
74 static int bn_secure_new(ASN1_VALUE
**pval
, const ASN1_ITEM
*it
)
76 *pval
= (ASN1_VALUE
*)BN_secure_new();
83 static void bn_free(ASN1_VALUE
**pval
, const ASN1_ITEM
*it
)
87 if (it
->size
& BN_SENSITIVE
)
88 BN_clear_free((BIGNUM
*)*pval
);
90 BN_free((BIGNUM
*)*pval
);
94 static int bn_i2c(const ASN1_VALUE
**pval
, unsigned char *cont
, int *putype
,
101 bn
= (BIGNUM
*)*pval
;
102 /* If MSB set in an octet we need a padding byte */
103 if (BN_num_bits(bn
) & 0x7)
112 return pad
+ BN_num_bytes(bn
);
115 static int bn_c2i(ASN1_VALUE
**pval
, const unsigned char *cont
, int len
,
116 int utype
, char *free_cont
, const ASN1_ITEM
*it
)
120 if (*pval
== NULL
&& !bn_new(pval
, it
))
122 bn
= (BIGNUM
*)*pval
;
123 if (!BN_bin2bn(cont
, len
, bn
)) {
130 static int bn_secure_c2i(ASN1_VALUE
**pval
, const unsigned char *cont
, int len
,
131 int utype
, char *free_cont
, const ASN1_ITEM
*it
)
134 bn_secure_new(pval
, it
);
135 return bn_c2i(pval
, cont
, len
, utype
, free_cont
, it
);
138 static int bn_print(BIO
*out
, const ASN1_VALUE
**pval
, const ASN1_ITEM
*it
,
139 int indent
, const ASN1_PCTX
*pctx
)
141 if (!BN_print(out
, *(BIGNUM
**)pval
))
143 if (BIO_puts(out
, "\n") <= 0)