The following comes from Page 54 of Revenue Canada 
Taxation  publication  MC42. ( Jan  1,85.  Machine 
computation of ......)
                              Keith (PC1155)

--------------------------------------------------

The Social Insurance Number contains nine  digits. 
The number consists of eight assigned digits, with 
the  ninth digit being constructed from the  first 
eight and acting as a check digit. The accuracy of 
transcription of the number may be verified  using 
the standard modulus 10 check digit formula.

Briefly,   the  check  digit  is  established   by 
considering the unit digit of the basic number and 
each  alternate  digit to the left to be  a  whole 
number.  This number is multiplied by two and  the 
digits  in the product and the intervening  digits 
which  were not inflated are cross added. The  sum 
is subtracted from the next highest number  ending 
in zero. The difference is the check digit.

For the purpose of verifying the Social  Insurance 
Number,   you  must  consider  the  basic   Social 
Insurance Number which consists of the first eight 
digits.  The example below may  better  illustrate 
the verication method.

                                                         Check
                                       Basic No.         Digit

Social Insurance Number provided
 in your employee's record . . . . . . 123 456 78           2

Make a number from unit position
 and each alternate position to the
 left . . . . . . . . . . . . . . . .   2  4 6  8

Add the number to itself  . . . . . .   2  4 6  8
                                       -----------
Sum . . . . . . . . . . . . . . . . .   4  9 3  6

Cross add the digits in the sum
 (4 + 9 + 3 + 6) = . . . . . . . . . . . . . . . . . . . . 22

Cross add intervening digits
 (1 + 3 + 5 + 7) = . . . . . . . . . . . . . . . . . . . . 16
                                                          ---
Total  . . . . . . . . . . . . . . . . . . . . . . . . . . 38

If the total is a multiple of 10, the check
digit is 0, otherwise subtract from the next
highest number ending in zero. . . . . . . . . . . . . . . 40

Check digit is . . . . . . . . . . . . . . . . . . . . . .  2

--------------------------------------------------

Below is a BASIC code fragment that checks the number entered.
Note that the number is a string.

   REM SIN$ IS THE NUMBER TO BE CHECKED
820    FAIL = 0
       IF LEN(SIN$) <> 9 THEN FAIL = 1 : GOTO 830
       IF VAL(SIN$) = 0 THEN FAIL = 1 : GOTO 830

   REM GET ALTERNATE DIGITS
       X$="" : X=0
       FOR Z%=1 TO 4
          X$=X$+MID$(SIN$,Z%*2,1)
       NEXT Z%

   REM MULTIPLY BY 2
       X$=STR$(VAL(X$)*2)

   REM CROSS ADD THE DIGITS
       FOR Z%=1 TO LEN(X$)
          X=X+VAL(MID$(X$,Z%,1))
       NEXT Z%

   REM ADD THE INTERVENING DIGITS
       FOR Z%=1 TO 7 STEP 2
          X=X+VAL(MID$(SIN$,Z%,1))
       NEXT Z%

   REM SUBTRACT FROM THE NEXT MULTIPLE OF 10
       X=(10-(X MOD 10)) MOD 10

   REM CHECK THE RESULT AGAINST THE LAST DIGIT OF THE SIN$
       IF X <> VAL(RIGHT$(SIN$,1)) THEN FAIL = 1

830   IF FAIL <> 0 THEN PRINT "BAD S.I.N. ";SIN$


��������������������������������������������������������������������������������������������������������������