FailedNo error information available: E_NOINTERFACE(0x80004002).

博客指出使用COM+自动事务时,用Access调用DTC会出现莫名其妙的错误代码,如E_NOINTERFACE(0x80004002),微软有相关kb文档。还给出了示例代码,包含HelloWorld函数及DrawMoneyFromA、DepostMoneyToB子过程,处理事务异常。

用COM+ 的自动事务,必须操作的对象支持,用access 调用dtc,会有莫名其妙的错误代码

FailedNo error information available: E_NOINTERFACE(0x80004002).

关于这个问题,微软有一片kb

http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q221071& 

 

 <WebMethod(transactionOption:=EnterpriseServices.TransactionOption.RequiresNew)> _
    Public Function HelloWorld() As String
        Try
            ContextUtil.EnableCommit()

            DrawMoneyFromA(1000)
            DepostMoneyToB(1000)
            ContextUtil.SetComplete()
            Return "OK!"
        Catch ex As Exception
            ContextUtil.SetAbort()
            Return "Failed" + ex.Message
        End Try


    End Function


    Public Sub DrawMoneyFromA(ByVal amount As Long)
        '从 A 中提取一定的钱
        Dim cnn As New OleDb.OleDbConnection(Me.OleDbConnection1.ConnectionString)
        cnn.Open()
        Dim cmd As New OleDb.OleDbCommand("Update bank set amount=amount - " & amount & " where bankaccount='A'", cnn)
        cmd.ExecuteNonQuery()

    End Sub

    Public Sub DepostMoneyToB(ByVal amount As Long)
        '从 B 加一定的钱
        Dim cnn As New OleDb.OleDbConnection(Me.OleDbConnection1.ConnectionString)
        cnn.Open()
        Dim cmd As New OleDb.OleDbCommand("Update bank set amount=amount + " & amount & " where bankaccount='B'", cnn)
        'Throw New Exception("ff")
        cmd.ExecuteNonQuery()

    End Sub

