// UnmarshalDigitallySigned reconstructs a DigitallySigned structure from a Reader func UnmarshalDigitallySigned(r io.Reader) (*DigitallySigned, error) { var h byte if err := binary.Read(r, binary.BigEndian, &h); err != nil { return nil, fmt.Errorf("failed to read HashAlgorithm: %v", err) } var s byte if err := binary.Read(r, binary.BigEndian, &s); err != nil { return nil, fmt.Errorf("failed to read SignatureAlgorithm: %v", err) } sig, err := readVarBytes(r, SignatureLengthBytes) if err != nil { return nil, fmt.Errorf("failed to read Signature bytes: %v", err) } return &DigitallySigned{ Algorithm: tls.SignatureAndHashAlgorithm{ Hash: tls.HashAlgorithm(h), Signature: tls.SignatureAlgorithm(s)}, Signature: sig, }, nil }
func TestMarshalDigitallySigned(t *testing.T) { b, err := MarshalDigitallySigned( DigitallySigned{ Algorithm: tls.SignatureAndHashAlgorithm{ Hash: tls.SHA512, Signature: tls.ECDSA}, Signature: []byte("signature")}) if err != nil { t.Fatalf("Failed to marshal DigitallySigned struct: %v", err) } if b[0] != byte(tls.SHA512) { t.Fatalf("Expected b[0] == SHA512, but found %v", tls.HashAlgorithm(b[0])) } if b[1] != byte(tls.ECDSA) { t.Fatalf("Expected b[1] == ECDSA, but found %v", tls.SignatureAlgorithm(b[1])) } if b[2] != 0x00 || b[3] != 0x09 { t.Fatalf("Found incorrect length bytes, expected (0x00, 0x09) found %v", b[2:3]) } if string(b[4:]) != "signature" { t.Fatalf("Found incorrect signature bytes, expected %v, found %v", []byte("signature"), b[4:]) } }