XUSSPKI ;ISF/RWF - Kernel Security Services PKI ;02/04/2003 13:19 [ 07/29/2004 9:01 AM ]
;;8.0;KERNEL;**283**;Jul 10, 1995
;;
Q ;No entry from top
;Supported by IA # 3539
;This is a M api to store the Digital Signature in file 8980.2
STORESIG(XU1,XU2,XU3,XU4,XU5) ;Store the signature.
;XU1 is the hash
;XU2 is the string length
;XU3 is an array for the sig
;XU4 is the DUZ of the signer
;XU5 is the file that holds the data.
;Returns 1 if filed OK, "-1^message" if an error.
N FDA,IEN,CNT,ROOT
I $$FIND1^DIC(8980.2,,"X",XU1)>0 Q "-1^Dup Hash"
I $G(XU4)<.5 Q "-1^No DUZ"
I $G(XU5)="" Q "-1^No File Number"
S CNT=0,ROOT="XU3"
F S ROOT=$Q(@ROOT) Q:ROOT="" S CNT=CNT+$L(@ROOT)
I CNT'=XU2 Q "-1^BAD SIG LENGTH"
S FDA(8980.2,"+1,",.01)=XU1
S FDA(8980.2,"+1,",.02)=XU2
S FDA(8980.2,"+1,",.03)=XU4
S FDA(8980.2,"+1,",.04)=XU5
S FDA(8980.2,"+1,",1)="XU3"
D UPDATE^DIE("S","FDA","IEN")
I $D(^TMP("DIERR",$J)) Q "-1^DBS Error"
Q 1
;
;Supported by IA # 3539
CRLURL(XU1) ;Store the URL for the CRL
;Store each URL as a separte record
N FDA,IEN,CNT,NOW,X,Y,ERR
S ERR=0,NOW=$$NOW^XLFDT
F CNT=1:1 S X=$P(XU1,$C(9),CNT) Q:X="" D
. S Y=$$LOW^XLFSTR($E(X,1,4))
. I '((Y="http")!(Y="ldap")) Q
. S FDA(8980.22,"?+"_CNT_",",.01)=X
. S FDA(8980.22,"?+"_CNT_",",1)=NOW
. D UPDATE^DIE("S","FDA","IEN")
. I $D(^TMP("DIERR",$J)) S ERR=1
. Q
Q $S('ERR:1,1:"-1^DBS Error")
;
;Supported by IA # 3539
VERIFY(XU1,XU2,XU3) ;Veryify the data
;The HASH is in XU1
;The data root is in XU2
;(optional) Date to check against
N CNT,IEN,SD,DR,R,V,ZX K ^TMP("PKI",$J),^TMP("pki",$J)
S IEN=$$FIND1^DIC(8980.2,,"X",XU1)
I IEN'>0 Q "-1^FAIL TO FIND HASH"
S CNT=0,SD=$NA(^TMP("PKI",$J)),DR=$E(XU2,1,$L(XU2)-1)
;Load the data into the buffer
F S XU2=$Q(@XU2) Q:XU2'[DR S V=@XU2 I $L(V) D ADD(V)
D ADD("") ;Blank line between
;Load the Digital Signature into the buffer
F I=1:1 Q:'$D(^XUSSPKI(8980.2,IEN,1,I,0)) S V=^(0) I $L(V) D ADD(V)
;Then a Blank line and the Date.
D ADD(""),ADD($G(XU3))
;Send the buffer
S S=$$EN^XUSC1("DSIG",SD,$NA(ZX))
S R=$S(S<0:S,1:ZX(1))
Q R
ADD(V) ;Add to the send array
S CNT=CNT+1,@SD@(CNT)=V
Q
;
CRLUP ;Send any unsent CRL URL's to the server
;Server port is 10270
L ^XUSSPKI(8980.22,"AC"):1 I '$T Q ;Busy
N CNT,SD,FDA,IEN,LIM,NOW,X1,X2,X3 K ^TMP("PKI",$J),^TMP("XUSSPKI",$J)
;Only send for 300 days past last seen date
S X1=0,LIM=$$HTFM^XLFDT($H-300),CNT=0,NOW=$$NOW^XLFDT
S SD=$NA(^TMP("PKI",$J)),FDA=$NA(^TMP("XUSSPKI",$J))
F S X1=$O(^XUSSPKI(8980.22,X1)) Q:X1="" D
. S X2=$G(^XUSSPKI(8980.22,X1,0)),X2(1)=$P(X2,U,1),X2(2)=$P(X2,U,2),X2(3)=$P(X2,U,3) Q:'$L(X2(1))
. ;Only send http for now
. I "http:"'=$$LOW^XLFSTR($E(X2,1,5)) Q
. ;Check last seen, Last sent more than 3 hours ago.
. I (X2(2)<LIM)!($$FMDIFF^XLFDT(NOW,X2(3),2)<10800) Q
. D ADD(X2(1)) S @FDA@("8980.22",X1_",",2)=NOW
. Q
S S=-1 ;Init var, CNT update in ADD
;Send the buffer of CRL URL's
I CNT D
. S S=$$EN^XUSC1("CRL ",SD,$NA(X3))
. S @SD@("Result")=S_"^"_$G(X3(1))
. S S=$S(S<0:S,$G(X3(1))'="OK":"-3^"_$G(X3(1)),1:S)
I CNT,(S<0) D
. N XMB,XMY,XMTEXT,XMDUZ S XMB(1)=S,XMB(2)=$$FMTE^XLFDT(NOW),XMDUZ="CRL Upload Task"
. S XMB="XUSSPKI CRL SERVER" D ^XMB
. Q
I S'<0 D
. D FILE^DIE("K",FDA)
Q
TESTCRL ;TEST CRLUP
N FDA,LUD
S DA=0,RT=$NA(^XUSSPKI(8980.22)),LUD=$$HTFM^XLFDT(+$H_",120")
F S DA=$O(@RT@(DA)) Q:DA'>0 S FDA(8980.22,DA_",",2)=LUD
D FILE^DIE("K","FDA")
D CRLUP
W "Result: ",$G(^TMP("PKI",$J,"Result"))
Q
XUSSPKI ;ISF/RWF - Kernel Security Services PKI ;02/04/2003 13:19 [ 07/29/2004 9:01 AM ]
+1 ;;8.0;KERNEL;**283**;Jul 10, 1995
+2 ;;
+3 ;No entry from top
QUIT
+4 ;Supported by IA # 3539
+5 ;This is a M api to store the Digital Signature in file 8980.2
STORESIG(XU1,XU2,XU3,XU4,XU5) ;Store the signature.
+1 ;XU1 is the hash
+2 ;XU2 is the string length
+3 ;XU3 is an array for the sig
+4 ;XU4 is the DUZ of the signer
+5 ;XU5 is the file that holds the data.
+6 ;Returns 1 if filed OK, "-1^message" if an error.
+7 NEW FDA,IEN,CNT,ROOT
+8 IF $$FIND1^DIC(8980.2,,"X",XU1)>0
QUIT "-1^Dup Hash"
+9 IF $GET(XU4)<.5
QUIT "-1^No DUZ"
+10 IF $GET(XU5)=""
QUIT "-1^No File Number"
+11 SET CNT=0
SET ROOT="XU3"
+12 FOR
SET ROOT=$QUERY(@ROOT)
IF ROOT=""
QUIT
SET CNT=CNT+$LENGTH(@ROOT)
+13 IF CNT'=XU2
QUIT "-1^BAD SIG LENGTH"
+14 SET FDA(8980.2,"+1,",.01)=XU1
+15 SET FDA(8980.2,"+1,",.02)=XU2
+16 SET FDA(8980.2,"+1,",.03)=XU4
+17 SET FDA(8980.2,"+1,",.04)=XU5
+18 SET FDA(8980.2,"+1,",1)="XU3"
+19 DO UPDATE^DIE("S","FDA","IEN")
+20 IF $DATA(^TMP("DIERR",$JOB))
QUIT "-1^DBS Error"
+21 QUIT 1
+22 ;
+23 ;Supported by IA # 3539
CRLURL(XU1) ;Store the URL for the CRL
+1 ;Store each URL as a separte record
+2 NEW FDA,IEN,CNT,NOW,X,Y,ERR
+3 SET ERR=0
SET NOW=$$NOW^XLFDT
+4 FOR CNT=1:1
SET X=$PIECE(XU1,$CHAR(9),CNT)
IF X=""
QUIT
Begin DoDot:1
+5 SET Y=$$LOW^XLFSTR($EXTRACT(X,1,4))
+6 IF '((Y="http")!(Y="ldap"))
QUIT
+7 SET FDA(8980.22,"?+"_CNT_",",.01)=X
+8 SET FDA(8980.22,"?+"_CNT_",",1)=NOW
+9 DO UPDATE^DIE("S","FDA","IEN")
+10 IF $DATA(^TMP("DIERR",$JOB))
SET ERR=1
+11 QUIT
End DoDot:1
+12 QUIT $SELECT('ERR:1,1:"-1^DBS Error")
+13 ;
+14 ;Supported by IA # 3539
VERIFY(XU1,XU2,XU3) ;Veryify the data
+1 ;The HASH is in XU1
+2 ;The data root is in XU2
+3 ;(optional) Date to check against
+4 NEW CNT,IEN,SD,DR,R,V,ZX
KILL ^TMP("PKI",$JOB),^TMP("pki",$JOB)
+5 SET IEN=$$FIND1^DIC(8980.2,,"X",XU1)
+6 IF IEN'>0
QUIT "-1^FAIL TO FIND HASH"
+7 SET CNT=0
SET SD=$NAME(^TMP("PKI",$JOB))
SET DR=$EXTRACT(XU2,1,$LENGTH(XU2)-1)
+8 ;Load the data into the buffer
+9 FOR
SET XU2=$QUERY(@XU2)
IF XU2'[DR
QUIT
SET V=@XU2
IF $LENGTH(V)
DO ADD(V)
+10 ;Blank line between
DO ADD("")
+11 ;Load the Digital Signature into the buffer
+12 FOR I=1:1
IF '$DATA(^XUSSPKI(8980.2,IEN,1,I,0))
QUIT
SET V=^(0)
IF $LENGTH(V)
DO ADD(V)
+13 ;Then a Blank line and the Date.
+14 DO ADD("")
DO ADD($GET(XU3))
+15 ;Send the buffer
+16 SET S=$$EN^XUSC1("DSIG",SD,$NAME(ZX))
+17 SET R=$SELECT(S<0:S,1:ZX(1))
+18 QUIT R
ADD(V) ;Add to the send array
+1 SET CNT=CNT+1
SET @SD@(CNT)=V
+2 QUIT
+3 ;
CRLUP ;Send any unsent CRL URL's to the server
+1 ;Server port is 10270
+2 ;Busy
LOCK ^XUSSPKI(8980.22,"AC"):1
IF '$TEST
QUIT
+3 NEW CNT,SD,FDA,IEN,LIM,NOW,X1,X2,X3
KILL ^TMP("PKI",$JOB),^TMP("XUSSPKI",$JOB)
+4 ;Only send for 300 days past last seen date
+5 SET X1=0
SET LIM=$$HTFM^XLFDT($HOROLOG-300)
SET CNT=0
SET NOW=$$NOW^XLFDT
+6 SET SD=$NAME(^TMP("PKI",$JOB))
SET FDA=$NAME(^TMP("XUSSPKI",$JOB))
+7 FOR
SET X1=$ORDER(^XUSSPKI(8980.22,X1))
IF X1=""
QUIT
Begin DoDot:1
+8 SET X2=$GET(^XUSSPKI(8980.22,X1,0))
SET X2(1)=$PIECE(X2,U,1)
SET X2(2)=$PIECE(X2,U,2)
SET X2(3)=$PIECE(X2,U,3)
IF '$LENGTH(X2(1))
QUIT
+9 ;Only send http for now
+10 IF "http:"'=$$LOW^XLFSTR($EXTRACT(X2,1,5))
QUIT
+11 ;Check last seen, Last sent more than 3 hours ago.
+12 IF (X2(2)<LIM)!($$FMDIFF^XLFDT(NOW,X2(3),2)<10800)
QUIT
+13 DO ADD(X2(1))
SET @FDA@("8980.22",X1_",",2)=NOW
+14 QUIT
End DoDot:1
+15 ;Init var, CNT update in ADD
SET S=-1
+16 ;Send the buffer of CRL URL's
+17 IF CNT
Begin DoDot:1
+18 SET S=$$EN^XUSC1("CRL ",SD,$NAME(X3))
+19 SET @SD@("Result")=S_"^"_$GET(X3(1))
+20 SET S=$SELECT(S<0:S,$GET(X3(1))'="OK":"-3^"_$GET(X3(1)),1:S)
End DoDot:1
+21 IF CNT
IF (S<0)
Begin DoDot:1
+22 NEW XMB,XMY,XMTEXT,XMDUZ
SET XMB(1)=S
SET XMB(2)=$$FMTE^XLFDT(NOW)
SET XMDUZ="CRL Upload Task"
+23 SET XMB="XUSSPKI CRL SERVER"
DO ^XMB
+24 QUIT
End DoDot:1
+25 IF S'<0
Begin DoDot:1
+26 DO FILE^DIE("K",FDA)
End DoDot:1
+27 QUIT
TESTCRL ;TEST CRLUP
+1 NEW FDA,LUD
+2 SET DA=0
SET RT=$NAME(^XUSSPKI(8980.22))
SET LUD=$$HTFM^XLFDT(+$HOROLOG_",120")
+3 FOR
SET DA=$ORDER(@RT@(DA))
IF DA'>0
QUIT
SET FDA(8980.22,DA_",",2)=LUD
+4 DO FILE^DIE("K","FDA")
+5 DO CRLUP
+6 WRITE "Result: ",$GET(^TMP("PKI",$JOB,"Result"))
+7 QUIT