"""Support for dynamic COM client support. Introduction Dynamic COM client support is the ability to use a COM server without prior knowledge of the server. This can be used to talk to almost all COM servers, including much of MS Office. In general, you should not use this module directly - see below. Example >>> import win32com.client >>> xl = win32com.client.Dispatch("Excel.Application") # The line above invokes the functionality of this class. # xl is now an object we can use to talk to Excel. >>> xl.Visible = 1 # The Excel window becomes visible. """ import traceback from itertools import chain from types import MethodType import pythoncom # Needed as code we eval() references it. import win32com.client import winerror from pywintypes import IIDType from . import build debugging = 0 # General debugging debugging_attr = 0 # Debugging dynamic attribute lookups. LCID = 0x0 # These errors generally mean the property or method exists, # but can't be used in this context - eg, property instead of a method, etc. # Used to determine if we have a real error or not. ERRORS_BAD_CONTEXT = [ winerror.DISP_E_MEMBERNOTFOUND, winerror.DISP_E_BADPARAMCOUNT, winerror.DISP_E_PARAMNOTOPTIONAL, winerror.DISP_E_TYPEMISMATCH, winerror.E_INVALIDARG, ] ALL_INVOKE_TYPES = [ pythoncom.INVOKE_PROPERTYGET, pythoncom.INVOKE_PROPERTYPUT, pythoncom.INVOKE_PROPERTYPUTREF, pythoncom.INVOKE_FUNC, ] def debug_print(*args): if debugging: for arg in args: print(arg, end=" ") print() def debug_attr_print(*args): if debugging_attr: for arg in args: print(arg, end=" ") print() # get the type objects for IDispatch and IUnknown PyIDispatchType = pythoncom.TypeIIDs[pythoncom.IID_IDispatch] PyIUnknownType = pythoncom.TypeIIDs[pythoncom.IID_IUnknown] _GoodDispatchTypes = (str, IIDType) def _GetGoodDispatch(IDispatch, clsctx=pythoncom.CLSCTX_SERVER): # quick return for most common case if isinstance(IDispatch, PyIDispatchType): return IDispatch if isinstance(IDispatch, _GoodDispatchTypes): try: IDispatch = pythoncom.connect(IDispatch) except pythoncom.ole_error: IDispatch = pythoncom.CoCreateInstance( IDispatch, None, clsctx, pythoncom.IID_IDispatch ) else: # may already be a wrapped class. IDispatch = getattr(IDispatch, "_oleobj_", IDispatch) return IDispatch def _GetGoodDispatchAndUserName(IDispatch, userName, clsctx): # Get a dispatch object, and a 'user name' (ie, the name as # displayed to the user in repr() etc. if userName is None: if isinstance(IDispatch, str): userName = IDispatch ## ??? else userName remains None ??? else: userName = str(userName) return (_GetGoodDispatch(IDispatch, clsctx), userName) def _GetDescInvokeType(entry, invoke_type): # determine the wFlags argument passed as input to IDispatch::Invoke # Only ever called by __getattr__ and __setattr__ from dynamic objects! # * `entry` is a MapEntry with whatever typeinfo we have about the property we are getting/setting. # * `invoke_type` is either INVOKE_PROPERTYGET | INVOKE_PROPERTYSET and really just # means "called by __getattr__" or "called by __setattr__" if not entry or not entry.desc: return invoke_type if entry.desc.desckind == pythoncom.DESCKIND_VARDESC: return invoke_type # So it's a FUNCDESC - just use what it specifies. return entry.desc.invkind def Dispatch( IDispatch, userName=None, createClass=None, typeinfo=None, clsctx=pythoncom.CLSCTX_SERVER, ): IDispatch, userName = _GetGoodDispatchAndUserName(IDispatch, userName, clsctx) if createClass is None: createClass = CDispatch lazydata = None try: if typeinfo is None: typeinfo = IDispatch.GetTypeInfo() if typeinfo is not None: try: # try for a typecomp typecomp = typeinfo.GetTypeComp() lazydata = typeinfo, typecomp except pythoncom.com_error: pass except pythoncom.com_error: typeinfo = None olerepr = MakeOleRepr(IDispatch, typeinfo, lazydata) return createClass(IDispatch, olerepr, userName, lazydata=lazydata) def MakeOleRepr(IDispatch, typeinfo, typecomp): olerepr = None if typeinfo is not None: try: attr = typeinfo.GetTypeAttr() # If the type info is a special DUAL interface, magically turn it into # a DISPATCH typeinfo. if ( attr[5] == pythoncom.TKIND_INTERFACE and attr[11] & pythoncom.TYPEFLAG_FDUAL ): # Get corresponding Disp interface; # -1 is a special value which does this for us. href = typeinfo.GetRefTypeOfImplType(-1) typeinfo = typeinfo.GetRefTypeInfo(href) attr = typeinfo.GetTypeAttr() if typecomp is None: olerepr = build.DispatchItem(typeinfo, attr, None, 0) else: olerepr = build.LazyDispatchItem(attr, None) except pythoncom.ole_error: pass if olerepr is None: olerepr = build.DispatchItem() return olerepr def DumbDispatch( IDispatch, userName=None, createClass=None, clsctx=pythoncom.CLSCTX_SERVER, ): "Dispatch with no type info" IDispatch, userName = _GetGoodDispatchAndUserName(IDispatch, userName, clsctx) if createClass is None: createClass = CDispatch return createClass(IDispatch, build.DispatchItem(), userName) class CDispatch: def __init__(self, IDispatch, olerepr, userName=None, lazydata=None): if userName is None: userName = "<unknown>" self.__dict__["_oleobj_"] = IDispatch self.__dict__["_username_"] = userName self.__dict__["_olerepr_"] = olerepr self.__dict__["_mapCachedItems_"] = {} self.__dict__["_builtMethods_"] = {} self.__dict__["_enum_"] = None self.__dict__["_unicode_to_string_"] = None self.__dict__["_lazydata_"] = lazydata def __call__(self, *args): "Provide 'default dispatch' COM functionality - allow instance to be called" if self._olerepr_.defaultDispatchName: invkind, dispid = self._find_dispatch_type_( self._olerepr_.defaultDispatchName ) else: invkind, dispid = ( pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET, pythoncom.DISPID_VALUE, ) if invkind is not None: allArgs = (dispid, LCID, invkind, 1) + args return self._get_good_object_( self._oleobj_.Invoke(*allArgs), self._olerepr_.defaultDispatchName, None ) raise TypeError("This dispatch object does not define a default method") def __bool__(self): return True # ie "if object:" should always be "true" - without this, __len__ is tried. # _Possibly_ want to defer to __len__ if available, but I'm not sure this is # desirable??? def __repr__(self): return "<COMObject %s>" % (self._username_) def __str__(self): # __str__ is used when the user does "print(object)", so we gracefully # fall back to the __repr__ if the object has no default method. try: return str(self.__call__()) except pythoncom.com_error as details: if details.hresult not in ERRORS_BAD_CONTEXT: raise return self.__repr__() def __dir__(self): attributes = chain(self.__dict__, dir(self.__class__), self._dir_ole_()) try: attributes = chain(attributes, [p.Name for p in self.Properties_]) except AttributeError: pass return list(set(attributes)) def _dir_ole_(self): items_dict = {} for iTI in range(0, self._oleobj_.GetTypeInfoCount()): typeInfo = self._oleobj_.GetTypeInfo(iTI) self._UpdateWithITypeInfo_(items_dict, typeInfo) return list(items_dict) def _UpdateWithITypeInfo_(self, items_dict, typeInfo): typeInfos = [typeInfo] # suppress IDispatch and IUnknown methods inspectedIIDs = {pythoncom.IID_IDispatch: None} while len(typeInfos) > 0: typeInfo = typeInfos.pop() typeAttr = typeInfo.GetTypeAttr() if typeAttr.iid not in inspectedIIDs: inspectedIIDs[typeAttr.iid] = None for iFun in range(0, typeAttr.cFuncs): funDesc = typeInfo.GetFuncDesc(iFun) funName = typeInfo.GetNames(funDesc.memid)[0] if funName not in items_dict: items_dict[funName] = None # Inspect the type info of all implemented types # E.g. IShellDispatch5 implements IShellDispatch4 which implements IShellDispatch3 ... for iImplType in range(0, typeAttr.cImplTypes): iRefType = typeInfo.GetRefTypeOfImplType(iImplType) refTypeInfo = typeInfo.GetRefTypeInfo(iRefType) typeInfos.append(refTypeInfo) # Delegate comparison to the oleobjs, as they know how to do identity. def __eq__(self, other): other = getattr(other, "_oleobj_", other) return self._oleobj_ == other def __ne__(self, other): other = getattr(other, "_oleobj_", other) return self._oleobj_ != other def __int__(self): return int(self.__call__()) def __len__(self): invkind, dispid = self._find_dispatch_type_("Count") if invkind: return self._oleobj_.Invoke(dispid, LCID, invkind, 1) raise TypeError("This dispatch object does not define a Count method") def _NewEnum(self): try: invkind = pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET enum = self._oleobj_.InvokeTypes( pythoncom.DISPID_NEWENUM, LCID, invkind, (13, 10), () ) except pythoncom.com_error: return None # no enumerator for this object. from . import util return util.WrapEnum(enum, None) def __getitem__(self, index): # syver modified # Improved __getitem__ courtesy Syver Enstad # Must check _NewEnum before Item, to ensure b/w compat. if isinstance(index, int): if self.__dict__["_enum_"] is None: self.__dict__["_enum_"] = self._NewEnum() if self.__dict__["_enum_"] is not None: return self._get_good_object_(self._enum_.__getitem__(index)) # See if we have an "Item" method/property we can use (goes hand in hand with Count() above!) invkind, dispid = self._find_dispatch_type_("Item") if invkind is not None: return self._get_good_object_( self._oleobj_.Invoke(dispid, LCID, invkind, 1, index) ) raise TypeError("This object does not support enumeration") def __setitem__(self, index, *args): # XXX - todo - We should support calling Item() here too! # print("__setitem__ with", index, args) if self._olerepr_.defaultDispatchName: invkind, dispid = self._find_dispatch_type_( self._olerepr_.defaultDispatchName ) else: invkind, dispid = ( pythoncom.DISPATCH_PROPERTYPUT | pythoncom.DISPATCH_PROPERTYPUTREF, pythoncom.DISPID_VALUE, ) if invkind is not None: allArgs = (dispid, LCID, invkind, 0, index) + args return self._get_good_object_( self._oleobj_.Invoke(*allArgs), self._olerepr_.defaultDispatchName, None ) raise TypeError("This dispatch object does not define a default method") def _find_dispatch_type_(self, methodName): if methodName in self._olerepr_.mapFuncs: item = self._olerepr_.mapFuncs[methodName] return item.desc[4], item.dispid if methodName in self._olerepr_.propMapGet: item = self._olerepr_.propMapGet[methodName] return item.desc[4], item.dispid try: dispid = self._oleobj_.GetIDsOfNames(0, methodName) except: ### what error? return None, None return pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET, dispid def _ApplyTypes_(self, dispid, wFlags, retType, argTypes, user, resultCLSID, *args): result = self._oleobj_.InvokeTypes( *(dispid, LCID, wFlags, retType, argTypes) + args ) return self._get_good_object_(result, user, resultCLSID) def _wrap_dispatch_( self, ob, userName=None, returnCLSID=None, ): # Given a dispatch object, wrap it in a class return Dispatch(ob, userName) def _get_good_single_object_(self, ob, userName=None, ReturnCLSID=None): if isinstance(ob, PyIDispatchType): # make a new instance of (probably this) class. return self._wrap_dispatch_(ob, userName, ReturnCLSID) if isinstance(ob, PyIUnknownType): try: ob = ob.QueryInterface(pythoncom.IID_IDispatch) except pythoncom.com_error: # It is an IUnknown, but not an IDispatch, so just let it through. return ob return self._wrap_dispatch_(ob, userName, ReturnCLSID) return ob def _get_good_object_(self, ob, userName=None, ReturnCLSID=None): """Given an object (usually the retval from a method), make it a good object to return. Basically checks if it is a COM object, and wraps it up. Also handles the fact that a retval may be a tuple of retvals""" if ob is None: # Quick exit! return None elif isinstance(ob, tuple): return tuple( map( lambda o, s=self, oun=userName, rc=ReturnCLSID: s._get_good_single_object_(o, oun, rc), ob, ) ) else: return self._get_good_single_object_(ob) def _make_method_(self, name): "Make a method object - Assumes in olerepr funcmap" methodName = build.MakePublicAttributeName(name) # translate keywords etc. methodCodeList = self._olerepr_.MakeFuncMethod( self._olerepr_.mapFuncs[name], methodName, 0 ) methodCode = "\n".join(methodCodeList) try: # print(f"Method code for {self._username_} is:\n", methodCode) # self._print_details_() codeObject = compile(methodCode, "<COMObject %s>" % self._username_, "exec") # Exec the code object tempNameSpace = {} # "Dispatch" in the exec'd code is win32com.client.Dispatch, not ours. globNameSpace = globals().copy() globNameSpace["Dispatch"] = win32com.client.Dispatch exec( codeObject, globNameSpace, tempNameSpace ) # self.__dict__, self.__dict__ name = methodName # Save the function in map. fn = self._builtMethods_[name] = tempNameSpace[name] return MethodType(fn, self) except: debug_print("Error building OLE definition for code ", methodCode) traceback.print_exc() return None def _Release_(self): """Cleanup object - like a close - to force cleanup when you don't want to rely on Python's reference counting.""" for childCont in self._mapCachedItems_.values(): childCont._Release_() self._mapCachedItems_ = {} if self._oleobj_: self._oleobj_.Release() self.__dict__["_oleobj_"] = None if self._olerepr_: self.__dict__["_olerepr_"] = None self._enum_ = None def _proc_(self, name, *args): """Call the named method as a procedure, rather than function. Mainly used by Word.Basic, which whinges about such things.""" try: item = self._olerepr_.mapFuncs[name] dispId = item.dispid return self._get_good_object_( self._oleobj_.Invoke(*(dispId, LCID, item.desc[4], 0) + (args)) ) except KeyError: raise AttributeError(name) def _print_details_(self): "Debug routine - dumps what it knows about an object." print("AxDispatch container", self._username_) try: print("Methods:") for method in self._olerepr_.mapFuncs: print("\t", method) print("Props:") for prop, entry in self._olerepr_.propMap.items(): print(f"\t{prop} = 0x{entry.dispid:x} - {entry!r}") print("Get Props:") for prop, entry in self._olerepr_.propMapGet.items(): print(f"\t{prop} = 0x{entry.dispid:x} - {entry!r}") print("Put Props:") for prop, entry in self._olerepr_.propMapPut.items(): print(f"\t{prop} = 0x{entry.dispid:x} - {entry!r}") except: traceback.print_exc() def __LazyMap__(self, attr): try: if self._LazyAddAttr_(attr): debug_attr_print( f"{self._username_}.__LazyMap__({attr}) added something" ) return 1 except AttributeError: return 0 # Using the typecomp, lazily create a new attribute definition. def _LazyAddAttr_(self, attr): if self._lazydata_ is None: return 0 res = 0 typeinfo, typecomp = self._lazydata_ olerepr = self._olerepr_ # We need to explicitly check each invoke type individually - simply # specifying '0' will bind to "any member", which may not be the one # we are actually after (ie, we may be after prop_get, but returned # the info for the prop_put.) for i in ALL_INVOKE_TYPES: try: x, t = typecomp.Bind(attr, i) # Support 'Get' and 'Set' properties - see # bug 1587023 if x == 0 and attr[:3] in ("Set", "Get"): x, t = typecomp.Bind(attr[3:], i) if x == pythoncom.DESCKIND_FUNCDESC: # it's a FUNCDESC r = olerepr._AddFunc_(typeinfo, t, 0) elif x == pythoncom.DESCKIND_VARDESC: # it's a VARDESC r = olerepr._AddVar_(typeinfo, t, 0) else: # not found or TYPEDESC/IMPLICITAPP r = None if not r is None: key, map = r[0], r[1] item = map[key] if map == olerepr.propMapPut: olerepr._propMapPutCheck_(key, item) elif map == olerepr.propMapGet: olerepr._propMapGetCheck_(key, item) res = 1 except: pass return res def _FlagAsMethod(self, *methodNames): """Flag these attribute names as being methods. Some objects do not correctly differentiate methods and properties, leading to problems when calling these methods. Specifically, trying to say: ob.SomeFunc() may yield an exception "None object is not callable" In this case, an attempt to fetch the *property* has worked and returned None, rather than indicating it is really a method. Calling: ob._FlagAsMethod("SomeFunc") should then allow this to work. """ for name in methodNames: details = build.MapEntry(self.__AttrToID__(name), (name,)) self._olerepr_.mapFuncs[name] = details def __AttrToID__(self, attr): debug_attr_print( "Calling GetIDsOfNames for property {} in Dispatch container {}".format( attr, self._username_ ) ) return self._oleobj_.GetIDsOfNames(0, attr) def __getattr__(self, attr): if attr == "__iter__": # We can't handle this as a normal method, as if the attribute # exists, then it must return an iterable object. try: invkind = pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET enum = self._oleobj_.InvokeTypes( pythoncom.DISPID_NEWENUM, LCID, invkind, (13, 10), () ) except pythoncom.com_error: raise AttributeError("This object can not function as an iterator") # We must return a callable object. class Factory: def __init__(self, ob): self.ob = ob def __call__(self): import win32com.client.util return win32com.client.util.Iterator(self.ob) return Factory(enum) if attr.startswith("_") and attr.endswith("_"): # Fast-track. raise AttributeError(attr) # If a known method, create new instance and return. try: return MethodType(self._builtMethods_[attr], self) except KeyError: pass # XXX - Note that we current are case sensitive in the method. # debug_attr_print("GetAttr called for %s on DispatchContainer %s" % (attr,self._username_)) # First check if it is in the method map. Note that an actual method # must not yet exist, (otherwise we would not be here). This # means we create the actual method object - which also means # this code will never be asked for that method name again. if attr in self._olerepr_.mapFuncs: return self._make_method_(attr) # Delegate to property maps/cached items retEntry = None if self._olerepr_ and self._oleobj_: # first check general property map, then specific "put" map. retEntry = self._olerepr_.propMap.get(attr) if retEntry is None: retEntry = self._olerepr_.propMapGet.get(attr) # Not found so far - See what COM says. if retEntry is None: try: if self.__LazyMap__(attr): if attr in self._olerepr_.mapFuncs: return self._make_method_(attr) retEntry = self._olerepr_.propMap.get(attr) if retEntry is None: retEntry = self._olerepr_.propMapGet.get(attr) if retEntry is None: retEntry = build.MapEntry(self.__AttrToID__(attr), (attr,)) except pythoncom.ole_error: pass # No prop by that name - retEntry remains None. if retEntry is not None: # see if in my cache try: ret = self._mapCachedItems_[retEntry.dispid] debug_attr_print("Cached items has attribute!", ret) return ret except (KeyError, AttributeError): debug_attr_print("Attribute %s not in cache" % attr) # If we are still here, and have a retEntry, get the OLE item if retEntry is not None: invoke_type = _GetDescInvokeType(retEntry, pythoncom.INVOKE_PROPERTYGET) debug_attr_print( "Getting property Id 0x%x from OLE object" % retEntry.dispid ) try: ret = self._oleobj_.Invoke(retEntry.dispid, 0, invoke_type, 1) except pythoncom.com_error as details: if details.hresult in ERRORS_BAD_CONTEXT: # May be a method. self._olerepr_.mapFuncs[attr] = retEntry return self._make_method_(attr) raise debug_attr_print("OLE returned ", ret) return self._get_good_object_(ret) # no where else to look. raise AttributeError(f"{self._username_}.{attr}") def __setattr__(self, attr, value): if ( attr in self.__dict__ ): # Fast-track - if already in our dict, just make the assignment. # XXX - should maybe check method map - if someone assigns to a method, # it could mean something special (not sure what, tho!) self.__dict__[attr] = value return # Allow property assignment. debug_attr_print( f"SetAttr called for {self._username_}.{attr}={value!r} on DispatchContainer" ) if self._olerepr_: # Check the "general" property map. if attr in self._olerepr_.propMap: entry = self._olerepr_.propMap[attr] invoke_type = _GetDescInvokeType(entry, pythoncom.INVOKE_PROPERTYPUT) self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) return # Check the specific "put" map. if attr in self._olerepr_.propMapPut: entry = self._olerepr_.propMapPut[attr] invoke_type = _GetDescInvokeType(entry, pythoncom.INVOKE_PROPERTYPUT) self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) return # Try the OLE Object if self._oleobj_: if self.__LazyMap__(attr): # Check the "general" property map. if attr in self._olerepr_.propMap: entry = self._olerepr_.propMap[attr] invoke_type = _GetDescInvokeType( entry, pythoncom.INVOKE_PROPERTYPUT ) self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) return # Check the specific "put" map. if attr in self._olerepr_.propMapPut: entry = self._olerepr_.propMapPut[attr] invoke_type = _GetDescInvokeType( entry, pythoncom.INVOKE_PROPERTYPUT ) self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) return try: entry = build.MapEntry(self.__AttrToID__(attr), (attr,)) except pythoncom.com_error: # No attribute of that name entry = None if entry is not None: try: invoke_type = _GetDescInvokeType( entry, pythoncom.INVOKE_PROPERTYPUT ) self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) self._olerepr_.propMap[attr] = entry debug_attr_print( "__setattr__ property {} (id=0x{:x}) in Dispatch container {}".format( attr, entry.dispid, self._username_ ) ) return except pythoncom.com_error: pass raise AttributeError(f"Property '{self._username_}.{attr}' can not be set.") 结合这个文件
09-10
#include <stdio.h> #include <stdint.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/spi_master.h" #include "esp_log.h" #include "driver/gpio.h" void spi_test_task(void *arg) { spi_device_handle_t spi; spi_bus_config_t buscfg = { .miso_io_num = 11, .mosi_io_num = 14, .sclk_io_num = 13, .quadwp_io_num = -1, .quadhd_io_num = -1, }; spi_device_interface_config_t devcfg = { .mode = 3, .clock_speed_hz = 100 * 1000, .spics_io_num = -1, // 手动 CS .queue_size = 1, }; spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_DISABLED); spi_bus_add_device(SPI2_HOST, &devcfg, &spi); uint8_t tx_data = 0xAA; uint8_t rx_data = 0; spi_transaction_t t = { .length = 8, .tx_buffer = &tx_data, .rx_buffer = &rx_data, }; while (1) { gpio_set_level(12, 0); // 拉低 CS spi_device_polling_transmit(spi, &t); gpio_set_level(12, 1); // 拉高 CS ESP_LOGI("SPI_TEST", "Sent 0xAA"); vTaskDelay(1000 / portTICK_PERIOD_MS); } } void app_main() { gpio_set_direction(12, GPIO_MODE_OUTPUT); gpio_set_level(12, 1); xTaskCreate(spi_test_task, "spi_test", 2048, NULL, 10, NULL); } 输出 Rebooting... ESP-ROM:esp32s3-20210327 Build:Mar 27 2021 rst:0xc (RTC_SW_CPU_RST),boot:0x28 (SPI_FAST_FLASH_BOOT) Saved PC:0x40375b14 SPIWP:0xee mode:DIO, clock div:1 load:0x3fce2810,len:0x15a0 load:0x403c8700,len:0x4 load:0x403c8704,len:0xd20 load:0x403cb700,len:0x2f00 entry 0x403c8928 I (31) boot: ESP-IDF v5.4.1 2nd stage bootloader I (31) boot: compile time Sep 20 2025 09:36:29 I (31) boot: Multicore bootloader I (32) boot: chip revision: v0.2 I (34) boot: efuse block revision: v1.3 I (38) boot.esp32s3: Boot SPI Speed : 80MHz I (42) boot.esp32s3: SPI Mode : DIO I (46) boot.esp32s3: SPI Flash Size : 2MB I (49) boot: Enabling RNG early entropy source... I (54) boot: Partition Table: I (56) boot: ## Label Usage Type ST Offset Length I (63) boot: 0 nvs WiFi data 01 02 00009000 00006000 I (69) boot: 1 phy_init RF data 01 01 0000f000 00001000 I (76) boot: 2 factory factory app 00 00 00010000 00100000 I (82) boot: End of partition table I (85) esp_image: segment 0: paddr=00010020 vaddr=3c020020 size=0c6a8h ( 50856) map I (102) esp_image: segment 1: paddr=0001c6d0 vaddr=3fc94c00 size=02c80h ( 11392) load I (105) esp_image: segment 2: paddr=0001f358 vaddr=40374000 size=00cc0h ( 3264) load I (109) esp_image: segment 3: paddr=00020020 vaddr=42000020 size=1ee88h (126600) map I (138) esp_image: segment 4: paddr=0003eeb0 vaddr=40374cc0 size=0fe60h ( 65120) load I (152) esp_image: segment 5: paddr=0004ed18 vaddr=600fe100 size=0001ch ( 28) load I (159) boot: Loaded app from partition at offset 0x10000 I (159) boot: Disabling RNG early entropy source... I (170) cpu_start: Multicore app I (179) cpu_start: Pro cpu start user code I (179) cpu_start: cpu freq: 160000000 Hz I (179) app_init: Application information: I (179) app_init: Project name: gatt_multi_connect I (184) app_init: App version: 1 I (187) app_init: Compile time: Sep 20 2025 09:34:24 I (192) app_init: ELF file SHA256: f7ec25548... I (197) app_init: ESP-IDF: v5.4.1 I (201) efuse_init: Min chip rev: v0.0 I (204) efuse_init: Max chip rev: v0.99 I (208) efuse_init: Chip rev: v0.2 I (212) heap_init: Initializing. RAM available for dynamic allocation: I (219) heap_init: At 3FC98168 len 000515A8 (325 KiB): RAM I (224) heap_init: At 3FCE9710 len 00005724 (21 KiB): RAM I (229) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM I (234) heap_init: At 600FE11C len 00001ECC (7 KiB): RTCRAM I (240) spi_flash: detected chip: winbond I (243) spi_flash: flash io: dio W (246) spi_flash: Detected size(16384k) larger than the size in the binary image header(2048k). Using the size in the binary image header. I (258) sleep_gpio: Configure to isolate all GPIO pins in sleep state I (265) sleep_gpio: Enable automatic switching of GPIO sleep configuration I (271) coexist: coex firmware version: e727207 I (289) coexist: coexist rom version e7ae62f I (290) main_task: Started on CPU0 I (300) main_task: Calling app_main() I (300) SPI_TEST: Sent 0xAA assert failed: xQueueSemaphoreTake queue.c:1713 (pxQueue->uxItemSize == 0) Backtrace: 0x40375bd5:0x3fc9cee0 0x4037b635:0x3fc9cf00 0x40382bb5:0x3fc9cf20 0x4037bd66:0x3fc9d040 0x4037be76:0x3fc9d080 0x40376cad:0x3fc9d0a0 0x40376d8d:0x3fc9d0d0 0x42008859:0x3fc9d0f0 0x4200905e:0x3fc9d110 0x42010146:0x3fc9d130 0x42008a5d:0x3fc9d150 0x4200905e:0x3fc9d170 0x4200fb0a:0x3fc9d190 0x4200f339:0x3fc9d1b0 0x4200f38a:0x3fc9d1d0 0x4200f989:0x3fc9d1f0 0x4201682b:0x3fc9d220 0x42016232:0x3fc9d240 0x4200fb81:0x3fc9d560 0x4201ee26:0x3fc9d590 0x40382a0d:0x3fc9d5c0 0x42009c09:0x3fc9d610 0x4037bf39:0x3fc9d6d0 四个引脚制作pvc板时已经固定,无法更改
09-24
/* * This file is part of the openHiTLS project. * * openHiTLS is licensed under the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: * * http://license.coscl.org.cn/MulanPSL2 * * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ /** * @defgroup crypt_errno * @ingroup crypt * @brief error number module of crypto module */ #ifndef CRYPT_ERRNO_H #define CRYPT_ERRNO_H #ifdef __cplusplus extern "C" { #endif /** * @ingroup crypt_errno * @brief Return success */ #define CRYPT_SUCCESS 0 /** * @ingroup crypt_errno * * CRYPTO module return value. */ enum CRYPT_ERROR { CRYPT_NULL_INPUT = 0x01010001, /**< Null pointer input error, bufferLen is 0. */ CRYPT_SECUREC_FAIL, /**< Security function returns an error. */ CRYPT_MEM_ALLOC_FAIL, /**< Failed to apply for memory. */ CRYPT_NO_REGIST_RAND, /**< The global random number is not registered.*/ CRYPT_ERR_ALGID, /**< Incorrect algorithm ID. */ CRYPT_INVALID_ARG, /**< Invalid input parameter. */ CRYPT_NOT_SUPPORT, /**< unsupported operation. */ CRYPT_INCONSISTENT_OPERATION, /**< Inconsistent operation. */ CRYPT_INVALID_KEY, /**< invalid key. */ CRYPT_PAIRWISE_CHECK_FAIL, /**< key-pair check failed. */ CRYPT_BN_BUFF_LEN_NOT_ENOUGH = 0x01020001, /**< Insufficient buffer length. */ CRYPT_BN_SPACE_NOT_ENOUGH, /**< Insufficient big number space. */ CRYPT_BN_BITS_TOO_MAX, /**< The maximum bit limit is exceeded of the big number. */ CRYPT_BN_RAND_GEN_FAIL, /**< Failed to generate the random number. */ CRYPT_BN_OPTIMIZER_STACK_FULL, /**< Optimizer stack is full. */ CRYPT_BN_NO_NEGATIVE_ZERO, /**< The big number is set to a positive number only. */ CRYPT_BN_ERR_RAND_ZERO, /**< Generates a random number smaller than 0. */ CRYPT_BN_ERR_RAND_NEGATIVE, /**< Generate a negative random number. */ CRYPT_BN_ERR_RAND_TOP_BOTTOM, /**< The top or bottom is invalid during random number generation. */ CRYPT_BN_ERR_RAND_BITS_NOT_ENOUGH, /**< The bit is too small during random number generation. */ CRYPT_BN_OPTIMIZER_GET_FAIL, /**< Failed to obtain the space from the optimizer. */ CRYPT_BN_ERR_DIVISOR_ZERO, /**< The divisor cannot be 0. */ CRYPT_BN_ERR_EXP_NO_NEGATIVE, /**< The value of exponent cannot be negative. */ CRYPT_BN_MONT_BASE_TOO_MAX, /**< Montgomery module exponentiation base is too large. */ CRYPT_BN_NOR_GEN_PRIME, /**< Prime Number Generation Failure. */ CRYPT_BN_NOR_CHECK_PRIME, /**< prime number check failed. */ CRYPT_BN_ERR_GCD_NO_ZERO, /**< The maximum common divisor cannot contain 0. */ CRYPT_BN_ERR_NO_INVERSE, /**< Cannot obtain the inverse module. */ CRYPT_BN_ERR_SQRT_PARA, /**< The parameter is incorrect when modulus square root. */ CRYPT_BN_ERR_LEGENDE_DATA, /**< Failed to find a specific number for z to p's Legendre sign (z|p) equal to -1 when calculating the square root. */ CRYPT_BN_ERR_NO_SQUARE_ROOT, /**< The square root cannot be found. */ CRYPT_BN_ERR_MASKCOPY_LEN, /**< Data lengths are inconsistent when data is copied with masks. */ CRYPT_BN_ERR_QUICK_MODDATA, /**< Uses the BN_ModNistEccMul and BN_ModNistEccSqr interfaces, the module data is not supported. */ CRYPT_BN_FLAG_INVALID, /**< Invalid big number flag. */ CRYPT_BN_CONVERT_INPUT_INVALID, /**< Invalid input parameter of big number strings. */ CRYPT_BN_NOT_SUPPORT_EXTENSION, /**< The big number does not support dynamic extension. */ CRYPT_BN_INPUT_INVALID, /**< Invalid external big number input. */ CRYPT_BN_BITS_INVALID, /**< The bits of the big number exceeds the limit. */ CRYPT_BN_ERR_SWAP_LEN, /**< Data lengths are inconsistent when data is swapped with masks. */ CRYPT_RSA_BUFF_LEN_NOT_ENOUGH = 0x01030001, /**< The buffer length is insufficient. */ CRYPT_RSA_NO_KEY_INFO, /**< Lacks valid key information. */ CRYPT_RSA_ERR_KEY_BITS, /**< Incorrect key length. */ CRYPT_RSA_ERR_E_VALUE, /**< The value of parameter e is incorrect. */ CRYPT_RSA_NOR_KEYGEN_FAIL, /**< Key generation failure, it's normal error. */ CRYPT_RSA_NOR_VERIFY_FAIL, /**< Failed to verify the signature. it's normal error. */ CRYPT_RSA_ERR_ENC_BITS, /**< Incorrect length of the encrypted plaintext of the public key. */ CRYPT_RSA_ERR_DEC_BITS, /**< Incorrect length of the decrypted ciphertext of the private key. */ CRYPT_RSA_ERR_PSS_SALT_LEN, /**< Incorrect salt length of the PSS operation. */ CRYPT_RSA_ERR_PSS_SALT_DATA, /**< PSS operation salt data error, failed to compare the salt extracted during signature verification with the user's input. */ CRYPT_RSA_ERR_PKCSV15_SALT_LEN, /**< Incorrect salt length of the PKCSV15 operation. */ CRYPT_RSA_ERR_PKCSV15_SALT_DATA, /**< PKCSV15 salt data error. */ CRYPT_RSA_ERR_INPUT_VALUE, /**< Some special values, which are used as input errors. */ CRYPT_RSA_ERR_MD_ALGID, /**< The hash ID of the input parameter is incorrect when the pkcs1.5 padding mode is set. */ CRYPT_RSA_PAD_NO_SET_ERROR, /**< Padding information is not set when using RSA key for signature verification. */ CRYPT_RSA_CTRL_NOT_SUPPORT_ERROR, /**< The Ctrl type is not supported When RSA is used for Ctrl. */ CRYPT_RSA_SET_SALT_NOT_PSS_ERROR, /**< When the padding type of the key is not pss, and set the salt information, return failure. */ CRYPT_RSA_SET_EMS_PKCSV15_LEN_ERROR,/**< Sets the PKCSV15 padding information, the length of the input data is incorrect and return failure. */ CRYPT_RSA_SET_EMS_PSS_LEN_ERROR, /**< Sets the PSS padding information, the length of the input data is incorrect, and return failure. */ CRYPT_RSA_SET_RSAES_OAEP_LEN_ERROR, /**< Sets the OAEP padding information, the length of the input data is incorrect and return failure. */ CRYPT_RSA_SET_FLAG_LEN_ERROR, /**< The length of the input data is incorrect and return failure When sets the flag. */ CRYPT_RSA_FLAG_NOT_SUPPORT_ERROR, /**< Unsupported flag. */ CRYPT_RSA_ERR_SALT_LEN, /**< Salt length error. */ CRYPT_RSA_ERR_ALGID, /**< The hash ID of the input parameter is incorrect or conflict occurs when sets the signature, signature verification, and padding parameters. */ CRYPT_RSA_ERR_GEN_SALT, /**< An error is returned when salt information fails to be generated during PSS signature. */ CRYPT_RSA_ERR_ENC_INPUT_NOT_ENOUGH, /**< The plaintext length is too short for RSA NO PAD encryption. */ CRYPT_RSA_ERR_DATA_LEN, /**< Incorrect encryption length. */ CRYPT_RSA_ERR_PAD_NUM, /**< Incorrect padding length. */ CRYPT_RSA_PUBKEY_NOT_EQUAL, /**< RSA public keys are not equal. */ CRYPT_RSA_KEYPAIRWISE_CONSISTENCY_FAILURE, /**< RSA pair-wise consistency failure. */ CRYPT_RSA_ERR_BLIND_TYPE, /**< Invalid RSA blinding type. Only RSA-BSSA is currently supported. */ CRYPT_RSA_ERR_NO_BLIND_INFO, /**< RSA blinding information is missing. The blind/unblind operation requires previous blinding parameters. */ CRYPT_RSA_ERR_NO_PUBKEY_INFO, /**< The rsa pub key is missing. */ CRYPT_RSA_PADDING_NOT_SUPPORTED, /**< The specified RSA padding mode is not supported in blinding. */ CRYPT_RSA_ERR_BSSA_PARAM, /**< The param of bssa is not invalid. */ CRYPT_RSA_GET_SALT_LEN_ERROR, /**< The input length of getting salt-len is incorrect. */ CRYPT_RSA_GET_SALT_NOT_PSS_ERROR, /**< When the padding type of the key is not pss, and get the salt len. */ CRYPT_RSA_ERR_PSS_PARAMS, /**< The parameter is error when the padding type of the key is pss. */ CRYPT_RSA_ERR_NO_PRVKEY_INFO, /**< The rsa prv key is missing. */ CRYPT_RSA_ERR_INVALID_PRVKEY, /**< The private key is invalid. */ CRYPT_EAL_BUFF_LEN_NOT_ENOUGH = 0x01040001, /**< Insufficient buffer length. */ CRYPT_EAL_BUFF_LEN_TOO_LONG, /**< Insufficient buffer length. */ CRYPT_EAL_ERR_ALGID, /**< Incorrect algorithm ID. */ CRYPT_EAL_ALG_NOT_SUPPORT, /**< Algorithm not supported, algorithm behavior not supported. */ CRYPT_EAL_ERR_NEW_PARA_FAIL, /**< Failed to generate parameters. */ CRYPT_EAL_ERR_RAND_WORKING, /**< DRBG is in the working state. */ CRYPT_EAL_ERR_RAND_NO_WORKING, /**< DRBG is not working. */ CRYPT_EAL_ERR_METH_NULL_MEMBER, /**< The method variable member is NULL. */ CRYPT_EAL_ERR_GLOBAL_DRBG_NULL, /**< The global DRBG is null. */ CRYPT_EAL_ERR_DRBG_REPEAT_INIT, /**< DRBG is initialized repeatedly. */ CRYPT_EAL_ERR_DRBG_INIT_FAIL, /**< DRBG initialization failure. */ CRYPT_EAL_ERR_STATE, /**< The usage process is incorrect. For example, run the update command without running the init command. For details, see related algorithms. */ CRYPT_EAL_CIPHER_DATA_ERROR, /**< Data error occurs when unpadding the decrypted data. For X923, the last bit is the length of the original data, and the rest data is 0, if this requirement is not met, an error is reported. For pkcs, all padding data is (the length of the padding data - the length of the original data), if this requirement is not met,an error will be reported. For ISO7816, the first bit of padding data is 0x80, and the other bits are 0, if this requirement is not met, an error will be reported. */ CRYPT_EAL_PADDING_NOT_SUPPORT, /**< Unsupported padding. */ CRYPT_EAL_CIPHER_CTRL_ERROR, /**< CRYPT_EAL_CipherCtrl interface unsupported CTRL type. */ CRYPT_EAL_CIPHER_FINAL_WITH_AEAD_ERROR, /**< An error occurs when the final operation is performed on the AEAD algorithm. */ CRYPT_EAL_PKEY_CTRL_ERROR, /**< When the CRYPT_EAL_PkeyCtrl interface performs CTRL, the function is not supported or the input length is incorrect. */ CRYPT_EAL_MAC_CTRL_TYPE_ERROR, /**< When the CRYPT_EAL_PkeyCtrl interface performs CTRL, the function is not supported or the input length is incorrect. */ CRYPT_EAL_PKEY_DUP_ERROR, /**< Pkey context duplicate failure. */ CRYPT_EAL_PKEY_CMP_DIFF_KEY_TYPE, /**< Pkey comparison failure: different algorithm types. */ CRYPT_EAL_ERR_PART_OVERLAP, /**< Some memory overlap. */ CRYPT_EAL_INTO_TYPE_NOT_SUPPORT, /**< The info type is not supported. */ CRYPT_EAL_ALG_ASM_NOT_SUPPORT, /**< Algorithm assembly is not supported. */ CRYPT_EAL_CIPHER_ERR_NEWCTX, CRYPT_EAL_PKEY_CHECK_ERROR, /**< Pkey check failure. */ CRYPT_EAL_MD_METH_NULL, CRYPT_SHA2_INPUT_OVERFLOW = 0x01050001, /**< The length of the input data exceeds the maximum processing range of SHA2. */ CRYPT_SHA2_OUT_BUFF_LEN_NOT_ENOUGH, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_DRBG_ERR_STATE = 0x01060001, /**< DRBG status error. */ CRYPT_DRBG_FAIL_GET_ENTROPY, /**< Failed to obtain the entropy. */ CRYPT_DRBG_FAIL_GET_NONCE, /**< Failed to obtain the nonce. */ CRYPT_DRBG_ALG_NOT_SUPPORT, /**< Does not support the given algorithm. */ CRYPT_DRBG_INVALID_LEN, /**< Incorrect data length. */ CRYPT_DRBG_PARAM_ERROR, /**< Incorrect input parameter. */ CRYPT_CURVE25519_NO_PUBKEY = 0x01080001, /**< No public key. */ CRYPT_CURVE25519_NO_PRVKEY, /**< No private key. */ CRYPT_CURVE25519_KEYLEN_ERROR, /**< Incorrect key length. */ CRYPT_CURVE25519_SIGNLEN_ERROR, /**< Incorrect signature length. */ CRYPT_CURVE25519_HASH_METH_ERROR, /**< Hash method is not SHA512. */ CRYPT_CURVE25519_VERIFY_FAIL, /**< Signature verification fails due to incorrect signature. */ CRYPT_CURVE25519_NO_HASH_METHOD, /**< Hash method not set. */ CRYPT_CURVE25519_UNSUPPORTED_CTRL_OPTION, /**< Unsupported mode of operation. */ CRYPT_CURVE25519_KEY_COMPUTE_FAILED, /**< Failed to generate the shared key. */ CRYPT_CURVE25519_INVALID_PUBKEY, /**< Invalid public key. */ CRYPT_CURVE25519_PUBKEY_NOT_EQUAL, /**< Public keys are not equal. */ CRYPT_CURVE25519_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_CURVE25519_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_SHA1_INPUT_OVERFLOW = 0x01090001, /**< The length of the input data exceeds the maximum processing range of SHA1. */ CRYPT_SHA1_OUT_BUFF_LEN_NOT_ENOUGH, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_ENTROPY_RCT_FAILURE = 0x010A0001, /**< RCT detection fails, restart the entropy source. */ CRYPT_ENTROPY_APT_FAILURE, /**< APT detection fails, restart the entropy source. */ CRYPT_ENTROPY_CONDITION_FAILURE, /**< Processing method error after invoking. */ CRYPT_ENTROPY_RANGE_ERROR, /**< Entropy source generation range error */ CRYPT_ENTROPY_ECF_ALG_ERROR, /**< Entropy source conditioning algorithm is incorrect. */ CRYPT_ENTROPY_ECF_IS_ERROR, /**< Entropy source conditioning is incorrect. */ CRYPT_ENTROPY_ES_CREATE_ERROR, /**< Entropy pool creation error. */ CRYPT_ENTROPY_ES_STATE_ERROR, /**< Incorrect entropy pool status. */ CRYPT_ENTROPY_ES_CTRL_ERROR, /**< Incorrect entropy pool settings. */ CRYPT_ENTROPY_ES_NO_NS, /**< No available noise source in the entropy pool. */ CRYPT_ENTROPY_ES_NS_NOT_FOUND, /**< Noise source not found. */ CRYPT_ENTROPY_ES_DUP_NS, /**< Noise source Repetition. */ CRYPT_ENTROPY_ES_NS_NOT_AVA, /**< Noise source not available. */ CRYPT_ENTROPY_ES_NS_FULL, /**< Noise source list is full. */ CRYPT_ENTROPY_ES_CF_NOT_SUPPORT, /**< Nonditioning function not supported. */ CRYPT_ENTROPY_ES_CF_ERROR, /**< Nonditioning function error. */ CRYPT_ENTROPY_ES_ENTROPY_NOT_ENOUGH, /**< Not getting enough entropy. */ CRYPT_ENTROPY_ES_POOL_ERROR, /**< Entropy pool error. */ CRYPT_ENTROPY_ES_POOL_INSUFFICIENT, /**< Entropy pool capacity is insufficient. */ CRYPT_ENTROPY_CTRL_INVALID_PARAM, /**< Entropy invalid parameter. */ CRYPT_DSA_BUFF_LEN_NOT_ENOUGH = 0x010B0001, /**< Insufficient buffer length. */ CRYPT_DSA_ERR_KEY_PARA, /**< Incorrect key parameter data. */ CRYPT_DSA_ERR_KEY_INFO, /**< Incorrect key information. */ CRYPT_DSA_VERIFY_FAIL, /**< Verification failure. */ CRYPT_DSA_ERR_TRY_CNT, /**< Key generation and signature fail to be generated within the specified number of attempts. */ CRYPT_DSA_DECODE_FAIL, /**< Data decoding fails, the data does not meet the decoding requirements. */ CRYPT_DSA_UNSUPPORTED_CTRL_OPTION, /**< Unsupported mode of operation. */ CRYPT_DSA_PARA_ERROR, /**< The value of the key parameter does not meet the requirements. The ctx command does not contain necessary parameter information. */ CRYPT_DSA_PUBKEY_NOT_EQUAL, /**< Public keys are not equal. */ CRYPT_DSA_PARA_NOT_EQUAL, /**< Key parameters are not equal. */ CRYPT_DSA_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_DSA_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_HMAC_OUT_BUFF_LEN_NOT_ENOUGH = 0x010C0001, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_HMAC_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_HMAC_ERR_NO_MD_LIB_CTX, /**< MD library context not set. */ CRYPT_HMAC_PARAM_ERROR, /**< Incorrect input parameter. */ CRYPT_DH_BUFF_LEN_NOT_ENOUGH = 0x010D0001, /**< The buffer length is insufficient. */ CRYPT_DH_PARA_ERROR, /**< The value of the key parameter does not meet the requirements, the ctx command does not contain necessary parameter information. */ CRYPT_DH_KEYINFO_ERROR, /**< The value of the public and private keys do not meet the requirements, the ctx does not contain the necessary public and private keys. */ CRYPT_DH_RAND_GENERATE_ERROR, /**< Key generation fails within the specified number of attempts. */ CRYPT_DH_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_DH_UNSUPPORTED_CTRL_OPTION, /**< Unsupported mode of operation. */ CRYPT_DH_CREATE_PARA_FAIL, /**< Failed to create the p, q, and g parameters of the DH algorithm. */ CRYPT_DH_PUBKEY_NOT_EQUAL, /**< Public keys are not equal. */ CRYPT_DH_PARA_NOT_EQUAL, /**< DH key parameters are not equal. */ CRYPT_DH_SET_FLAG_LEN_ERROR, /**< The length of the input data is incorrect and return failure when setting the flag. */ CRYPT_DH_FLAG_NOT_SUPPORT_ERROR, /**< Unsupported flag. */ CRYPT_DH_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_CHACHA20_KEYLEN_ERROR = 0x010E0001, /**< The key length input is incorrect during key setting. */ CRYPT_CHACHA20_NONCELEN_ERROR, /**< The length of the input nounce is incorrect when you set the nounce. */ CRYPT_CHACHA20_COUNTLEN_ERROR, /**< The length of the input count is incorrect when you set the count. */ CRYPT_CHACHA20_NO_KEYINFO, /**< Lack of valid key information during encryption and decryption. */ CRYPT_CHACHA20_NO_NONCEINFO, /**< Lack of valid nounce information during encryption and decryption. */ CRYPT_CHACHA20_CTRLTYPE_ERROR, /**< The input type is not supported when the ctrl interface is used. */ CRYPT_AES_ERR_KEYLEN = 0x010F0001, /**< Incorrect key length. */ CRYPT_MODES_TAGLEN_ERROR = 0x01100001, /**< In AEAD mode, the length of the TAG is incorrect when the tag is obtained and verified. */ CRYPT_MODES_IVLEN_ERROR, /**< The length of the input IV is incorrect when setting the IV. */ CRYPT_MODES_KEYUSE_TOOMANY_TIME, /**< In GCM mode, the number of times that a key can be used for encryption and decryption is limited. When the number of times that a key is used exceeds the limit, an error is reported. */ CRYPT_MODES_CRYPTLEN_OVERFLOW, /**< In AEAD mode, the length of the plaintext or ciphertext input for a single encryption exceeds the limit. */ CRYPT_MODES_CTRL_TAGLEN_ERROR, /**< In GCM or CCM mode, the length of the input parameter or the length of the input parameter data is incorrect when the ctrl interface is used to set the tag length. */ CRYPT_MODES_AAD_REPEAT_SET_ERROR, /**< In the AEAD mode, the AAD information is set repeatedly. */ CRYPT_MODE_BUFF_LEN_NOT_ENOUGH, /**< The buffer length is insufficient. */ CRYPT_MODE_ERR_INPUT_LEN, /**< The function input length is not the expected length. */ CRYPT_MODES_CTRL_TYPE_ERROR, /**< The input type is not supported when the ctrl interface is used. */ CRYPT_MODES_AAD_IS_SET_ERROR, /**< In ccm mode, an error is returned when the tagLen and msgLen are set after the aad is set. */ CRYPT_MODES_MSGLEN_OVERFLOW, /**< In ccm mode, the length of the input message during encryption and decryption exceeds the set msgLen. */ CRYPT_MODES_CTRL_MSGLEN_ERROR, /**< In ccm mode, When the ctrl interface is used to set the msg length, the input parameter length or the input parameter data length is incorrect. (This specification is affected by ivLen.) */ CRYPT_MODES_MSGLEN_LEFT_ERROR, /**< In ccm mode, when the ctrl interface is used to obtain the tag, the length of the encrypted and decrypted messages does not reach the configured number. As a result, an error occurs. */ CRYPT_MODES_ERR_KEYLEN, /**< Incorrect key length set. */ CRYPT_MODES_ERR_KEY, /**< Incorrect key set. */ CRYPT_MODES_ERR_FEEDBACKSIZE, /**< The operation are not support by the algorithm on which the pattern depends on. */ CRYPT_MODES_METHODS_NOT_SUPPORT, /**< Mode depends does not support the behavior. */ CRYPT_MODES_FEEDBACKSIZE_NOT_SUPPORT, /**< The algorithm does not support the setting of feedbacksize. */ CRYPT_MODES_PADDING_NOT_SUPPORT, /**< Unsupported padding. */ CRYPT_HKDF_DKLEN_OVERFLOW = 0x01110001, /**< The length of the derived key exceeds the maximum. */ CRYPT_HKDF_NOT_SUPPORTED, /**< Unsupport HKDF algorithm. */ CRYPT_HKDF_PARAM_ERROR, /**< Incorrect input parameter. */ CRYPT_HKDF_ERR_MAC_ID_NOT_SET, /**< Mac id not set. */ CRYPT_HKDF_ERR_MAC_METH, /**< Mac method err. */ CRYPT_CMAC_OUT_BUFF_LEN_NOT_ENOUGH = 0x01120001, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_CMAC_INPUT_OVERFLOW, /**< The input length exceeds the limit. As a result, the integer type is reversed. */ CRYPT_CMAC_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_GMAC_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_SCRYPT_PARAM_ERROR = 0x01130001, /**< Incorrect input parameter. */ CRYPT_SCRYPT_NOT_SUPPORTED, /**< Unsupport the SCRYPT algorithm. */ CRYPT_SCRYPT_DATA_TOO_MAX, /**< The data calculated by the SCRYPT algorithm is too large. */ CRYPT_PBKDF2_PARAM_ERROR = 0x01150001, /**< Incorrect input parameter. */ CRYPT_PBKDF2_NOT_SUPPORTED, /**< Does not support the PBKDF2 algorithm. */ CRYPT_PBKDF2_ERR_MAC_METH, /**< Mac method err. */ CRYPT_PBKDF2_ERR_MAC_ID_NOT_SET, /**< Mac id not set. */ CRYPT_ECC_POINT_AT_INFINITY = 0x01160001, /**< Point at infinity. */ CRYPT_ECC_POINT_NOT_ON_CURVE, /**< Point is not on the curve. */ CRYPT_ECC_POINT_ERR_CURVE_ID, /**< Curve ID is inconsistent or incorrect. */ CRYPT_ECC_POINT_WINDOW_TOO_MAX, /**< Window is too max. */ CRYPT_ECC_POINT_NOT_EQUAL, /**< The two points are not equal. */ CRYPT_ECC_POINT_BLIND_WITH_ZERO, /**< The random number generated during point salting is 0. */ CRYPT_ECC_POINT_NOT_AFFINE, /**< Point is not affine coordinates. */ CRYPT_ECC_NOT_SUPPORT, /**< This function is not supported. */ CRYPT_ECC_POINT_MUL_ERR_K_LEN, /** The scalar length exceeds the curve specification when using the dot multiplication function */ CRYPT_ECC_BUFF_LEN_NOT_ENOUGH, /**< Insufficient buffer length. */ CRYPT_ECC_ERR_POINT_FORMAT, /**< The encoding format input during point encoding is incorrect. */ CRYPT_ECC_ERR_POINT_CODE, /**< Incorrect point code information. */ CRYPT_ECC_PKEY_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_ECC_PKEY_ERR_EMPTY_KEY, /**< Key is null. */ CRYPT_ECC_PKEY_ERR_INVALID_POINT_FORMAT, /**< Invalid dot format. */ CRYPT_ECC_PKEY_ERR_CTRL_LEN, /**< Control input parameter is incorrect. */ CRYPT_ECC_PKEY_ERR_INVALID_PRIVATE_KEY, /**< Invalid private key. */ CRYPT_ECC_PKEY_ERR_INVALID_PUBLIC_KEY, /**< Invalid public key. */ CRYPT_ECC_PKEY_ERR_TRY_CNT, /**< Key generation or generater signature fail within the specified number of attempts. */ CRYPT_ECC_PKEY_ERR_SIGN_LEN, /**< Invalid sign length */ CRYPT_ECC_ERR_PARA, /**< Incorrect curve parameter. */ CRYPT_ECC_INVERSE_INPUT_ZERO, /** Modulo inverse input is 0. */ CRYPT_ECC_KEY_PUBKEY_NOT_EQUAL, /**< ECC public keys are not equal. */ CRYPT_ECC_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_ECC_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_SHA3_OUT_BUFF_LEN_NOT_ENOUGH = 0x01170001, /**< Insufficient buffer length for storing output results. */ CRYPT_SHA3_INVALID_STATE, /**< Invalid state. */ CRYPT_ECDH_ERR_UNSUPPORT_CURVE_TYPE = 0x01180001, /**< Unsupported curve type. */ CRYPT_ECDH_ERR_EMPTY_KEY, /**< Key is null. */ CRYPT_ECDH_ERR_INVALID_COFACTOR, /**< Invalid cofactor value. */ CRYPT_ECDH_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_ECDH_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_ECDSA_ERR_EMPTY_KEY = 0x01190001, /**< Key is NULL. */ CRYPT_ECDSA_ERR_TRY_CNT, /**< Key generation and generate signature fail within the specified number of attempts. */ CRYPT_ECDSA_VERIFY_FAIL, /**< Verification failure. */ CRYPT_ECDSA_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_ECDSA_BUFF_LEN_NOT_ENOUGH, /**< BUFF insufficient length. */ CRYPT_ECDSA_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_ECDSA_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_SM3_INPUT_OVERFLOW = 0x011A0001, /**< The length of the input data exceeds the maximum processing range of the SM3. */ CRYPT_SM3_OUT_BUFF_LEN_NOT_ENOUGH, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_SM4_ERR_IV_LEN = 0x011B0001, /**< Wrong key length set. */ CRYPT_SM4_ERR_MSG_LEN, /**< Wrong data length is set. */ CRYPT_SM4_ERR_KEY_LEN, /**< Wrong key length is set. */ CRYPT_SM4_UNSAFE_KEY, /**< DataKey is the same as tweakKey. */ CRYPT_MD5_INPUT_OVERFLOW = 0x011D0001, /**< The length of the input data exceeds the maximum processing range of the MD5. */ CRYPT_MD5_OUT_BUFF_LEN_NOT_ENOUGH, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_MD_ERR_NEWCTX, /**< create md ctx failed. */ CRYPT_SM2_BUFF_LEN_NOT_ENOUGH = 0x01200001, /**< Insufficient buffer length. */ CRYPT_SM2_NO_PUBKEY, /**< SM2 the public key is not set. */ CRYPT_SM2_NO_PRVKEY, /**< SM2 The private key is not set. */ CRYPT_SM2_ERR_EMPTY_KEY, /**< SM2 key is null. */ CRYPT_SM2_ERR_TRY_CNT, /**< Key generation and generate signature fail within the specified number of attempts. */ CRYPT_SM2_VERIFY_FAIL, /**< verification failure. */ CRYPT_SM2_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupported control type. */ CRYPT_SM2_ERR_NO_HASH_METHOD, /**< No hash method information. */ CRYPT_SM2_USERID_NOT_SET, /**< Unset userID. */ CRYPT_SM2_R_NOT_SET, /**< The peer R value is not set. */ CRYPT_SM2_INVALID_SERVER_TYPE, /**< The user is neither the initiator nor the recipient. */ CRYPT_SM2_ERR_CTRL_LEN, /**< Incorrect ctrl length. */ CRYPT_SM2_DECRYPT_FAIL, /**< Decryption failure. */ CRYPT_SM2_ERR_DATA_LEN, /**< Incorrect data length. */ CRYPT_SM2_ERR_GET_S, /**< Failed to obtain the checksum. */ CRYPT_SM2_ERR_S_NOT_SET, /**< Unset checksum. */ CRYPT_SM2_EXCH_VERIFY_FAIL, /**< Key Negotiation Failure. */ CRYPT_SM2_DECODE_FAIL, /**< Data decoding fails, the data does not meet the decoding requirements. */ CRYPT_SM2_ID_TOO_LARGE, /**< User id to large. */ CRYPT_SM2_K_REPEAT_SET_ERROR, /**< the random k is set repeatedly*/ CRYPT_SM2_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_SM2_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_KDFTLS12_NOT_SUPPORTED = 0x01210001, /**< Unsupport the KDFTLS12 algorithm. */ CRYPT_KDFTLS12_PARAM_ERROR, /**< Incorrect input parameter. */ CRYPT_KDFTLS12_ERR_MAC_METH, /**< Mac method err. */ CRYPT_KDFTLS12_ERR_MAC_ID_NOT_SET, /**< Mac id not set. */ CRYPT_SIPHASH_OUT_BUFF_LEN_NOT_ENOUGH = 0x01220001, /**< The buffer size for storing the output result is insufficient. */ CRYPT_SIPHASH_INPUT_OVERFLOW, CRYPT_SIPHASH_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_CBC_MAC_ERR_CTRL_LEN = 0x01240001, CRYPT_CBC_MAC_ERR_UNSUPPORTED_CTRL_OPTION, CRYPT_CBC_MAC_PADDING_NOT_SET, CRYPT_CBC_MAC_PADDING_NOT_SUPPORT, CRYPT_CBC_MAC_OUT_BUFF_LEN_NOT_ENOUGH, CRYPT_SEED_POOL_NEW_ERROR = 0x01290001, /**< The length of the key input is incorrect when setting the key. */ CRYPT_SEED_POOL_STATE_ERROR, /**< Incorrect seed pool status. */ CRYPT_SEED_POOL_ES_LIST_FULL, /**< The number of entropy sources exceeds the upper limit. */ CRYPT_SEED_POOL_NO_SUFFICIENT_ENTROPY, /**< The seed pool cannot provide sufficient entropy. */ CRYPT_SEED_POOL_NO_ENTROPY_SOURCE, /**< The seed pool has no entropy source. */ CRYPT_SEED_POOL_NO_ENTROPY_OBTAINED, /**< No entropy data is obtained from the seed pool. */ CRYPT_SEED_POOL_NOT_MEET_REQUIREMENT, /**< The entropy data does not meet the requirements. */ CRYPT_ENTROPY_CTX_CREATE_FAILED, /**< Failed to create the handle for obtaining the entropy. */ CRYPT_MLKEM_KEYLEN_ERROR = 0x01300001, /**< Incorrect input data length. */ CRYPT_MLKEM_LEN_NOT_ENOUGH, /**<The buffer size of output is insufficient. */ CRYPT_MLKEM_KEY_NOT_SET, /**<The encaps or decaps key not set. */ CRYPT_MLKEM_KEYINFO_NOT_SET, /**<The algorithm not set. */ CRYPT_MLKEM_KEY_NOT_EQUAL, /**< The MLKEM keys are not equal. */ CRYPT_MLKEM_CTRL_NOT_SUPPORT, /**< The Ctrl type is not supported.*/ CRYPT_MLKEM_CTRL_INIT_REPEATED, /**< The CTX cannot be initialized repeatedly.*/ CRYPT_MLKEM_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_MLKEM_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_HPKE_ERR_GEN_ASYM_KEY = 0x01310001, /**< HPKE Generate asymmetric key error. */ CRYPT_HPKE_ERR_AEAD_TAG, /**< Failed to verify AEAD tag when decrypt. */ CRYPT_HPKE_ERR_CALL, /**< It is not appropriate to call this function. */ CRYPT_HPKE_FAILED_FETCH_CIPHER, /**< Failed to fetch cipher. */ CRYPT_HPKE_FAILED_FETCH_PKEY, /**< Failed to fetch pkey. */ CRYPT_HPKE_FAILED_FETCH_KDF, /**< Failed to fetch kdf. */ CRYPT_DECODE_ASN1_BUFF_NUM_NOT_ENOUGH = 0x01320001, /**< The input number of BSL_ANS1_Buffer is not enough. */ CRYPT_DECODE_UNSUPPORTED_PUBKEY_TYPE, /**< Unsupported pubkey type */ CRYPT_DECODE_UNSUPPORTED_PKCS8_TYPE, /**< Unsupported pkcs8 type */ CRYPT_DECODE_PKCS8_INVALID_ALGO_PARAM, /**< pkcs8 has no valid algorithm parameters */ CRYPT_DECODE_UNKNOWN_OID, /**< Unknown OID */ CRYPT_DECODE_ASN1_BUFF_FAILED, /**< decode asn1 buffer failed. */ CRYPT_DECODE_NO_SUPPORT_TYPE, /**< decode no support key type. */ CRYPT_DECODE_NO_SUPPORT_FORMAT, /**< decode no support key format. */ CRYPT_DECODE_PKCS8_INVALID_ITER, /**< pkcs8 invalid iter num */ CRYPT_DECODE_PKCS8_INVALID_KEYLEN, /**< pkcs8 invalid keylen */ CRYPT_DECODE_ERR_RSSPSS_GET_ANY_TAG, /**< decode rsapss param failed. */ CRYPT_DECODE_ERR_RSSPSS, /**< decode rsapss param failed. */ CRYPT_DECODE_ERR_RSSPSS_MD, /**< rsapss md is invalid. */ CRYPT_DECODE_ERR_RSSPSS_MGF1MD, /**< rsapss mgf1md is invalid. */ CRYPT_DECODE_ERR_RSSPSS_TRAILER, /**< rsapss trailer field is invalid. */ CRYPT_DECODE_PKCS7_INVALIDE_ENCRYPTDATA_TYPE, /**< Invaild pkcs7-encryptedData. */ CRYPT_DECODE_UNSUPPORTED_PKCS7_TYPE, /**< Unsupported pkcs7 type */ CRYPT_DECODE_UNSUPPORTED_ENCRYPT_TYPE, /**< Unsupported encrypt type */ CRYPT_DECODE_BUFF_NOT_ENOUGH, /**< The input buffer space is not enough */ CRYPT_DECODE_ASN1_BUFF_LEN_ZERO, /**< The decoding length of asn1 buffer is zero. */ CRYPT_DECODE_ERR_NO_DECODER, /**< No decoder found. */ CRYPT_DECODE_ERR_NO_USABLE_DECODER, /**< No decoder found. */ CRYPT_DECODE_RETRY, /**< Retry decode. */ CRYPT_DECODE_ERR_CURR_NODE_NOT_FOUND, /**< Current node not found. */ CRYPT_DECODE_ERR_NO_KEY_TYPE, /**< No key type found. */ CRYPT_DECODE_ERR_KEY_TYPE_NOT_MATCH, /**< Key type not match. */ CRYPT_ENCODE_NO_SUPPORT_TYPE = 0x01330001, /**< encode no support key type. */ CRYPT_ENCODE_NO_SUPPORT_FORMAT, /**< encode no support key format. */ CRYPT_ENCODE_ERR_RSA_PAD, /**< rsa pad err. */ CRYPT_ENCODE_BUFF_NOT_ENOUGH, /**< The input buffer space is not enough */ CRYPT_ENCODE_ERR_SIGN_LEN_OVERFLOW, /**< The r and s length is too large. */ CRYPT_ENCODE_ERR_SM2_ENCRYPT_DATA_LEN_OVERFLOW, /**< The sm2 encrypt data length is too large. */ CRYPT_DECODE_PRINT_UNSUPPORT_ALG = 0x01340001, /**< Failed to print unsupported alg. */ CRYPT_DECODE_PRINT_NO_KEY, /**< Failed to print key. */ CRYPT_DECODE_PRINT_KEYBITS, /**< Failed to print key bist. */ CRYPT_DECODE_PRINT_MODULUS, /**< Failed to print modulus. */ CRYPT_DECODE_PRINT_EXPONENT, /**< Failed to print exponent. */ CRYPT_DECODE_PRINT_RSAPSS_PARA, /**< Failed to print rsapss para. */ CRYPT_DECODE_PRINT_ECC_PUB, /**< Failed to print ecc pubkey. */ CRYPT_DECODE_PRINT_ECC_OID, /**< Failed to print ecc oid. */ CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL = 0x01350001, /**< Unexpected impl */ CRYPT_PROVIDER_ERR_IMPL_NULL, CRYPT_PROVIDER_NOT_FOUND, /**< Provider not found. */ CRYPT_PROVIDER_NOT_SUPPORT, CRYPT_PROVIDER_ERR_ATTRIBUTE, CRYPT_PROVIDER_INVALID_LIB_CTX, CRYPT_MLDSA_KEYINFO_NOT_SET = 0x01360001, /**< The algorithm not set. */ CRYPT_MLDSA_CTRL_NOT_SUPPORT, /**< The Ctrl type is not supported. */ CRYPT_MLDSA_PAD_TOO_LONG, /**< The pad is too long. */ CRYPT_MLDSA_KEYLEN_ERROR, /**< Incorrect input data length. */ CRYPT_MLDSA_SIGN_DATA_ERROR, /**< Invalid signature value. */ CRYPT_MLDSA_VERIFY_FAIL, /**< Failed to verify the signature. */ CRYPT_MLDSA_KEY_NOT_SET, /**< The public key or private not set. */ CRYPT_MLDSA_LEN_NOT_ENOUGH, /**< The buffer size of output is insufficient. */ CRYPT_MLDSA_KEY_NOT_EQUAL, /**< The MLDSA keys are not equal. */ CRYPT_MLDSA_CTRL_INIT_REPEATED, /**< The CTX cannot be initialized repeatedly.*/ CRYPT_MLDSA_SET_KEY_FAILED, /**< Failed to set the key. */ CRYPT_MLDSA_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_MLDSA_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_MLDSA_INVALID_PUBKEY, /**< Invalid public key. */ CRYPT_ELGAMAL_BUFF_LEN_NOT_ENOUGH = 0x01370001, /**< The buffer length is insufficient. */ CRYPT_ELGAMAL_NO_KEY_INFO, /**< Lacks valid key information. */ CRYPT_ELGAMAL_ERR_KEY_BITS, /**< Incorrect key length. */ CRYPT_ELGAMAL_ERR_ENC_BITS, /**< Incorrect length of the encrypted plaintext of the public key. */ CRYPT_ELGAMAL_ERR_DEC_BITS, /**< Incorrect length of the decrypted ciphertext of the private key. */ CRYPT_ELGAMAL_ERR_KEY_KBITS, /**< Incorrect key length. */ CRYPT_ELGAMAL_ERR_KEY_BITS_KBITS, /**< Incorrect key length. */ CRYPT_ELGAMAL_ERR_ENC_KBITS, /**< Incorrect length of the encrypted plaintext of the public key. */ CRYPT_ELGAMAL_ERR_DEC_KBITS, /**< Incorrect length of the decrypted ciphertext of the private key. */ CRYPT_ELGAMAL_ERR_INPUT_VALUE, /**< Some special values, which are used as input errors. */ CRYPT_ELGAMAL_CTRL_NOT_SUPPORT_ERROR, /**< The Ctrl type is not supported When elgamal is used for Ctrl. */ CRYPT_SLHDSA_ERR_INVALID_ALGID = 0x01380001, /**< The algorithm id is invalid. */ CRYPT_SLHDSA_ERR_INVALID_SIG_LEN, /**< The signature length is invalid. */ CRYPT_SLHDSA_ERR_INVALID_KEYLEN, /**< The key length is invalid. */ CRYPT_SLHDSA_ERR_SIG_LEN_NOT_ENOUGH, /**< The signature length is not enough. */ CRYPT_SLHDSA_ERR_HYPERTREE_VERIFY_FAIL, /**< Hypertree verify failed. */ CRYPT_SLHDSA_ERR_PREHASH_ID_NOT_SUPPORTED, /**< Prehash id is not supported. */ CRYPT_SLHDSA_ERR_CONTEXT_LEN_OVERFLOW, /**< Context length is overflow. */ CRYPT_SLHDSA_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_SLHDSA_ERR_NO_PUBKEY, /**< No public key. */ CRYPT_SLHDSA_ERR_NO_PRVKEY, /**< No private key. */ CRYPT_PAILLIER_BUFF_LEN_NOT_ENOUGH = 0x01390001, /**< The buffer length is insufficient. */ CRYPT_PAILLIER_NO_KEY_INFO, /**< Lacks valid key information. */ CRYPT_PAILLIER_ERR_KEY_BITS, /**< Incorrect key length. */ CRYPT_PAILLIER_ERR_ENC_BITS, /**< Incorrect length of the encrypted plaintext of the public key. */ CRYPT_PAILLIER_ERR_DEC_BITS, /**< Incorrect length of the decrypted ciphertext of the private key. */ CRYPT_PAILLIER_ERR_INPUT_VALUE, /**< Some special values, which are used as input errors. */ CRYPT_PAILLIER_CTRL_NOT_SUPPORT_ERROR, /**< The Ctrl type is not supported When paillier is used for Ctrl. */ CRYPT_XMSS_ERR_INVALID_ALGID = 0x013A0001, /**< The algorithm id is invalid. */ CRYPT_XMSS_ERR_INVALID_SIG_LEN, /**< The signature length is invalid. */ CRYPT_XMSS_ERR_INVALID_KEYLEN, /**< The key length is invalid. */ CRYPT_XMSS_ERR_KEY_EXPIRED, /**< The key has expired. */ CRYPT_CMVP_COMMON_ERR = 0x013B0001, /**< Common error in CMVP selftest. */ CRYPT_CMVP_ERR_INTEGRITY, /**< Integrity error in CMVP selftest. */ CRYPT_CMVP_RANDOMNESS_ERR, /**< Randomness error in CMVP selftest. */ CRYPT_CMVP_ERR_ALGO_SELFTEST, /**< Algorithm selftest error in CMVP selftest. */ CRYPT_CMVP_ERR_PAIRWISETEST, /**< Pairwise test error in CMVP selftest. */ CRYPT_CMVP_ERR_PARAM_CHECK, /**< Parameter check error in CMVP selftest. */ }; #ifdef __cplusplus } #endif #endif // CRYPT_ERRNO_H /home/wsk/Desktop/openhitls/testcode/demo/RSA-2048.c: In function ‘main’: /home/wsk/Desktop/openhitls/testcode/demo/RSA-2048.c:46:35: error: ‘CRYPT_CTRL_SET_RSA_MODULUS_BITS’ undeclared (first use in this function); did you mean ‘CRYPT_CTRL_GET_ECC_ORDER_BITS’? 46 | ret = CRYPT_EAL_PkeyCtrl(ctx, CRYPT_CTRL_SET_RSA_MODULUS_BITS, NULL, 2048); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | CRYPT_CTRL_GET_ECC_ORDER_BITS /home/wsk/Desktop/openhitls/testcode/demo/RSA-2048.c:46:35: note: each undeclared identifier is reported only once for each function it appears in [ 80%] Built target sm2sign [ 88%] Built target ecdh make[2]: *** [CMakeFiles/RSA-2048.dir/build.make:82: CMakeFiles/RSA-2048.dir/RSA-2048.c.o] Error 1 make[1]: *** [CMakeFiles/Makefile2:227: CMakeFiles/RSA-2048.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.... [ 96%] Built target sm2enc make: *** [Makefile:103: all] Error 2
09-07
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值