1 // Copyright (c) 2020-2022 The Decred developers
2 // Use of this source code is governed by an ISC
3 // license that can be found in the LICENSE file.
4 5 package ecdsa
6 7 // ErrorKind identifies a kind of error. It has full support for
8 // errors.Is and errors.As, so the caller can directly check against
9 // an error kind when determining the reason for an error.
10 type ErrorKind string
11 12 // These constants are used to identify a specific Error.
13 const (
14 // ErrSigTooShort is returned when a signature that should be a DER
15 // signature is too short.
16 ErrSigTooShort = ErrorKind("ErrSigTooShort")
17 18 // ErrSigTooLong is returned when a signature that should be a DER signature
19 // is too long.
20 ErrSigTooLong = ErrorKind("ErrSigTooLong")
21 22 // ErrSigInvalidSeqID is returned when a signature that should be a DER
23 // signature does not have the expected ASN.1 sequence ID.
24 ErrSigInvalidSeqID = ErrorKind("ErrSigInvalidSeqID")
25 26 // ErrSigInvalidDataLen is returned when a signature that should be a DER
27 // signature does not specify the correct number of remaining bytes for the
28 // R and S portions.
29 ErrSigInvalidDataLen = ErrorKind("ErrSigInvalidDataLen")
30 31 // ErrSigMissingSTypeID is returned when a signature that should be a DER
32 // signature does not provide the ASN.1 type ID for S.
33 ErrSigMissingSTypeID = ErrorKind("ErrSigMissingSTypeID")
34 35 // ErrSigMissingSLen is returned when a signature that should be a DER
36 // signature does not provide the length of S.
37 ErrSigMissingSLen = ErrorKind("ErrSigMissingSLen")
38 39 // ErrSigInvalidSLen is returned when a signature that should be a DER
40 // signature does not specify the correct number of bytes for the S portion.
41 ErrSigInvalidSLen = ErrorKind("ErrSigInvalidSLen")
42 43 // ErrSigInvalidRIntID is returned when a signature that should be a DER
44 // signature does not have the expected ASN.1 integer ID for R.
45 ErrSigInvalidRIntID = ErrorKind("ErrSigInvalidRIntID")
46 47 // ErrSigZeroRLen is returned when a signature that should be a DER
48 // signature has an R length of zero.
49 ErrSigZeroRLen = ErrorKind("ErrSigZeroRLen")
50 51 // ErrSigNegativeR is returned when a signature that should be a DER
52 // signature has a negative value for R.
53 ErrSigNegativeR = ErrorKind("ErrSigNegativeR")
54 55 // ErrSigTooMuchRPadding is returned when a signature that should be a DER
56 // signature has too much padding for R.
57 ErrSigTooMuchRPadding = ErrorKind("ErrSigTooMuchRPadding")
58 59 // ErrSigRIsZero is returned when a signature has R set to the value zero.
60 ErrSigRIsZero = ErrorKind("ErrSigRIsZero")
61 62 // ErrSigRTooBig is returned when a signature has R with a value that is
63 // greater than or equal to the group order.
64 ErrSigRTooBig = ErrorKind("ErrSigRTooBig")
65 66 // ErrSigInvalidSIntID is returned when a signature that should be a DER
67 // signature does not have the expected ASN.1 integer ID for S.
68 ErrSigInvalidSIntID = ErrorKind("ErrSigInvalidSIntID")
69 70 // ErrSigZeroSLen is returned when a signature that should be a DER
71 // signature has an S length of zero.
72 ErrSigZeroSLen = ErrorKind("ErrSigZeroSLen")
73 74 // ErrSigNegativeS is returned when a signature that should be a DER
75 // signature has a negative value for S.
76 ErrSigNegativeS = ErrorKind("ErrSigNegativeS")
77 78 // ErrSigTooMuchSPadding is returned when a signature that should be a DER
79 // signature has too much padding for S.
80 ErrSigTooMuchSPadding = ErrorKind("ErrSigTooMuchSPadding")
81 82 // ErrSigSIsZero is returned when a signature has S set to the value zero.
83 ErrSigSIsZero = ErrorKind("ErrSigSIsZero")
84 85 // ErrSigSTooBig is returned when a signature has S with a value that is
86 // greater than or equal to the group order.
87 ErrSigSTooBig = ErrorKind("ErrSigSTooBig")
88 89 // ErrSigInvalidLen is returned when a signature that should be a compact
90 // signature is not the required length.
91 ErrSigInvalidLen = ErrorKind("ErrSigInvalidLen")
92 93 // ErrSigInvalidRecoveryCode is returned when a signature that should be a
94 // compact signature has an invalid value for the public key recovery code.
95 ErrSigInvalidRecoveryCode = ErrorKind("ErrSigInvalidRecoveryCode")
96 97 // ErrSigOverflowsPrime is returned when a signature that should be a
98 // compact signature has the overflow bit set but adding the order to it
99 // would overflow the underlying field prime.
100 ErrSigOverflowsPrime = ErrorKind("ErrSigOverflowsPrime")
101 102 // ErrPointNotOnCurve is returned when attempting to recover a public key
103 // from a compact signature results in a point that is not on the elliptic
104 // curve.
105 ErrPointNotOnCurve = ErrorKind("ErrPointNotOnCurve")
106 )
107 108 // Error satisfies the error interface and prints human-readable errors.
109 func (e ErrorKind) Error() string {
110 return string(e)
111 }
112 113 // Error identifies an error related to an ECDSA signature. It has full
114 // support for errors.Is and errors.As, so the caller can ascertain the
115 // specific reason for the error by checking the underlying error.
116 type Error struct {
117 Err error
118 Description string
119 }
120 121 // Error satisfies the error interface and prints human-readable errors.
122 func (e Error) Error() string {
123 return e.Description
124 }
125 126 // Unwrap returns the underlying wrapped error.
127 func (e Error) Unwrap() error {
128 return e.Err
129 }
130 131 // signatureError creates an Error given a set of arguments.
132 func signatureError(kind ErrorKind, desc string) Error {
133 return Error{Err: kind, Description: desc}
134 }
135