包 | flash.security |
类 | public class XMLSignatureValidator |
继承 | XMLSignatureValidator EventDispatcher Object |
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
AIR 配置文件支持:所有桌面操作系统和 AIR for TV 设备均支持此功能,但移动设备不支持此功能。您可以使用 XMLSignatureValidator.isSupported
属性在运行时测试是否受支持。有关在多个配置文件之间支持 API 的详细信息,请参阅 AIR 配置文件支持。
XMLSignatureValidator 针对 XML 签名语法和处理实现 W3C 建议的子集,XMLSignatureValidator 不应视为符合该建议的实现。该建议支持的子集包括:
- 除 KeyInfo 元素外的所有核心签名语法。
- KeyInfo 元素仅支持 X509Data 元素。
- X509Data 元素仅支持 X509Certificate 元素。
- SHA256 摘要方法算法。
- PKCS1 签名算法。
- “不带注释的规范化 XML”规范化方法和转换算法。
- 采用其他签名语法的 Manifest 元素。
必须提供 IURIDereferencer 实现才能验证 XML 签名。此实现类负责解析签名文件的 SignedInfo 元素中指定的 URI 并返回实现 IDataInput 接口的对象(如 ByteArray)中引用的数据。
为了验证签名证书是否链接到受信任的证书,XML 签名必须以 X509Certificate 元素的形式包含构建链所需的证书,或者您必须使用 addCertificate()
方法提供构建该链所需的证书。
验证 XMLSignature:
- 创建 XMLSignatureValidator 类的实例。
- 将该实例的
uriDereferencer
属性设置为 IURIDereferencer 实现类的实例。 - 需要时,使用
addCertificate
方法提供 DER 编码的证书以便构建证书信任链。 - 调用 XMLSignatureValidator
verify
方法,传入要验证的签名。 - XMLSignatureValidator 对象调度 complete 事件后,检查
validityStatus
属性。
关于签名状态:
XML 签名的有效性可以为 valid、invalid 或 unknown。整体状态取决于签名文件各个组件的验证状态:
-
digestStatus
— 通过 SignedInfo 元素计算的加密签名的有效性。可以是valid
、invalid
或unknown
。 -
identityStatus
— 签名证书的有效性。如果证书已到期、已吊销或已更改,则该状态为invalid
。如果无法将证书链接到受信任的根证书,则该状态为unknown
。如果摘要无效,则不检查证书。如果不检查证书,状态将报告为unknown
。 -
referencesStatus
— 签名文件的 SignedInfo 元素中引用定址的数据的有效性。可以是valid
、invalid
或unknown
。如果摘要或证书无效,则不检查引用。还可以根据referencesValidationSetting
属性的设置跳过引用检查。如果不检查证书,状态将报告为unknown
。
由 validityStatus
属性报告的签名有效性可以为:
-
valid
— 如果referencesStatus
、digestStatus
和identityStatus
全部为valid
。 -
invalid
— 如果其中任一状态为invalid
。 -
unknown
— 如果referencesStatus
、digestStatus
或identityStatus
为unknown
。
规范化限制:
AIR 中的 XML 引擎对 XML 文档进行规范化时,并不总是能生成预期的 XML 字符串。因此,建议避免在已包封或已分离的签名文档中放置元素间空白,且不要重新定义签名文档内的命名空间。在这两种情况下,AIR 都可能无法重新创建具有相同字符序列的文档,进而导致验证失败。
了解详细信息
相关 API 元素
属性 | 由以下参数定义 | ||
---|---|---|---|
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
digestStatus : String [只读]
通过签名 SignedInfo 元素计算的加密签名的有效性状态。 | XMLSignatureValidator | ||
identityStatus : String [只读]
签名证书的有效性状态。 | XMLSignatureValidator | ||
isSupported : Boolean [静态] [只读]
如果当前平台支持 XMLSignatureValidator 类,则 isSupported 属性设置为 true,否则,设置为 false。 | XMLSignatureValidator | ||
referencesStatus : String [只读]
签名 SignedInfo 元素中引用数据的有效性状态。 | XMLSignatureValidator | ||
referencesValidationSetting : String
指定在什么条件下检查引用。 | XMLSignatureValidator | ||
revocationCheckSetting : String
指定如何检查证书吊销。 | XMLSignatureValidator | ||
signerCN : String [只读]
签名证书的“公共名称”字段。 | XMLSignatureValidator | ||
signerDN : String [只读]
签名证书的“识别名称”字段。 | XMLSignatureValidator | ||
signerExtendedKeyUsages : Array [只读]
包含签名证书中列出的扩展密钥用法 OID 的数组。 | XMLSignatureValidator | ||
signerTrustSettings : Array [只读]
包含签名证书的信任设置的数组。 | XMLSignatureValidator | ||
uriDereferencer : IURIDereferencer
IURIDereferencer 实现。 | XMLSignatureValidator | ||
useSystemTrustStore : Boolean
指定使用系统信任存储中的证书来构建链。 | XMLSignatureValidator | ||
validityStatus : String [只读]
经过验证的 XML 签名的有效性状态。 | XMLSignatureValidator |
方法 | 由以下参数定义 | ||
---|---|---|---|
创建 XMLSignatureValidator 对象。 | XMLSignatureValidator | ||
添加 x509 证书以构建链。 | XMLSignatureValidator | ||
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。 | EventDispatcher | ||
将事件调度到事件流中。 | EventDispatcher | ||
检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。 | EventDispatcher | ||
表示对象是否已经定义了指定的属性。 | Object | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
从 EventDispatcher 对象中删除侦听器。 | EventDispatcher | ||
设置循环操作动态属性的可用性。 | Object | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | Object | ||
验证指定的签名。 | XMLSignatureValidator | ||
检查是否用此 EventDispatcher 对象或其任何祖代为指定事件类型注册了事件侦听器。 | EventDispatcher |
事件 | 摘要 | 由以下参数定义 | ||
---|---|---|---|---|
[广播事件] Flash Player 或 AIR 应用程序获得操作系统焦点并变为活动状态时将调度此事件。 | EventDispatcher | |||
在完成验证时调度。 | XMLSignatureValidator | |||
[广播事件] Flash Player 或 AIR 应用程序失去操作系统焦点并变为非活动状态时将调度此事件。 | EventDispatcher | |||
由于错误而无法完成验证时调度。 | XMLSignatureValidator |
digestStatus | 属性 |
digestStatus:String
[只读] 语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
通过签名 SignedInfo 元素计算的加密签名的有效性状态。
状态为:
valid
- 如果签名加密有效。invalid
- 如果在签名后更改了摘要。unknown
— 如果尚未调用verify()
方法。
注意:如果 digestStatus
无效,则不检查 identityStatus
和 referencesStatus
,并会将其报告为 unknown
。
实现
public function get digestStatus():String
引发
IllegalOperationError — 如果在正在验证签名时访问。
|
identityStatus | 属性 |
identityStatus:String
[只读] 语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
签名证书的有效性状态。
该状态可以是:
valid
- 证书尚未过期,吊销检查未失败且链接到受信任的根证书。unknown
— 证书尚未过期,吊销检查没有失败,但没有链接到受信任的根证书。尚未验证状态时也会报告unknown
,不管是因为尚未调用verify()
方法还是因为 SignedInfo 元素 (digestStatus
) 的加密签名无效。invalid
— 证书已过期或吊销检查失败。
无论证书是否被视为有效,使用 addCertificate()
方法添加的证书以及 revocationCheckSetting
和 useSystemTrustStore
属性的设置都可以进行更改。
注意:如果 identityStatus
无效,则不检查 referencesStatus
,并会将其报告为 unknown
。此外,当 identityStatus
为 unknown 时,不检查引用,除非 referencesValidationSetting
为 validOrUnknownIdentity
实现
public function get identityStatus():String
引发
IllegalOperationError — 如果在正在验证签名时访问。
|
相关 API 元素
示例 ( 如何使用本示例 )
import flash.security.XMLSignatureValidator; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate a signature... var identityResult:String = verifier.identityStatus;
isSupported | 属性 |
referencesStatus | 属性 |
referencesStatus:String
[只读] 语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
签名 SignedInfo 元素中引用数据的有效性状态。
该状态可以是:
valid
- 如果所有引用都有效。invalid
- 如果任何引用无效。unknown
- 如果未验证。在以下环境中引用可以保持未验证状态:- 尚未调用
verify()
方法 - SignedInfo 元素的加密签名 (
digestStatus
) 无效。 - 签名证书 (
identityStatus
) 无效 referencesValidationSetting
为validIdentity
(默认设置),且签名证书的identityStatus
未知。referencesValidationSetting
为never
。
- 尚未调用
重要说明:不验证外部资源,除非在签名文档内的 SignedInfo 元素中直接引用这些外部资源。不验证辅助引用所指的外部资源。例如,如果 XML 签名签署了一个 manifest 元素,则仅验证 manifest 元素自身的完整性。不检查 manifest 中列出的文件。
实现
public function get referencesStatus():String
引发
IllegalOperationError — 如果在正在验证签名时访问。
|
相关 API 元素
示例 ( 如何使用本示例 )
import flash.security.XMLSignatureValidator; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate a signature... var dataResult:String = verifier.referencesStatus;
referencesValidationSetting | 属性 |
referencesValidationSetting:String
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.5 |
指定在什么条件下检查引用。
使用 ReferencesValidationSetting 类中定义的常量来设置此属性。这些设置包括:
ReferencesValidationSetting.VALID_IDENTITY
- 仅在签名证书有效且与受信任的根有联系时检查引用。这是默认设置。ReferencesValidationSetting.VALID_OR_UNKNOWN_IDENTITY
- 如果签名证书有效,即使与受信任的根无联系,也会检查引用。ReferencesValidationSetting.NEVER
— 从不检查引用。
对于以商业证书签署的签名,或当您以 addCertificate()
方法提供自己的证书作为受信任的锚记时,将使用默认设置 validIdentity
。在已签名文档无论如何都会被拒绝时,此设置避免了检查引用有效性的开销。
对于以自签名证书签署的签名,将使用 validOrUnknownIdentity
设置。此设置使您可以验证已签名的数据未被更改,但无法确定签名者的身份。
此类验证对您的应用程序并不重要时,使用 never
设置可避免验证引用的开销。
实现
public function get referencesValidationSetting():String
public function set referencesValidationSetting(value:String):void
引发
IllegalOperationError — 如果在正在验证签名时设置。
| |
ArgumentError — 如果 setting 参数包含 ReferencesValidationSetting 类中未定义的值。
|
相关 API 元素
示例 ( 如何使用本示例 )
import flash.security.ReferencesValidationSetting; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); verifier.referencesValidationSetting = ReferencesValidationSetting.VALID_OR_UNKNOWN_IDENTITY;
revocationCheckSetting | 属性 |
revocationCheckSetting:String
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
指定如何检查证书吊销。
使用 RevocationSettings 类中定义的常量来设置此属性。这些设置包括:
RevocationCheckSettings.NEVER
- 不检查证书吊销。RevocationCheckSettings.BEST_EFFORT
- 如果吊销信息可用且可以获取吊销状态,则检查证书吊销。如果无法明确确定吊销状态,则不拒绝该证书。RevocationCheckSettings.REQUIRED_IF_AVAILABLE
- 如果证书包括吊销信息,则必须明确确定吊销状态以验证该证书。RevocationCheckSettings.ALWAYS_REQUIRED
- 始终检查证书吊销。拒绝没有吊销信息的证书。
实现
public function get revocationCheckSetting():String
public function set revocationCheckSetting(value:String):void
引发
IllegalOperationError — 如果在正在验证签名时设置。
|
相关 API 元素
signerCN | 属性 |
signerDN | 属性 |
signerExtendedKeyUsages | 属性 |
signerExtendedKeyUsages:Array
[只读] 语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
包含签名证书中列出的扩展密钥用法 OID 的数组。
每种扩展密钥用法均以数字 OID 形式进行报告。
实现
public function get signerExtendedKeyUsages():Array
引发
IllegalOperationError — 如果在正在验证签名时访问。
|
示例 ( 如何使用本示例 )
import flash.security.XMLSignatureValidator; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate a signature... var extendedKeyOIDs:Array = verifier.signerExtendedKeyUsages;
signerTrustSettings | 属性 |
signerTrustSettings:Array
[只读] 语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
包含签名证书的信任设置的数组。
信任设置是从系统和证书中嵌入的密钥用法 OID 中派生的。用作表示已识别的信任设置的字符串的常量在 SignerTrustSettings 类中定义。
unknown
或 invalid
证书的 signerTrustSettings
数组为空数组。
修改该数组不会更改证书信任设置。
实现
public function get signerTrustSettings():Array
引发
IllegalOperationError — 如果在正在验证签名时访问。
|
相关 API 元素
示例 ( 如何使用本示例 )
import flash.security.XMLSignatureValidator; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate a signature... var certificateTrustedFor:Array = verifier.signerTrustSettings;
uriDereferencer | 属性 |
uriDereferencer:IURIDereferencer
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
IURIDereferencer 实现。
尝试验证签名之前必须提供 IURIDereferencer 实现。
实现
public function get uriDereferencer():IURIDereferencer
public function set uriDereferencer(value:IURIDereferencer):void
引发
IllegalOperationError — 如果在正在验证签名时设置。
|
相关 API 元素
示例 ( 如何使用本示例 )
import com.example.SignedMessageDereferencer; //A custom class implementing IURIDereferencer var verifier:XMLSignatureValidator = new XMLSignatureValidator(); verifier.uriDereferencer = new SignedMessageDereferencer();
useSystemTrustStore | 属性 |
useSystemTrustStore:Boolean
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
指定使用系统信任存储中的证书来构建链。
如果为 true
,则使用系统信任存储中的信任锚记作为受信任的根。默认情况下不使用系统信任存储。
实现
public function get useSystemTrustStore():Boolean
public function set useSystemTrustStore(value:Boolean):void
引发
IllegalOperationError — 如果在正在验证签名时设置。
|
示例 ( 如何使用本示例 )
var verifier:XMLSignatureValidator = new XMLSignatureValidator(); verifier.useSystemTrustStore = true;
validityStatus | 属性 |
validityStatus:String
[只读] 语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
经过验证的 XML 签名的有效性状态。
验证 XML 签名的途径是验证 SignedInfo 元素的加密签名、签名证书以及 SignedInfo 元素中引用所指的数据。这些元素中每个元素的有效性分别由 digestStatus
、identityStatus()
和 referencesStatus
属性进行报告。
XML 签名的有效性可以为 valid、invalid 或 unknown。整体状态取决于签名文件各个组件的验证状态:
digestStatus
- 通过 SignedInfo 元素计算的加密签名的有效性。identityStatus
- 签名证书的有效性。referencesStatus
- 签名 SignedInfo 元素中引用摘要的有效性。
由 validityStatus
属性报告的签名有效性可以为:
valid
— 如果referencesStatus
、digestStatus
和identityStatus
全部为valid
。invalid
— 如果其中任一状态为invalid
。unknown
- 如果其中任何一个状态为unknown
。
实现
public function get validityStatus():String
引发
IllegalOperationError — 如果在正在验证签名时访问。
|
相关 API 元素
示例 ( 如何使用本示例 )
import flash.security.XMLSignatureValidator; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); //validate the signature... var validationResult:String = verifier.validityStatus;
XMLSignatureValidator | () | 构造函数 |
public function XMLSignatureValidator()
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
创建 XMLSignatureValidator 对象。
在调用新对象的 verify()
方法之前必须设置 uriDereferencer
属性。
相关 API 元素
示例 ( 如何使用本示例 )
import com.example.EnvelopedDereferencer; //Your custom IURIDereferencer implementation //Create the object var verifier:XMLSignatureValidator = new XMLSignatureValidator(); //Provide the IURIDerferencer verifier.uriDereferencer = new EnvelopedDereferencer(xmlDoc); //Set validation options verifier.referencesValidationSetting = ReferencesValidationSetting.VALID_OR_UNKNOWN_IDENTITY; verifier.revocationCheckSetting = RevocationCheckSettings.NEVER; verifier.useSystemTrustStore = true; //Add listeners to handle results verifier.addEventListener(Event.COMPLETE, verificationComplete); verifier.addEventListener(ErrorEvent.ERROR, verificationError);
addCertificate | () | 方法 |
public function addCertificate(cert:ByteArray, trusted:Boolean):*
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
添加 x509 证书以构建链。
添加的证书必须是 DER 编码的 x509 证书。
如果 trusted
参数为 true
,则将证书视为信任锚记。
注意:XML 签名可能包括用于构建签名者的证书链的证书。XMLSignatureValidator 类使用这些证书构建链,但不作为受信任的根(默认情况下)。
参数
cert:ByteArray — 包含 DER 编码的 x509 数字证书的 ByteArray 对象。
| |
trusted:Boolean — 设置为 true 可将此证书指定为信任锚记。
|
* |
引发
IllegalOperationError — 如果在正在验证签名时调用。
|
示例 ( 如何使用本示例 )
import flash.utils.ByteArray; var verifier:XMLSignatureValidator = new XMLSignatureValidator(); var certificate:ByteArray = new ByteArray(); var certFile:File = new File("certificate.cer"); var certFileStream:FileStream = new FileStream(); certFileStream.open(certFile, FileMode.READ); certFileStream.readBytes(certificate, 0, certFileStream.bytesAvailable); verifier.addCertificate(certificate, true);
verify | () | 方法 |
public function verify(signature:XML):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
验证指定的签名。
验证是异步进行的。验证成功完成时,XMLSignatureValidator 对象将调度 complete
事件,或者由于错误无法完成验证时将调用 error
事件。
无法取消验证过程。当验证过程正在进行时,对 verify()
方法的后续调用将失败。在当前验证检查完成后,可以再次调用 verify()
方法。
注意:由于 XMLSignatureValidator 只能实现“W3C Recommendation for XML Signature Syntax and Processing”(W3C 推荐的 XML 签名语法和处理标准)的一个子集,因此无法验证所有有效的 XML 签名。
参数
signature:XML — 要验证的 XML 签名。
|
事件
complete: — 在成功完成验证时调度。
| |
error: — 验证引用遇到错误时调度。
|
引发
IllegalOperationError — 如果在正在验证签名时调用。
| |
Error — 遇到其他错误时,如格式不正确的 XML 或签名文件中不支持的元素。
|
示例 ( 如何使用本示例 )
verify()
方法验证该签名。(此示例假定该 IURIDereferencer 实现适合于该签名。)
import flash.filesystem.File; import flash.filesystem.FileStream; import com.example.SignedMessageDereferencer; //Your IURIDereferencer implementation const xmlSignatureNS:Namespace = new Namespace( "http://www.w3.org/2000/09/xmldsig#" ); var verifier:XMLSignatureValidator = new XMLSignatureValidator(); verifier.uriDereferencer = new SignedMessageDereferencer(); var signatureFile:File = new File( "path/to/XMLSignatureDocument.xml" ); var sigFileStream:FileStream = new FileStream(); sigFileStream.open( signatureFile, FileMode.READ ); var xmlDoc:XML = XML( sigFileStream.readUTFBytes(sigFileStream.bytesAvailable) ); var xmlSig:XML = XML( xmlDoc..xmlSignatureNS::Signature ); verifier.verify( xmlSig );
complete | 事件 |
flash.events.Event
属性 Event.type =
flash.events.Event.COMPLETE
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
在完成验证时调度。
complete
事件并不意味着签名有效。检查 XMLSignatureValidator 对象的 validityStatus
属性来确定签名验证的结果。
Event.COMPLETE
常量定义 complete
事件对象的 type
属性值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false |
cancelable | false ;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
target | 已完成加载的网络对象。 |
示例 ( 如何使用本示例 )
private function verificationComplete(event:Event):void{ var validator:XMLSignatureValidator = event.target as XMLSignatureValidator; trace("Digest status: " + validator.digestStatus); trace("Identity status: " + validator.identityStatus); trace("Reference status: " + validator.referencesStatus); trace("Signature status: " + validator.validityStatus); }
相关 API 元素
error | 事件 |
flash.events.ErrorEvent
属性 ErrorEvent.type =
flash.events.ErrorEvent.ERROR
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 |
由于错误而无法完成验证时调度。
定义error
事件对象的 type
属性值。
此事件具有以下属性:
属性 | 值 |
---|---|
bubbles | false |
cancelable | false ;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
target | 发生网络操作失败的对象。 |
text | 要显示为错误消息的文本。 |
示例 ( 如何使用本示例 )
private function verificationError(event:ErrorEvent):void{ trace("Verification error: " + event.text); }
SignatureValidatorExample.validateSignature( signatureFile )
来运行示例,同时传入引用要验证的 XML 签名文档的文件。
import flash.events.Event; import flash.filesystem.File; import flash.filesystem.FileStream; import flash.security.ReferencesValidationSetting; import flash.security.XMLSignatureValidator; import com.example.SignedMessageDereferencer; //A custom class implementing IURIDereferencer public class SignatureValidatorExample{ private var xmlSig:XML; private const signatureNS:Namespace = new Namespace( "http://www.w3.org/2000/09/xmldsig#" ); public static function validateSignature( signatureFile:File ):void{ try{ //Set up the XMLSignatureValidator var verifier:XMLSignatureValidator = new XMLSignatureValidator(); verifier.addEventListener( Event.COMPLETE, verificationComplete ); verifier.uriDereferencer = new SignedMessageDereferencer(); verifier.referencesValidationSetting = ReferencesValidationSetting.VALID_OR_UNKNOWN_IDENTITY; //Load the signed document var sigFileStream:FileStream = new FileStream(); sigFileStream.open( signatureFile, FileMode.READ ); var xmlDoc:XML = XML( sigFileStream.readUTFBytes(sigFileStream.bytesAvailable) ); //Get the last Signature element in the document if( xmlDoc.name().localName != "Signature" ){ var signatureList:XMLList = xmlDoc..signatureNS::Signature; xmlSig = XML( signatureList[ signatureList.length()-1 ] ); } else{ xmlSig = xmlDoc; } //Validate the signature verifier.verify( xmlSig ); }catch (e:Error){ statusDisplay.text = "Verification error.\n" + e; } } private static function verificationComplete(event:Event):void{ trace( "Signature Validity: " + verifier.validityStatus ); trace( "Digest validity: " + verifier.digestStatus ); trace( "Certificate validity: " + verifier.identityStatus ); trace( "Data validity: " + verifier.referencesStatus ); } }
Tue Jun 12 2018, 11:04 AM Z