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$