]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/dsa/dsa_sign.c
2 * Copyright 1995-2020 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 * DSA low level APIs are deprecated for public use, but still ok for
14 #include "internal/deprecated.h"
16 #include <openssl/bn.h>
17 #include "internal/cryptlib.h"
18 #include "dsa_local.h"
19 #include "crypto/asn1_dsa.h"
20 #include "crypto/dsa.h"
22 DSA_SIG
*DSA_do_sign(const unsigned char *dgst
, int dlen
, DSA
*dsa
)
24 return dsa
->meth
->dsa_do_sign(dgst
, dlen
, dsa
);
27 #ifndef OPENSSL_NO_DEPRECATED_3_0
28 int DSA_sign_setup(DSA
*dsa
, BN_CTX
*ctx_in
, BIGNUM
**kinvp
, BIGNUM
**rp
)
30 return dsa
->meth
->dsa_sign_setup(dsa
, ctx_in
, kinvp
, rp
);
34 DSA_SIG
*DSA_SIG_new(void)
36 DSA_SIG
*sig
= OPENSSL_zalloc(sizeof(*sig
));
38 ERR_raise(ERR_LIB_DSA
, ERR_R_MALLOC_FAILURE
);
42 void DSA_SIG_free(DSA_SIG
*sig
)
46 BN_clear_free(sig
->r
);
47 BN_clear_free(sig
->s
);
51 DSA_SIG
*d2i_DSA_SIG(DSA_SIG
**psig
, const unsigned char **ppin
, long len
)
57 if (psig
!= NULL
&& *psig
!= NULL
) {
68 if (ossl_decode_der_dsa_sig(sig
->r
, sig
->s
, ppin
, (size_t)len
) == 0) {
69 if (psig
== NULL
|| *psig
== NULL
)
73 if (psig
!= NULL
&& *psig
== NULL
)
78 int i2d_DSA_SIG(const DSA_SIG
*sig
, unsigned char **ppout
)
85 if (!WPACKET_init_null(&pkt
, 0))
87 } else if (*ppout
== NULL
) {
88 if ((buf
= BUF_MEM_new()) == NULL
89 || !WPACKET_init_len(&pkt
, buf
, 0)) {
94 if (!WPACKET_init_static_len(&pkt
, *ppout
, SIZE_MAX
, 0))
98 if (!encode_der_dsa_sig(&pkt
, sig
->r
, sig
->s
)
99 || !WPACKET_get_total_written(&pkt
, &encoded_len
)
100 || !WPACKET_finish(&pkt
)) {
102 WPACKET_cleanup(&pkt
);
107 if (*ppout
== NULL
) {
108 *ppout
= (unsigned char *)buf
->data
;
112 *ppout
+= encoded_len
;
116 return (int)encoded_len
;
119 int DSA_size(const DSA
*dsa
)
124 sig
.r
= sig
.s
= dsa
->params
.q
;
125 ret
= i2d_DSA_SIG(&sig
, NULL
);
132 void DSA_SIG_get0(const DSA_SIG
*sig
, const BIGNUM
**pr
, const BIGNUM
**ps
)
140 int DSA_SIG_set0(DSA_SIG
*sig
, BIGNUM
*r
, BIGNUM
*s
)
142 if (r
== NULL
|| s
== NULL
)
144 BN_clear_free(sig
->r
);
145 BN_clear_free(sig
->s
);
151 int dsa_sign_int(int type
, const unsigned char *dgst
,
152 int dlen
, unsigned char *sig
, unsigned int *siglen
, DSA
*dsa
)
156 /* legacy case uses the method table */
157 if (dsa
->libctx
== NULL
|| dsa
->meth
!= DSA_get_default_method())
158 s
= DSA_do_sign(dgst
, dlen
, dsa
);
160 s
= dsa_do_sign_int(dgst
, dlen
, dsa
);
165 *siglen
= i2d_DSA_SIG(s
, &sig
);
170 int DSA_sign(int type
, const unsigned char *dgst
, int dlen
,
171 unsigned char *sig
, unsigned int *siglen
, DSA
*dsa
)
173 return dsa_sign_int(type
, dgst
, dlen
, sig
, siglen
, dsa
);
176 /* data has already been hashed (probably with SHA or SHA-1). */
179 * 1: correct signature
180 * 0: incorrect signature
183 int DSA_verify(int type
, const unsigned char *dgst
, int dgst_len
,
184 const unsigned char *sigbuf
, int siglen
, DSA
*dsa
)
187 const unsigned char *p
= sigbuf
;
188 unsigned char *der
= NULL
;
195 if (d2i_DSA_SIG(&s
, &p
, siglen
) == NULL
)
197 /* Ensure signature uses DER and doesn't have trailing garbage */
198 derlen
= i2d_DSA_SIG(s
, &der
);
199 if (derlen
!= siglen
|| memcmp(sigbuf
, der
, derlen
))
201 ret
= DSA_do_verify(dgst
, dgst_len
, s
, dsa
);
203 OPENSSL_clear_free(der
, derlen
);